本文記錄一下在部署 k8s 時遇到的一些問題及解決方法稼锅,具體部署流程可以參考 ubuntu 安裝 k8s 利凑。
從snap安裝導(dǎo)致的初始化問題
由于一開始我安裝的時候沒有配置好鏡像源掌挚,所以導(dǎo)致了apt
下載 k8s 三件套時出現(xiàn)了找不到對應(yīng)包的問題翰苫,再加上 ubuntu 又提示了一下 try sudo snap isntall kubelet ...
所以我就用snap
安裝了三件套囊嘉,使用的安裝命令如下:
snap install kubelet --classic
snap install kubeadm --classic
snap install kubectl --classic
雖然我在網(wǎng)上也找到了不少用snap
成功部署的例子,但是迫于技術(shù)不精笛求,最終實(shí)在是無法解決出現(xiàn)的問題,換用了apt
安裝之后就一帆風(fēng)順的安裝完成了。下面記錄一下用snap
安裝時出現(xiàn)的問題:
kubelet isn't running or healthy
使用kubeadm init
初始化時出現(xiàn)了下述錯誤探入,重復(fù)四次之后就超時退出了:
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
官方給出的解決方案是使用systemctl status kubelet
查看一下kubelet
的狀態(tài)狡孔。但是我運(yùn)行之后顯示未找到kubelet.service
,然后用如下命令查看啟動失敗的服務(wù):
systemctl list-units --failed
結(jié)果發(fā)現(xiàn)一個名為snap.kubelet.daemon.service
的服務(wù)無法啟動了蜂嗽,嘗試了各種方法都沒有讓它復(fù)活苗膝,無奈只好放棄用snap
安裝了。如果有大佬知道該怎么解決請告訴我植旧,不勝感激辱揭。下面就說一下遇到的其他問題。
初始化時的警告
在使用kubeadm init
命令初始化節(jié)點(diǎn)剛開始時病附,會有如下的perflight
階段问窃,該階段會進(jìn)行檢查,如果其中出現(xiàn)了如下WARNING
并且初始化失敗了完沪。就要回來具體查看一下問題了域庇。下面會對下述兩個警告進(jìn)行解決:
# kubeadm init ...
[init] Using Kubernetes version: v1.15.0
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[WARNING FileExisting-socat]: socat not found in system path
WARNING IsDockerSystemdCheck
修改或創(chuàng)建/etc/docker/daemon.json
,加入下述內(nèi)容:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
重啟docker
:
systemctl restart docker
查看修改后的狀態(tài):
docker info | grep Cgroup
WARNING FileExisting-socat
socat
是一個網(wǎng)絡(luò)工具覆积, k8s 使用它來進(jìn)行 pod 的數(shù)據(jù)交互听皿,出現(xiàn)這個問題直接安裝socat
即可:
apt-get install socat
節(jié)點(diǎn)狀態(tài)為 NotReady
使用kubectl get nodes
查看已加入的節(jié)點(diǎn)時,出現(xiàn)了Status
為NotReady
的情況宽档。
root@master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 NotReady master 152m v1.15.0
worker1 NotReady <none> 94m v1.15.0
這種情況是因?yàn)橛心承╆P(guān)鍵的 pod 沒有運(yùn)行起來尉姨,首先使用如下命令來看一下kube-system
的 pod 狀態(tài):
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-bccdc95cf-792px 1/1 Pending 0 3h11m
coredns-bccdc95cf-bc76j 1/1 Pending 0 3h11m
etcd-master1 1/1 Running 2 3h10m
kube-apiserver-master1 1/1 Running 2 3h11m
kube-controller-manager-master1 1/1 Running 2 3h10m
kube-flannel-ds-amd64-9trbq 0/1 ImagePullBackoff 0 133m
kube-flannel-ds-amd64-btt74 0/1 ImagePullBackoff 0 174m
kube-proxy-27zfk 1/1 Pending 2 3h11m
kube-proxy-lx4gk 1/1 Pending 0 133m
kube-scheduler-master1 1/1 Running 2 3h11m
如下,可以看到 pod kube-flannel
的狀態(tài)是ImagePullBackoff
吗冤,意思是鏡像拉取失敗了又厉,所以我們需要手動去拉取這個鏡像。這里可以看到某些 pod 運(yùn)行了兩個副本是因?yàn)槲矣袃蓚€節(jié)點(diǎn)存在了欣孤。
你也可以通過kubectl describe pod -n kube-system <服務(wù)名>
來查看某個服務(wù)的詳細(xì)情況馋没,如果 pod 存在問題的話,你在使用該命令后在輸出內(nèi)容的最下面看到一個[Event]
條目降传,如下:
root@master1:~# kubectl describe pod kube-flannel-ds-amd64-9trbq -n kube-system
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Killing 29m kubelet, worker1 Stopping container kube-flannel
Warning FailedCreatePodSandBox 27m (x12 over 29m) kubelet, worker1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "kube-flannel-ds-amd64-9trbq": Error response from daemon: cgroup-parent for systemd cgroup should be a valid slice named as "xxx.slice"
Normal SandboxChanged 19m (x48 over 29m) kubelet, worker1 Pod sandbox changed, it will be killed and re-created.
Normal Pulling 42s kubelet, worker1 Pulling image "quay.io/coreos/flannel:v0.11.0-amd64"
手動拉取鏡像
flannel
的鏡像可以使用如下命令拉到篷朵,如果你是其他鏡像沒拉到的話,百度一下就可以找到國內(nèi)的鏡像源地址了婆排,這里記得把最后面的版本號修改成你自己的版本声旺,具體的版本號可以用上面說的kubectl describe
命令看到:
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
等鏡像拉取完了之后需要把鏡像名改一下,改成 k8s 沒有拉到的那個鏡像名稱段只,我這里貼的鏡像名和版本和你的不一定一樣腮猖,注意修改:
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
修改完了之后過幾分鐘 k8s 會自動重試,等一下就可以發(fā)現(xiàn)不僅flannel
正常了赞枕,其他的 pod 狀態(tài)也都變成了Running
澈缺,這時再看 node 狀態(tài)就可以發(fā)現(xiàn)問題解決了:
root@master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 3h27m v1.15.0
worker1 Ready <none> 149m v1.15.0
工作節(jié)點(diǎn)加入失敗
在子節(jié)點(diǎn)執(zhí)行kubeadm join
命令后返回超時錯誤坪创,如下:
root@worker2:~# kubeadm join 192.168.56.11:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807
[preflight] Running pre-flight checks
error execution phase preflight: couldn't validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s
在master
節(jié)點(diǎn)上執(zhí)行kubeadm token create --print-join-command
重新生成加入命令,并使用輸出的新命令在工作節(jié)點(diǎn)上重新執(zhí)行即可姐赡。