Pod 启动失败或一直未就绪#
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
需要 kubectl 和目标命名空间的只读权限。先看事件及上一次容器日志,再决定是否重建,避免丢失证据。
1. 找到失败对象#
kubectl config current-context
export NS='orders'
kubectl -n "$NS" get deployments,pods -o wide
export POD='REPLACE_AFFECTED_POD'
kubectl -n "$NS" describe pod "$POD"
kubectl -n "$NS" get events --field-selector "involvedObject.kind=Pod,involvedObject.name=$POD" --sort-by=.metadata.creationTimestamp
kubectl -n "$NS" get pod "$POD" -o jsonpath='{range .status.containerStatuses[*]}{.name}{" ready="}{.ready}{" restarts="}{.restartCount}{" state="}{.state}{" last="}{.lastState}{"\n"}{end}'describe 和日志可能包含明文配置或业务数据,分享前脱敏。Pod 不存在时,检查 Deployment 及其 ReplicaSet 事件:配额、准入策略可能在创建 Pod 前就拒绝了请求。
2. 按事件选择分支#
| 现象 | 要找的证据 | 下一步 |
|---|---|---|
| Pending / FailedScheduling | 资源不足、污点、亲和性、卷所在可用区 | 核对调度约束与可用容量,不能只增加副本 |
| FailedCreatePodSandBox | 网络插件、地址池、节点运行时错误 | 集群网络;这是容器启动前的节点侧故障 |
| ErrImagePull / ImagePullBackOff | 镜像地址、权限、签名策略、平台架构 | 镜像与供应链;区分不存在与无权拉取 |
| CreateContainerConfigError | 不存在的 Secret、ConfigMap 或键名 | 核对对象是否存在及引用名,不导出 Secret 值 |
| Init 容器未完成 | initContainer 的状态、日志和依赖 | 查迁移、权限和依赖连接,不只看主容器 |
| CrashLoopBackOff | 上一次退出码、日志、探针事件 | 区分进程自行退出、探针杀死和内存超限 |
| OOMKilled | 内存限制、历史用量、节点压力 | OOM(Out Of Memory,内存不足);退出 137 本身不能单独证明 OOM |
| Running 但 Ready=false | readiness 探针、readiness gate、依赖 | 不要移除探针强行接流量;检查未就绪原因 |
| FailedMount / 卷 Pending | 卷事件、存储驱动、可用区、权限 | 生产排障;不要盲目强制分离卷 |
3. 看正确容器的日志与服务端点#
先从 describe 获取容器名;initContainer 也可通过 -c 选中。
export CONTAINER='REPLACE_CONTAINER_NAME'
kubectl -n "$NS" logs "$POD" -c "$CONTAINER" --since=15m --tail=100 --timestamps
kubectl -n "$NS" logs "$POD" -c "$CONTAINER" --previous --tail=100 --timestamps
export SERVICE='orders-api'
kubectl -n "$NS" get service "$SERVICE" -o yaml
kubectl -n "$NS" get endpointslices -l "kubernetes.io/service-name=$SERVICE" -o yaml--previous 只在存在上一次容器实例时有结果。服务端点为空或 ready=false,对照 Service selector、Pod 标签、探针和目标端口;端点就绪仍不可达,再查 NetworkPolicy 与网络链路。
4. 恢复与演练#
配置由 GitOps(以 Git 保存期望状态并自动协调)管理时,从配置仓库修复。对真实 Deployment 等待恢复:
export DEPLOYMENT='orders-api'
kubectl -n "$NS" rollout status "deployment/$DEPLOYMENT" --timeout=5m
kubectl -n "$NS" get pods -o wide超时不是自动回滚。确认副本就绪、重启次数不再增长,并通过 Service 执行业务验证。需要练习故障注入时,使用 隔离副本演练,完整记录“错误事件 → 原因 → 修复 → 验收”。
参考:Kubernetes 应用排障。