Kubernetes 常见报错速查
开发中常遇到的 Kubernetes 报错信息,快速定位原因和解决方案。
CrashLoopBackOff
出现场景:Pod 状态显示 CrashLoopBackOff,容器反复重启
原因:容器启动后立即退出或崩溃,K8s 不断尝试重启但持续失败。常见原因:应用配置错误、依赖服务不可达、OOM 被杀、启动命令错误
解决方案:
- kubectl logs <pod> --previous 查看崩溃前的日志
- kubectl describe pod <pod> 查看 Events 和退出码(Exit Code)
- Exit Code 1:应用错误,检查代码和配置
- Exit Code 137:OOM 被杀,增加 memory limits
- Exit Code 0:容器正常退出但 K8s 期望它持续运行,检查启动命令
- 检查环境变量和 ConfigMap/Secret 是否正确注入
- 确认依赖服务(数据库、Redis 等)是否可达
预防:配置合理的 resources.limits 防止 OOM;使用 initContainer 等待依赖就绪;配置 startupProbe 给慢启动应用更多时间
ImagePullBackOff / ErrImagePull
出现场景:Pod 创建后无法拉取容器镜像
原因:镜像拉取失败。常见原因:镜像名称或 tag 拼写错误、私有仓库缺少认证凭证、网络不通、镜像不存在
解决方案:
- kubectl describe pod <pod> 查看具体拉取错误信息
- 确认镜像名称和 tag 是否正确:docker pull <image> 本地测试
- 私有仓库需要创建 imagePullSecret:kubectl create secret docker-registry regcred --docker-server=xxx --docker-username=xxx --docker-password=xxx
- 在 Pod spec 中引用 secret:spec.imagePullSecrets[].name: regcred
- 检查节点是否能访问镜像仓库网络
- 如果用 latest tag,确认镜像确实存在且 imagePullPolicy 设置正确
预防:使用明确的镜像版本 tag 而非 latest;将 imagePullSecret 配置到 ServiceAccount 避免每个 Pod 都要指定;使用内网镜像仓库加速拉取
Pod 处于 Pending 状态
出现场景:Pod 创建后一直 Pending,无法被调度到任何节点
原因:调度器无法找到满足条件的节点。常见原因:集群资源不足(CPU/内存)、节点有污点但 Pod 没有容忍度、nodeSelector/affinity 无匹配节点、PVC 无法绑定
解决方案:
- kubectl describe pod <pod> 查看 Events 中的调度失败原因
- 资源不足:kubectl top nodes 查看节点使用率,考虑扩容节点或减少 requests
- 污点问题:kubectl describe nodes | grep Taints 查看节点污点,添加对应 tolerations
- 节点选择器:确认 nodeSelector 或 nodeAffinity 的标签在节点上存在
- PVC 问题:kubectl get pvc 检查 PVC 状态,确认 StorageClass 和可用 PV
- 检查 ResourceQuota 是否限制了命名空间的资源使用
预防:合理设置 requests 和 limits,不要过度申请资源;预留集群缓冲资源;配置 Cluster Autoscaler 自动扩容节点
OOMKilled (Exit Code 137)
出现场景:容器因内存超限被系统强制终止
原因:容器实际内存使用超过了 resources.limits.memory 设置的上限,被 Linux OOM Killer 终止
解决方案:
- kubectl describe pod <pod> 确认 Last State 显示 OOMKilled
- kubectl top pod <pod> --containers 查看实际内存使用
- 增加 memory limits:适当提高限制值
- 排查内存泄漏:检查应用是否有内存泄漏问题
- Java 应用:确认 JVM 堆内存设置(-Xmx)与 container limits 匹配
- Node.js 应用:设置 --max-old-space-size 与 limits 匹配
预防:压测确定应用真实内存需求后再设置 limits;limits 建议设为正常使用量的 1.5-2 倍;配置内存监控告警在 OOM 前发现问题
NodeNotReady
出现场景:节点状态显示 NotReady,节点上的 Pod 可能被驱逐
原因:kubelet 停止向 API Server 上报心跳。常见原因:节点宕机、kubelet 进程崩溃、网络分区、节点资源耗尽(磁盘/内存/PID)
解决方案:
- kubectl describe node <node> 查看 Conditions 和 Events
- SSH 登录节点检查 kubelet 状态:systemctl status kubelet
- 查看 kubelet 日志:journalctl -u kubelet --since '5 minutes ago'
- 检查节点资源:df -h(磁盘)、free -m(内存)、检查 PID 数量
- 磁盘压力:清理不用的镜像 docker system prune 或 crictl rmi --prune
- 重启 kubelet:systemctl restart kubelet
预防:配置节点监控和告警(磁盘/内存/CPU);定期清理无用镜像和日志;设置 eviction threshold 在资源耗尽前驱逐 Pod;使用多节点保证高可用