Ubuntu 上 Kubernetes 故障排查方法
一 基础状态与组件检查
kubectl get nodes -o wide、kubectl describe node <node>,关注 Ready、DiskPressure、MemoryPressure 等条件。kubectl get pods -n kube-system 检查 kube-apiserver、etcd、kube-controller-manager、kube-scheduler、coredns、kube-proxy 是否 Running。df -h /var/lib/kubelet、free -m、top -p $(pgrep kubelet);磁盘建议保留至少 10% 空闲,避免 kubelet 因磁盘满异常。systemctl status kubelet、journalctl -u kubelet -f(常见错误:证书过期、镜像拉取失败、容器运行时异常)。systemctl status containerd、crictl ps -a 或 ctr containers list 确认容器运行时与容器状态。ping <API-Server-IP>、nc -zv <API-Server-IP> 6443 验证 6443 端口连通性。kubeadm version、kubelet --version、kubectl version 确认组件版本匹配与兼容。二 Pod 与容器故障定位
kubectl get pods -A 观察 Pending、ImagePullBackOff、CrashLoopBackOff、Init:N/M 等状态。kubectl describe pod <pod> -n <ns> 聚焦 Events(调度失败、镜像拉取失败、健康检查失败等)。kubectl logs <pod> -c <container> -n <ns>,崩溃时用 --previous 查看上一次实例日志。kubectl exec -it <pod> -c <container> -n <ns> -- /bin/sh 进入容器;或用 kubectl debug 创建调试容器。kubectl describe node 与资源指标定位。readiness/liveness 探针配置排查应用错误与资源限制。三 Service 与网络连通性排查
kubectl get svc <svc> -o yaml 校验 ports.port/targetPort/nodePort 与 selector 是否匹配后端 Pod 标签。kubectl get endpoints <svc> 若为空,说明选择器未匹配或后端未就绪。curl <svc-ip>:<port> 验证 kube-proxy 规则是否生效。curl <NodeIP>:<nodePort> 或检查云厂商 EXTERNAL-IP 分配。kubectl run -it --rm --image=busybox:1.28.4 -- shnslookup <svc>.<ns>.svc.cluster.local,必要时用完全限定名;若失败,检查 CoreDNS 是否 Running 及其日志。kubectl get pods -n kube-system -l k8s-app=calico-node、kubectl logs <cni-pod> -n kube-system。kubectl get networkpolicies -A。四 节点级与系统层问题
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates;过期需续期或重新签发。dmesg -T | grep -i "oom\|error",排查 OOM、硬件/驱动异常。systemctl status containerd、crictl images 检查运行时健康与本地镜像缓存;必要时手动 crictl pull 验证仓库连通性。五 高频场景速查表
| 症状 | 优先命令 | 重点检查 | 常见修复 |
|---|---|---|---|
| 节点 NotReady | kubectl describe node <node> |
kubelet、CNI、资源、磁盘 | 启动/修复 kubelet;恢复 CNI;释放资源;扩容节点 |
| Pod Pending | kubectl describe pod <pod> -n <ns> |
调度约束、资源不足 | 调整 requests/limits;修正亲和性/污点;扩容节点 |
| ImagePullBackOff | kubectl describe pod <pod> -n <ns> |
镜像名/标签、凭据、网络 | 修正镜像;配置 imagePullSecrets;打通仓库网络 |
| CrashLoopBackOff | kubectl logs <pod> -c <c> -n <ns> --previous |
应用错误、探针、OOM | 修复应用;调整 liveness/readiness;增加内存 limit |
| Service 访问失败 | kubectl get endpoints <svc>、nslookup |
selector、Endpoints、kube-proxy、CNI | 对齐标签;检查 kube-proxy 与 CNI;放通安全组/防火墙 |
| DNS 解析失败 | nslookup <svc>.<ns>.svc.cluster.local |
CoreDNS 状态与日志 | 重启 CoreDNS;检查配置与上游 DNS;校验 resolv.conf |
以上流程覆盖 节点、Pod、Service、网络、系统 五个层面,按“从外向里、由易到难”的顺序执行,通常可快速定位并恢复大多数故障。