Ubuntu Kubernetes故障排查指南
在排查具體故障前,需先確認Ubuntu系統和Kubernetes基礎環境的穩定性:
sudo apt update && sudo apt upgrade確保Ubuntu系統為最新版本,避免因系統漏洞或兼容性問題引發故障。kubeadm version、kubelet --version、kubectl version檢查kubeadm、kubelet、kubectl的版本,確保三者兼容(如均支持同一Kubernetes版本)。sudo systemctl status kubelet確認kubelet服務是否運行;若未運行,用sudo systemctl start kubelet啟動;若啟動失敗,用sudo journalctl -u kubelet查看日志定位具體錯誤(如證書過期、配置文件損壞)。/etc/kubernetes/kubelet.conf或/var/lib/kubelet/config.yaml),確認--image-pull-progress-deadline、--runtime-request-timeout等參數設置合理(如避免鏡像拉取超時);同時用df -h檢查磁盤空間(建議保留至少10%空閑空間),防止磁盤滿導致Pod無法啟動。確認Kubernetes集群整體運行狀態是否正常:
kubectl cluster-info,查看Master節點API Server地址(如https://<Master-IP>:6443)和DNS服務(如CoreDNS)狀態;若無法訪問API Server,需檢查Master節點網絡或防火墻設置。kubectl get nodes查看所有節點狀態,若節點顯示為NotReady,用kubectl describe node <node-name>查看詳細事件(如kubelet未注冊、CNI插件未就緒);常見原因包括kubelet服務未啟動、網絡插件故障、節點資源不足。Pod是Kubernetes的核心運行單元,多數故障集中在Pod狀態異常(如Pending、CrashLoopBackOff、Error):
kubectl get pods --all-namespaces列出所有Pod,重點關注STATUS列(如Pending表示調度失敗,CrashLoopBackOff表示容器反復崩潰)。kubectl describe pod <pod-name> -n <namespace>獲取Pod的詳細信息,包括事件列表(如調度失敗、鏡像拉取失敗、健康檢查未通過);事件會明確提示故障原因(如“Insufficient CPU”表示節點資源不足,“Failed to pull image”表示鏡像拉取失?。?。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測試服務)排查應用層問題。docker pull <image>測試),標簽與配置一致;resources.requests(請求資源)和resources.limits(限制資源)設置合理(如不超過節點可用資源);env字段中的變量是否正確(如數據庫連接字符串);volumeMounts與volumes配置是否匹配(如持久卷是否存在)。若Pod運行正常但無法通過Service訪問,需檢查Service及網絡配置:
kubectl describe service <service-name>查看Service詳情,確認以下內容:
spec.ports.port(Service端口)、targetPort(容器端口)、nodePort(NodePort類型端口)是否正確;spec.selector是否匹配目標Pod的標簽(如app: web);spec.type(如ClusterIP、NodePort、LoadBalancer)是否符合需求。kubectl get endpoints <service-name>查看Service關聯的Pod IP和端口,若Endpoints為空,說明Service未正確選擇到Pod(需檢查選擇器與Pod標簽是否一致)。http://web-service),需測試DNS解析是否正常:
kubectl run -it --rm --image=busybox:1.28.4 -- sh;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 get pods -n kube-system | grep cni),若插件異常,需查看插件日志(kubectl logs <cni-pod-name> -n kube-system);kubectl run --rm -it --image=alpine ping <service-ip>測試到Service IP的連通性,用nslookup <service-name>測試DNS解析。若多個Pod或Service出現故障,需檢查Ubuntu節點本身的狀態:
kubectl top node查看節點CPU、內存使用情況,若資源使用率過高(如超過80%),需擴容節點(添加新節點)或優化Pod資源分配(調整resources.requests和resources.limits)。sudo journalctl -u kubelet -f實時查看kubelet日志,重點關注以下錯誤:
free -h查看內存使用情況,df -h查看磁盤空間,top查看CPU負載;若磁盤空間不足,清理無用文件(如/var/log下的舊日志);若內存不足,需增加節點內存或優化應用內存使用。