部分常見問題處理html
Coredns CrashLoopBackOff 致使沒法成功添加工做節點的問題git
添加工做節點時提示token過時github
kubectl 執行命令報「The connection to the server localhost:8080 was refused」docker
網絡組件flannel沒法完成初始化api
部分節點沒法啓動pod 緩存
最後bash
結合咱們上篇文章(連接:集羣故障處理之處理思路以及聽診三板斧(三十三)的處理思路和手段,接下來咱們就進行一些實踐講解。服務器
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的有效時間爲24小時,若是集羣建立完成後沒有及時添加工做節點,那麼咱們須要從新生成token。相關命令以下所示:
#生成token kubeadm token generate #根據token輸出添加命令 kubeadm token create <token> --print-join-command --ttl=0
而後僅需複製打印出來的命令到工做節點執行便可。
做爲集羣管理的核心,工做節點上的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安裝完成後,經過命令查看時一直在初始化狀態,而且經過日誌輸出內容以下所示:
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沒法啓動(一直處於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)和羣裏請教,不過請教前,請給出你的診斷步驟和詳細的錯誤日誌。