Kubernetes 故障排查
Pod、节点、DNS、Service、Ingress、存储、权限和控制面常见故障排查。
Kubernetes 故障排查
Kubernetes 故障排查建议先确定影响范围,再按“应用对象、节点、网络、存储、权限、控制面”逐层定位。处理生产故障时,先保留现场信息,再做高风险操作。
快速巡检
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get events -A --sort-by='.lastTimestamp'
kubectl get componentstatuses
kubectl cluster-info
查看节点资源:
kubectl top nodes
kubectl top pods -A
查看控制面 Pod:
kubectl get pods -n kube-system -o wide
Pod 无法启动
kubectl get pod <pod-name> -n <namespace> -o wide
kubectl describe pod <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
按状态判断:
| 状态 | 排查方向 |
|---|---|
Pending | 资源不足、PVC、调度规则、污点容忍 |
ImagePullBackOff | 镜像地址、仓库权限、网络、节点 DNS |
CrashLoopBackOff | 应用日志、启动命令、配置、探针 |
CreateContainerConfigError | ConfigMap、Secret、环境变量引用 |
OOMKilled | 内存限制、应用内存峰值、运行时参数 |
节点 NotReady
kubectl describe node <node-name>
kubectl get events --field-selector involvedObject.kind=Node --sort-by='.lastTimestamp'
登录节点检查:
systemctl status kubelet
systemctl status containerd
journalctl -u kubelet -n 100
journalctl -u containerd -n 100
df -h
free -m
常见原因:
- kubelet 异常。
- containerd 异常。
- 节点磁盘压力、内存压力或 PID 压力。
- CNI 插件异常。
- 节点和控制面网络中断。
Service 不通
kubectl get svc <svc-name> -n <namespace> -o wide
kubectl get pod -n <namespace> -l app=<app> -o wide
kubectl get endpointslice -n <namespace> -l kubernetes.io/service-name=<svc-name>
kubectl describe svc <svc-name> -n <namespace>
调试:
kubectl run netshoot --image=nicolaka/netshoot -it --rm -- bash
dig <svc-name>.<namespace>.svc.cluster.local
curl -v http://<svc-name>.<namespace>.svc.cluster.local
curl -v http://<pod-ip>:<container-port>
重点检查:
- Service selector 是否匹配 Pod labels。
- EndpointSlice 是否为空。
port和targetPort是否正确。- Pod 是否 Ready。
- NetworkPolicy 是否阻断。
DNS 异常
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl get svc -n kube-system kube-dns
测试:
kubectl run dns-test --image=busybox:1.36 -it --rm -- nslookup kubernetes.default
常见原因:
- CoreDNS Pod 异常。
- kube-dns Service 不存在或 Endpoints 异常。
- 节点
/etc/resolv.conf异常。 - CNI 网络异常。
- 上游 DNS 不可用。
镜像拉取失败
kubectl describe pod <pod-name> -n <namespace>
节点侧检查:
crictl pull <image>
crictl images
journalctl -u containerd -n 100
排查方向:
- 镜像 tag 是否存在。
- 私有仓库 Secret 是否正确。
- 节点是否能访问仓库。
- 镜像仓库证书是否可信。
- containerd registry mirror 配置是否正确。
权限问题
kubectl auth can-i get pods -n default
kubectl auth can-i get secrets -n default
kubectl auth can-i get pods --as=system:serviceaccount:default:app-sa -n default
查看绑定:
kubectl get role,rolebinding -n default
kubectl get clusterrolebinding
kubectl describe rolebinding <name> -n default
重点确认报错中的 user、resource、verb、namespace。
存储挂载异常
kubectl describe pod <pod-name> -n <namespace>
kubectl get pvc,pv -n <namespace>
kubectl describe pvc <pvc-name> -n <namespace>
常见原因:
- PVC 未绑定。
- StorageClass 不存在。
- CSI 控制器或节点插件异常。
- 存储后端不可用。
- 挂载路径权限不正确。
控制面异常
查看 kube-system:
kubectl get pods -n kube-system -o wide
kubectl logs -n kube-system <apiserver-pod-name>
kubectl logs -n kube-system <controller-manager-pod-name>
kubectl logs -n kube-system <scheduler-pod-name>
控制面节点检查:
crictl ps -a
crictl logs <container-id>
journalctl -u kubelet -n 100
etcd 相关问题需要优先确认备份、磁盘空间、延迟和成员健康。
应急原则
- 先判断影响范围:单 Pod、单节点、单命名空间、全集群。
- 保留现场:事件、日志、YAML、节点状态和时间线。
- 优先恢复服务:扩副本、回滚、摘除异常节点、切换流量。
- 高风险操作二次确认:删除 PVC、重置节点、重启控制面、修改 CNI。
- 故障结束后补复盘:根因、检测、响应、修复和预防措施。