Kubernetes在Ubuntu上的故障排查方法
kubectl get nodes -o wide
查看節點狀態、IP及Kubernetes版本,確認是否有節點處于NotReady
狀態;若節點異常,用kubectl describe node <節點名>
查看詳細事件(如kubelet未注冊、CNI插件未就緒)。kubectl get pods -n kube-system
查看系統組件Pod(如kube-apiserver
、etcd
、kube-controller-manager
)是否運行正常(Running
狀態),若有異常,用kubectl describe pod <組件-pod-name> -n kube-system
查看組件具體故障。systemctl status kubelet
確認kubelet服務是否運行;若未運行,用systemctl start kubelet
啟動;若啟動失敗,用journalctl -u kubelet -f
查看日志,重點關注證書過期、容器運行時異常(如containerd
未啟動)等問題。df -h /var/lib/kubelet
檢查kubelet數據目錄磁盤空間(建議保留至少10%空閑),free -m
查看內存使用(避免OOM導致Pod被殺死),top -p $(pgrep kubelet)
監控kubelet進程CPU占用;若磁盤空間不足,清理舊日志或未使用的鏡像。containerd
作為容器運行時,用systemctl status containerd
確認其運行狀態;用ctr containers list
查看容器列表,ctr logs <容器ID>
查看容器日志,排查容器運行時故障。ping <API-Server-IP>
測試到Kubernetes API Server的網絡連通性,用nc -zv <API-Server-IP> 6443
檢查API Server端口(默認6443)是否開放;若不通,檢查節點防火墻(ufw
或iptables
)規則或網絡配置。kubectl get pods -n kube-system -l k8s-app=calico-node
(以Calico為例)查看CNI插件Pod狀態,若為Error
,用kubectl logs <cni-pod-name> -n kube-system
查看插件日志,排查網絡插件配置錯誤或依賴問題(如kubelet
網絡配置不正確)。kubectl get networkpolicies
檢查是否有網絡策略限制了Pod或Service之間的通信;用cat /etc/resolv.conf
確認節點DNS配置正確(如指向CoreDNS的ClusterIP),避免DNS解析失敗。kubectl get pods --all-namespaces
列出所有Pod,重點關注STATUS
列(如Pending
表示調度失敗,CrashLoopBackOff
表示容器反復崩潰,Error
表示容器啟動失?。?。kubectl describe pod <pod-name> -n <namespace>
獲取Pod詳細信息,包括事件列表(如“Insufficient CPU”表示節點資源不足、“Failed to pull image”表示鏡像拉取失敗、“Unhealthy”表示健康檢查未通過),事件會明確提示故障原因。kubectl logs <pod-name> -c <container-name> -n <namespace>
查看容器日志(若容器已崩潰,添加--previous
查看前一次實例日志);日志中通常包含應用錯誤(如端口沖突、數據庫連接失?。?。kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/sh
(或/bin/bash
)進入容器,手動執行命令(如ls
查看文件、curl
測試服務、env
查看環境變量),排查應用層問題。docker pull <image>
測試鏡像是否存在)、資源請求與限制(resources.requests
不超過節點可用資源,避免OOMKilled
)、環境變量(env
字段中的變量是否正確)、卷掛載(volumeMounts
與volumes
配置是否匹配,持久卷是否存在)。kubectl describe service <service-name>
查看Service詳情,確認端口配置(spec.ports.port
為Service端口、targetPort
為容器端口、nodePort
為NodePort類型端口)是否正確,選擇器(spec.selector
)是否匹配目標Pod的標簽(如app: web
),類型(spec.type
)是否符合需求(如ClusterIP
用于內部訪問、NodePort
用于外部訪問)。kubectl get endpoints <service-name>
查看Service關聯的Pod IP和端口,若Endpoints為空,說明Service未正確選擇到Pod(需檢查選擇器與Pod標簽是否一致)。http://web-service.default
),需測試DNS解析是否正常:創建臨時Pod(kubectl run -it --rm --image=busybox:1.28.4 -- sh
),在Pod中執行nslookup <service-name>.<namespace>
(如nslookup web-service.default
),若解析失敗,需檢查CoreDNS服務。kubectl get pods -n kube-system
查看CoreDNS Pod狀態(應為Running
);若未運行,用kubectl logs <coredns-pod-name> -n kube-system
查看日志(如鏡像拉取失敗、配置文件錯誤);必要時重啟CoreDNS(kubectl delete pod <coredns-pod-name> -n kube-system
,Kubernetes會自動重建)。kubectl get networkpolicies
查看是否有網絡策略限制了Service訪問(如kubectl describe networkpolicy <policy-name>
查看規則);檢查CNI插件(如Calico、Flannel)是否正常運行(kubectl get pods -n kube-system | grep cni
),若插件異常,查看插件日志定位問題。openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
檢查kubelet客戶端證書有效期(若證書過期,需用kubeadm certs renew kubelet-client
續訂);用openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
檢查API Server證書有效期。dmesg -T | grep -i "oom\|error"
檢查內核日志中的OOM(內存不足)或硬件錯誤(如磁盤壞道),這些日志能幫助定位系統級故障(如Pod因OOM被殺死)。kubectl debug node/<節點名> -it --image=busybox
進入節點調試Pod,執行診斷命令(如ls /var/lib/kubelet
查看kubelet數據目錄、ps aux | grep kubelet
查看kubelet進程狀態),無需修改節點本身即可排查問題。kubeadm check
(kubeadm自帶工具)驗證集群配置是否正確(如證書、配置文件、組件狀態);或使用第三方工具(如sonobuoy
)運行端到端測試,全面檢查集群功能。