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应用日志、启动命令、配置、探针
CreateContainerConfigErrorConfigMap、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 是否为空。
  • porttargetPort 是否正确。
  • 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 相关问题需要优先确认备份、磁盘空间、延迟和成员健康。

应急原则

  1. 先判断影响范围:单 Pod、单节点、单命名空间、全集群。
  2. 保留现场:事件、日志、YAML、节点状态和时间线。
  3. 优先恢复服务:扩副本、回滚、摘除异常节点、切换流量。
  4. 高风险操作二次确认:删除 PVC、重置节点、重启控制面、修改 CNI。
  5. 故障结束后补复盘:根因、检测、响应、修复和预防措施。