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下的旧日志);若内存不足,需增加节点内存或优化应用内存使用。