Kubernetes Pod CrashLoopBackOff 排查

现象

Pod 反复启动失败,状态显示为 CrashLoopBackOff。这表示容器启动后很快退出,Kubelet 按退避策略不断重启它。

kubectl get pods -A

常见表现:

  • RESTARTS 持续增加。
  • kubectl logs 能看到应用启动错误。
  • 服务不可用或副本数不足。

环境

  • 集群:Kubernetes
  • 对象:Pod / Deployment / StatefulSet
  • 常用命令:kubectl logs, kubectl describe pod

排查过程

  1. 查看 Pod 状态和重启次数。
kubectl get pod <pod-name> -n <namespace> -o wide
  1. 查看当前容器日志。
kubectl logs <pod-name> -n <namespace>
  1. 查看上一次崩溃前的日志。
kubectl logs <pod-name> -n <namespace> --previous
  1. 查看 Pod 事件、探针失败、镜像和资源限制。
kubectl describe pod <pod-name> -n <namespace>
  1. 查看 YAML 配置。
kubectl get pod <pod-name> -n <namespace> -o yaml

常见根因

根因典型表现排查方向
应用启动失败日志中有异常堆栈检查配置、依赖、启动命令
环境变量缺失报配置项不存在检查 ConfigMap、Secret、env
启动命令错误容器立即退出检查 command、args、镜像入口
依赖服务不可达连接数据库、MQ、Redis 失败检查 Service、DNS、网络策略
探针配置不合理Liveness probe failed调整 initialDelay、path、timeout
OOMKilled退出原因是 OOM检查 limits、内存使用

解决方法

查看崩溃原因

kubectl logs <pod-name> -n <namespace> --previous
kubectl describe pod <pod-name> -n <namespace>

重点看:

  • Last State
  • Reason
  • Exit Code
  • Events

修复应用配置

kubectl get configmap -n <namespace>
kubectl get secret -n <namespace>
kubectl describe configmap <name> -n <namespace>

处理方式:

  • 补齐缺失配置。
  • 修正环境变量名。
  • 检查 Secret 是否挂载到正确路径。

修复探针问题

如果应用启动慢,但 liveness probe 太早触发,会导致容器刚启动就被杀。

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60
  timeoutSeconds: 5

处理方式:

  • 增大 initialDelaySeconds。
  • 区分 readiness 和 liveness。
  • 确认探针路径和端口正确。

修复 OOMKilled

kubectl describe pod <pod-name> -n <namespace>
kubectl top pod <pod-name> -n <namespace>

处理方式:

  • 提高内存 limit。
  • 优化应用内存占用。
  • 检查是否存在内存泄漏。

验证结果

kubectl get pod <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace>

确认点:

  • Pod 状态变为 Running。
  • RESTARTS 不再增加。
  • readiness probe 通过。
  • 业务接口恢复。

预防措施

  • 发布前检查 ConfigMap、Secret、启动命令。
  • 对探针设置合理延迟。
  • 对重启次数建立告警。
  • 应用启动日志要明确输出失败原因。
  • 资源 limits 按真实峰值评估。

相关笔记