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)运行端到端测试,全面检查集群功能。