通用排查三步
# 1. 看 Pod 状态和事件
kubectl describe pod <pod> -n <ns>
# 2. 看日志(当前容器)
kubectl logs <pod> -n <ns>
# 3. 看上一次崩溃的日志
kubectl logs <pod> -n <ns> --previous
常见状态与根因
CrashLoopBackOff
容器反复启动失败。常见原因:
| 原因 | 排查方式 |
|---|---|
| 应用启动报错 | kubectl logs --previous |
| 配置错误 | 检查 ConfigMap / Secret 挂载 |
| 依赖未就绪 | 检查数据库、中间件连通性 |
| 探针失败 | 检查 livenessProbe / readinessProbe 参数 |
| OOM | kubectl describe pod 看 Last State |
Pending
Pod 无法调度到节点。常见原因:
# 看调度失败原因
kubectl describe pod <pod> -n <ns> | grep -A10 Events
- 资源不足:节点 CPU / 内存不够 →
kubectl describe node - 污点不匹配:节点有 taint,Pod 没容忍
- 亲和性限制:nodeAffinity / podAffinity 过严
- PVC 未绑定:
kubectl get pvc -n <ns>
OOMKilled
内存超限被杀:
kubectl describe pod <pod> -n <ns> | grep -i "last state" -A5
处理:
- 上调
resources.limits.memory - 排查应用内存泄漏
- 调整 JVM / 运行时堆参数
ImagePullBackOff
镜像拉不下来:
- 镜像名 / tag 写错
- 私有仓库未配置 imagePullSecrets
- 网络不通(节点无法访问镜像仓库)
# 测试节点能否拉取
kubectl get events -n <ns> --sort-by=.lastTimestamp
Evicted
节点资源压力导致 Pod 被驱逐:
kubectl describe node <node> | grep -i "memory pressure\|disk pressure"
清理节点磁盘或内存,检查是否有 Pod 没有设置 resources requests。
万能排查命令
# 全局事件(按时间排序)
kubectl get events -A --sort-by=.lastTimestamp | tail -30
# 资源占用
kubectl top pod -n <ns>
kubectl top node
# 查看 Pod 所在节点
kubectl get pod <pod> -n <ns> -o wide
小结
排障的核心顺序是:看状态 → 看事件 → 看日志 → 定位根因。不要一上来就重启 Pod,那样会丢失现场。