服务上线时Pod起不来是一个非常紧急且常见的问题。这时候需要一个快速、系统化的排查流程。以下是一个高效的问题排查指南,按照优先级顺序进行:
🚨 紧急排查流程图
graph TDA[Pod启动失败] --> B[第一步:快速状态检查<br>kubectl get pods]B --> C{分析Pod状态}C --> D[Pending]C --> E[ImagePullBackOff/ErrImagePull]C --> F[CrashLoopBackOff]C --> G[ContainerCreating<br>长时间卡住]D --> H[资源调度问题]E --> I[镜像拉取问题]F --> J[容器启动问题]G --> K[存储/配置问题]H --> L[检查资源配额、节点状态]I --> M[检查镜像地址、仓库认证]J --> N[查看容器日志]K --> O[检查PVC、ConfigMap]L & M & N & O --> P[第二步:详细诊断<br>kubectl describe pod]P --> Q[第三步:深入排查<br>根据错误信息针对性检查]
🔍 详细排查步骤
第一步:快速状态检查(30秒内完成)
# 1. 查看Pod基本状态
kubectl get pods -o wide
kubectl get pods --watch # 实时观察状态变化# 2. 如果有多个Pod,筛选出有问题的
kubectl get pods --field-selector=status.phase!=Running
重点关注STATUS列:
Pending
→ 调度问题ImagePullBackOff
/ErrImagePull
→ 镜像问题CrashLoopBackOff
→ 容器启动后崩溃ContainerCreating
(长时间) → 存储/配置问题
第二步:详细诊断(1-2分钟)
根据第一步的状态,使用describe命令获取详细信息:
# 查看Pod的详细事件和配置
kubectl describe pod <pod-name># 如果有多个容器,查看特定容器
kubectl describe pod <pod-name> | grep -A 20 -B 5 "Events"
重点查看Events部分,这里会告诉你根本原因。
第三步:根据具体状态深入排查
情况1:Pending
(调度问题)
# 检查资源配额
kubectl describe resourcequota -n <namespace># 检查节点资源
kubectl top nodes
kubectl describe nodes# 检查节点调度条件
kubectl get nodes -o wide
常见原因:
- 资源不足(CPU、内存)
- 节点有污点(taint)但Pod无对应容忍(toleration)
- 节点选择器(nodeSelector)不匹配
- 资源配额(ResourceQuota)用尽
情况2:ImagePullBackOff
/ErrImagePull
(镜像问题)
# 查看详细错误信息
kubectl describe pod <pod-name> | grep -i "error\|fail"# 检查镜像地址是否正确
kubectl get pod <pod-name> -o yaml | grep image:# 尝试手动拉取镜像(在节点上执行)
docker pull <image-name:tag>
常见原因:
- 镜像标签错误或不存在
- 私有仓库认证失败
- 网络问题无法访问仓库
- 镜像架构与节点不匹配
情况3:CrashLoopBackOff
(容器启动崩溃)
# 查看容器日志(最重要的信息!)
kubectl logs <pod-name>
kubectl logs <pod-name> --previous # 上一次的日志# 如果Pod有多个容器
kubectl logs <pod-name> -c <container-name># 实时查看日志
kubectl logs <pod-name> -f
常见原因:
- 应用配置错误(环境变量、配置文件)
- 依赖服务不可用(数据库、Redis等)
- 启动脚本错误
- 权限问题(文件系统权限、Linux能力)
情况4:ContainerCreating
(长时间卡住)
# 检查存储卷状态
kubectl get pvc -n <namespace>
kubectl describe pvc <pvc-name># 检查ConfigMap/Secret是否存在
kubectl get configmaps,secrets -n <namespace># 检查存储类(StorageClass)
kubectl get storageclass
常见原因:
- PVC无法绑定(存储类问题、容量不足)
- ConfigMap或Secret不存在
- 容器网络插件问题
第四步:环境依赖检查
如果应用依赖外部服务,需要检查:
# 检查Service是否正常
kubectl get services -n <namespace># 检查Endpoints是否就绪
kubectl get endpoints <service-name># 检查DNS解析(在Pod内执行)
kubectl exec -it <pod-name> -- nslookup <service-name>
kubectl exec -it <pod-name> -- ping <dependent-service># 检查网络连通性
kubectl exec -it <pod-name> -- curl -v http://dependent-service:port
第五步:快速应急措施
如果问题紧急,先恢复服务:
# 1. 回滚到上一个版本(如果使用Deployment)
kubectl rollout undo deployment/<deployment-name># 2. 扩容旧版本Pod(如果有旧版本运行)
kubectl scale deployment/<old-deployment> --replicas=3# 3. 临时调整资源限制(如果是资源问题)
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"app","resources":{"limits":{"cpu":"500m","memory":"512Mi"}}}]}}}}'
📋 上线前检查清单(预防措施)
为了避免上线时出现问题,建议建立检查清单:
# 1. 预拉取镜像
docker pull <new-image:tag># 2. 语法验证
kubectl apply --dry-run=client -f deployment.yaml
kubectl validate -f deployment.yaml# 3. 在测试环境验证
kubectl diff -f deployment.yaml # 查看与当前版本的差异# 4. 使用就绪探针和滚动更新策略
# 在Deployment中配置:
# readinessProbe:
# httpGet:
# path: /health
# port: 8080
# initialDelaySeconds: 10
# periodSeconds: 5# 5. 设置合理的资源请求和限制
🎯 关键排查技巧
- 从外到内:先看Pod状态,再看Events,最后看日志
- 时间顺序:关注Events中的时间线,找到第一个错误
- 对比法:与正常运行的Pod配置进行对比
- 隔离法:简化部署配置,排除非核心因素
记住:90%的问题可以通过kubectl describe pod
和kubectl logs
解决。保持冷静,按步骤排查,你一定能快速定位问题!