Ubuntu環境下Kubernetes(K8s)故障排查指南
使用kubectl get nodes
查看節點是否處于Ready狀態(若為NotReady
,需進一步排查)。通過kubectl describe node <節點名>
獲取節點詳細信息,重點關注Conditions
字段(如DiskPressure
磁盤壓力、MemoryPressure
內存壓力、PIDPressure
進程壓力等)。
檢查Kubernetes核心組件(kube-apiserver、etcd、kube-controller-manager等)的Pod狀態:kubectl get pods -n kube-system
。若組件Pod處于CrashLoopBackOff
、Pending
或Error
狀態,需通過kubectl logs <Pod名> -n kube-system
查看其日志。
確保kubeadm
、kubelet
、kubectl
版本一致(建議使用同一小版本,如1.27.x):kubeadm version && kubelet --version && kubectl version
。版本不兼容可能導致集群初始化或升級失敗。
kubelet是節點與集群通信的核心組件,需確保其運行正常:
systemctl status kubelet
:檢查服務是否啟動(若未啟動,執行systemctl start kubelet
);journalctl -u kubelet -f
:實時查看kubelet日志,重點關注證書過期(如kubelet-client-current.pem
)、容器運行時異常(如containerd
連接失?。?、節點資源不足(如磁盤空間耗盡)等問題。K8s默認使用containerd
作為容器運行時,需確認其狀態:
systemctl status containerd
:檢查服務是否運行;ctr containers list
:查看容器列表(確認容器是否正常啟動);ctr images list
:查看鏡像列表(確認鏡像是否拉取成功)。節點資源不足(磁盤、內存、CPU)會導致Pod無法調度或節點NotReady
:
df -h /var/lib/kubelet
:檢查kubelet數據目錄磁盤空間(建議保留至少10%空閑);free -m
:查看內存使用(若內存不足,K8s會觸發OOMKiller終止Pod);top
:監控系統進程資源占用(重點關注kubelet
、containerd
進程)。ping <目標IP>
:測試節點間網絡連通性(如Master到Node、Node到Pod CIDR);nc -zv <API-Server-IP> 6443
:檢查API Server端口(默認6443)是否開放(若無法連接,可能是防火墻或網絡插件問題)。CNI插件(如Calico、Flannel)負責Pod網絡,需確認其運行正常:
kubectl get pods -n kube-system -l k8s-app=calico-node
:查看CNI插件Pod狀態(應為Running
);kubectl logs <cni-pod-name> -n kube-system
:查看插件日志(若日志中出現failed to establish network
等錯誤,需重新配置CNI或修復網絡插件)。Pod無法解析Service名稱通常是DNS問題:
cat /etc/resolv.conf
:確認Pod內的DNS配置(默認指向集群DNS服務,如CoreDNS);kubectl get pods -n kube-system -l k8s-app=kube-dns
:檢查CoreDNS Pod狀態(若CoreDNS異常,需修復其配置或鏡像拉取問題)。kubectl get pods -A
:查看所有命名空間的Pod狀態(重點關注Pending
、CrashLoopBackOff
、Error
狀態的Pod);kubectl describe pod <Pod名> -n <命名空間>
:獲取Pod事件(如鏡像拉取失敗、資源不足、調度失?。┖蜖顟B詳情(如容器退出碼)。kubectl logs <Pod名> -c <容器名> -n <命名空間>
:查看容器日志(若Pod有多個容器,需指定-c
參數);kubectl logs -f <Pod名> -c <容器名>
:實時查看日志(用于排查運行時錯誤,如應用崩潰、數據庫連接失?。?。nginx:latest
是否存在),或配置私有倉庫憑證(imagePullSecrets
);kubectl logs
查看容器崩潰原因(如應用代碼錯誤、配置文件缺失),修復后重啟Pod;kubectl describe pod
查看原因(如資源不足、節點選擇器不匹配),調整Pod資源請求或擴容節點。kubectl get pvc -A
:查看持久化卷聲明(PVC)狀態(若為Pending
,說明未綁定PV);kubectl get pv
:查看持久化卷(PV)狀態(若為Available
,說明未被PVC綁定);kubectl describe pvc <PVC名> -n <命名空間>
:查看PVC綁定詳情(如存儲類storageClassName
是否正確)。kubectl describe pod <Pod名> -n <命名空間>
:查看Volumes
部分(確認卷是否掛載成功,如MountPath
是否正確);kubectl exec -it <Pod名> -n <命名空間> -- df -h
:進入Pod查看存儲卷掛載情況(若掛載失敗,可能是存儲類配置錯誤或后端存儲故障)。openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
:檢查kubelet客戶端證書有效期(若過期,需通過kubeadm certs renew kubelet-client-current.pem
續訂);openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
:檢查API Server證書有效期(若過期,需重新初始化集群或續訂證書)。若Node無法加入集群,可能是kubeadm join
使用的Token過期:
kubeadm token list
:查看Token列表(若無輸出或Token已過期,需生成新Token:kubeadm token create
);discovery-token-ca-cert-hash
:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
,替換kubeadm join
命令中的Token和Hash。通過kubectl debug
創建診斷容器,進入節點或Pod執行診斷命令(如ping
、traceroute
、nslookup
):
kubectl debug node/<節點名> -it --image=nicolaka/netshoot --target=<容器名>
:進入節點診斷(nicolaka/netshoot
包含常用網絡工具);kubectl debug -it <Pod名> --image=busybox --target=<容器名>
:進入Pod診斷(適用于容器內進程問題)。部署Prometheus+Grafana監控集群狀態(如節點資源、Pod狀態、網絡流量),設置閾值告警(如節點磁盤空間超過80%、Pod內存使用超過90%),及時發現潛在問題。