目錄
部分常見問題處理
-
Coredns CrashLoopBackOff 導致無法成功添加工作節點的問題
-
添加工作節點時提示token過期
-
kubectl 執行命令報“The connection to the server localhost:8080 was refused”
-
網絡組件flannel無法完成初始化
-
部分節點無法啟動pod
最后
部分常見問題處理
結合我們上篇文章(鏈接:集群故障處理之處理思路以及聽診三板斧(三十三)的處理思路和手段,接下來我們就進行一些實踐講解。
Coredns CrashLoopBackOff 導致無法成功添加工作節點的問題
k8s集群安裝完成之后,當我們添加工作節點時,可能會在長久的等待之中而無任何進展,這時可以使用以下命令來查看k8s各個服務的狀態:
kubectl get pods -n kube-system -o wide
初步診斷容器崩潰,我們需要進一步查看日志,使用“kubectl logs”:
kubectl log -f coredns-5c98db65d4-8wt9z -n kube-system
這次我們獲得了以下具體錯誤:
github.com/coredns/coredns/plugin/kubernetes/controller.go:322: Failed to list *v1.Namespace: Get https://10.96.0.1:443/api/v1/namespaces?limit=500&resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host
解決方案:
這問題很有可能是防火牆(iptables)規則錯亂或者緩存導致的,可以依次執行以下命令進行解決:
systemctl stop kubelet systemctl stop docker iptables --flush iptables -tnat --flush systemctl start kubelet systemctl start docker
添加工作節點時提示token過期
集群注冊token的有效時間為24小時,如果集群創建完成后沒有及時添加工作節點,那么我們需要重新生成token。相關命令如下所示:
#生成token kubeadm token generate #根據token輸出添加命令 kubeadm token create <token> --print-join-command --ttl=0

然后僅需復制打印出來的命令到工作節點執行即可。
kubectl 執行命令報“The connection to the server localhost:8080 was refused”
作為集群管理的核心,工作節點上的kubectl可能一上來就跪了,如下圖所示:
出現這個問題的原因是kubectl命令需要使用kubernetes-admin的身份來運行,在“kubeadm int”啟動集群的步驟中就生成了“/etc/kubernetes/admin.conf”。
因此,解決方法如下,將主節點中的【/etc/kubernetes/admin.conf】文件拷貝到工作節點相同目錄下:
#復制admin.conf,請在主節點服務器上執行此命令 scp /etc/kubernetes/admin.conf 172.16.2.202:/etc/kubernetes/admin.conf scp /etc/kubernetes/admin.conf 172.16.2.203:/etc/kubernetes/admin.conf
然后分別在工作節點上配置環境變量:
#設置kubeconfig文件 export KUBECONFIG=/etc/kubernetes/admin.conf echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
接下來,工作節點就正常了,如:
網絡組件flannel無法完成初始化
網絡組件flannel安裝完成后,通過命令查看時一直在初始化狀態,並且通過日志輸出內容如下所示:
kubectl get pods -n kube-system -o wide kubectl logs -f kube-flannel-ds-amd64-hl89n -n kube-system
具體錯誤日志為:
Error from server: Get https://172.16.2.203:10250/containerLogs/kube-system/kube-flannel-ds-amd64-hl89n/kube-flannel?follow=true: dial tcp 172.16.2.203:10250: connect: no route to host
這時,我們可以登錄節點所在的服務器,使用以下命令來查看目標節點上的kubelet日志:
journalctl -u kubelet -f
注意:journalctl工具可以查看所有日志,包括內核日志和應用日志。
通過日志,我們發現是鏡像拉取的問題。對此,大家可以參考上文中鏡像拉取的方式以及重命名鏡像標簽來解決此問題,當然也可以通過設置代理來解決此問題。
部分節點無法啟動pod
有時候,我們部署了應用之后,發現在部分工作節點上pod無法啟動(一直處於ContainerCreating的狀態):
通過排查日志最終我們得到重要信息如下所示:
NetworkPlugin cni failed to set up pod "demo-deployment-675b5f9477-hdcwg_default" network: failed to set bridge addr: "cni0" already has an IP address different from 10.0.2.1/24
這是由於當前節點之前被反復注冊,導致flannel網絡出現問題。可以依次執行以下腳本來重置節點並且刪除flannel網絡來解決:
kubeadm reset #重置節點 systemctl stop kubelet && systemctl stop docker && rm -rf /var/lib/cni/ && rm -rf /var/lib/kubelet/* && rm -rf /var/lib/etcd && rm -rf /etc/cni/ && ifconfig cni0 down && ifconfig flannel.1 down && ifconfig docker0 down && ip link delete cni0 && ip link delete flannel.1 systemctl start docker
執行完成后,重新生成token並注冊節點即可,具體可以參考上文內容。
最后
在k8s集群的部署過程中或者過后,大家可能會遇到很多問題。這也是本地部署k8s集群遇到的最大的挑戰質疑,因此本篇筆者講述了問題處理思路和常見錯誤,希望能夠給予大家幫助。
如果通過詳細異常和和日志還是無法推斷出具體錯誤,建議大家可以根據具體信息在“https://stackoverflow.com”網站上進行搜索,也可以在相關社交網站(比如github)和群里請教,不過請教前,請給出你的診斷步驟和詳細的錯誤日志。