本文是一份 Kubernetes 常见故障排查实战手册,适用于:
- 日常生产环境运维排障
- 运维 / SRE / 云原生岗位面试
- 内部技术 Wiki
内容围绕 Pod、Service、Node、存储、镜像、集群性能、etcd 等核心组件,系统梳理排障思路与关键命令,强调 “先看状态 → 再看事件 → 最后定位根因” 的工程化方法。如果你对 运维/DevOps/SRE 的实战技能感兴趣,不妨在 云栈社区 与更多同行交流探讨。
Pod 一直处于 Pending 状态
典型现象
- Pod 创建成功但长时间不运行
kubectl get pod 显示状态为 Pending
- Pod 未被调度到任何节点
核心排查思路
Pending 本质上是 调度阶段失败,重点关注 调度器(scheduler) 的决策结果。
排查步骤
查看调度失败原因(最关键)
kubectl describe pod <pod-name>
重点查看 Events 区域,调度失败原因都会在这里体现。
常见事件信息
0/3 nodes are available
Insufficient cpu / memory
node(s) had taint
pod has unbound immediate PersistentVolumeClaims
查看节点资源情况
kubectl top nodes
kubectl describe node <node-name>
重点关注:
- CPU / 内存是否已被分配完
- Allocated resources 是否接近上限
检查节点选择器与亲和性
kubectl get nodes --show-labels
kubectl get pod <pod-name> -o yaml | grep -E "nodeSelector|affinity"
查看集群调度事件
kubectl get events --field-selector reason=FailedScheduling
常见原因总结
- 节点资源不足(最常见)
- nodeSelector / nodeAffinity 配置错误
- 节点存在污点(Taint),Pod 未设置容忍
- PVC 未成功绑定
Pod 反复重启(CrashLoopBackOff)
典型现象
- Pod 状态为
CrashLoopBackOff
- 容器不断启动又退出
- Ready 状态始终为 0/1
排查核心
CrashLoopBackOff ≠ Kubernetes 故障,90% 是应用自身启动失败。
排查步骤
# 查看 Pod 当前状态
kubectl get pod <pod-name>
# 查看当前容器日志
kubectl logs <pod-name>
# 查看上一次崩溃的日志(非常关键)
kubectl logs <pod-name> --previous
# 查看 Pod 详细信息
kubectl describe pod <pod-name>
# 查看相关事件
kubectl get events --field-selector involvedObject.name=<pod-name>
高频原因与处理方式
| 场景 |
说明 |
解决思路 |
| 应用异常退出 |
程序启动即崩溃 |
修复代码 / 启动参数 |
| 配置错误 |
配置文件缺失或格式错误 |
检查 ConfigMap / Secret |
| 资源不足 |
OOMKilled |
调整 requests / limits |
| 健康检查失败 |
探针过于严格 |
延长 initialDelaySeconds |
Service 无法访问 Pod
典型现象
- Service 状态正常
- 访问 ClusterIP / NodePort 无响应
排查核心
Service 本身不转发流量,真正转发的是 Endpoints。
排查步骤
检查 Service 与 Endpoints
kubectl get svc <service-name>
kubectl get endpoints <service-name>
如果 Endpoints 为空,说明 Service 没有选中任何 Pod。
校验 Pod 标签与 Service Selector
kubectl get pods --show-labels
kubectl get svc <service-name> -o yaml
检查端口映射关系
kubectl get svc <service-name> -o yaml | grep -E "port|targetPort"
Pod 内部连通性测试
kubectl run test --image=busybox -it -- sh
wget -O- http://<service-name>:80
检查 NetworkPolicy
kubectl get networkpolicies
常见根因
- selector 与 Pod labels 不匹配(最常见)
- targetPort 与容器端口不一致
- Pod 未监听对应端口
- NetworkPolicy 拦截流量
Node 处于 NotReady 状态
典型现象
- 节点状态显示 NotReady
- 新 Pod 无法调度到该节点
排查主线
Node NotReady 通常是 kubelet 无法正常向 APIServer 汇报状态。
排查步骤
查看节点状态信息
kubectl get nodes
kubectl describe node <node-name>
登录节点检查 kubelet
systemctl status kubelet
journalctl -u kubelet -f
常见基础检查
# 容器运行时
systemctl status docker
# 或
systemctl status containerd
# 网络插件
kubectl get pods -n kube-system
# 磁盘空间
df -h
检查证书有效期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client.crt -noout -dates
常见原因
- kubelet 服务异常
- 容器运行时故障
- 网络插件异常(Calico / Flannel)
- 磁盘满或 inode 耗尽
- 证书过期(生产环境高频问题)
PVC 无法绑定(Pending)
现象说明
- PVC 长时间处于 Pending
- Pod 因存储问题无法启动
排查步骤
kubectl get pvc
kubectl describe pvc <pvc-name>
kubectl get pv
kubectl describe pv <pv-name>
kubectl get storageclass
kubectl describe storageclass <sc-name>
高频问题总结
- StorageClass 不存在或名称拼写错误
- PV 容量不足
- accessModes 不匹配(RWO / RWX)
- PV nodeAffinity 与 Pod 节点不一致
集群性能问题排查
资源维度排查
kubectl top nodes
kubectl top pods --all-namespaces
kubectl describe nodes | grep -A 5 "Allocated resources"
etcd 健康与性能
etcdctl endpoint health
DNS 性能验证
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
建议手段
- Prometheus + Grafana 进行长期监控
- Metrics Server 进行即时分析
镜像拉取失败(ImagePullBackOff)
排查步骤
kubectl describe pod <pod-name>
kubectl get pod <pod-name> -o yaml | grep image:
私有仓库认证示例
kubectl create secret docker-registry regcred \
--docker-server=<registry> \
--docker-username=<username> \
--docker-password=<password>
spec:
imagePullSecrets:
- name: regcred
常见原因
- 镜像名或 tag 错误
- 私有仓库未配置认证
- 节点无法访问镜像仓库
etcd 数据损坏与恢复
场景说明
- APIServer 无法启动
- 集群状态异常、资源大量消失
基于快照的恢复流程
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
--name etcd-0 \
--initial-cluster etcd-0=https://127.0.0.1:2380 \
--initial-advertise-peer-urls https://127.0.0.1:2380
systemctl restart kubelet
运维建议
- 定期自动备份 etcd 快照
- 快照应存放在独立节点或对象存储
故障排查方法论总结
推荐排查顺序:
状态 → Events → 日志 → 资源 → 配置 → 网络 → 存储 → 证书
这套 云原生/IaaS 环境下的通用思路:
- 覆盖 80% 以上的 Kubernetes 故障
- 同样适用于 面试求职 中的系统性回答