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事件(如镜像拉取失败、资源不足、调度失败)和状态详情(如容器退出码)。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%),及时发现潜在问题。