Pod排查手册
一、快速诊断问题原因
1.1 检查 Pod 是否真实存在
命令1:kubectl get pods
命令说明:
| |
kubectl get:获取资源列表的基本命令pods:指定资源类型为 Pod- 默认范围:当前命名空间(由 kubeconfig 上下文决定)
- 无参数时:列出当前命名空间下所有 Pod 的名称、状态等基本信息
作用: 快速查看当前命名空间下是否存在目标 Pod,以及其当前状态(Running/Pending/CrashLoopBackOff 等)
输出解读:
| |
- READY:1/1 表示 1 个容器中有 1 个就绪
- STATUS:Running 表示正常运行
- RESTARTS:重启次数,0 表示未重启
- AGE:运行时长
如果输出为空: 说明当前命名空间下没有任何 Pod,或 Pod 名称拼写错误
命令2:kubectl get pods -A
命令说明:
| |
-A/--all-namespaces:全局查询,跨所有命名空间
作用: 当不确定 Pod 所在命名空间时,全局扫描所有命名空间下的 Pod 列表
典型输出:
| |
权限要求:
- 需要 ClusterRole 的
list权限对所有命名空间生效 - 生产环境默认用户通常只有特定 namespace 权限,执行
-A可能报 Forbidden
安全注意事项:
- 全局查询会暴露集群所有 Pod 信息,包括 kube-system 等系统组件
- 审计日志会记录此操作,遵守最小权限原则,非必要不使用
命令3:kubectl get pods -A | grep nginx
命令说明:
| |
|:Linux 管道符,将前一个命令的输出作为后一个命令的输入grep nginx:文本过滤,仅显示包含 “nginx” 的行
作用: 在全局 Pod 列表中快速定位包含特定关键词(如 nginx)的 Pod,应对不记得完整名称的场景
输出示例:
| |
预期结果分析:
- 列表为空 → Pod 从未创建,需进入"场景1"处理
- 有相似名称 → 可能是拼写错误(如 nginx-pod-7788ff99c6-abcde),进入"场景4"
- 在其他 namespace → 进入"场景2",需指定
-n参数
1.2 确认当前上下文与命名空间
命令4:kubectl config view --minify --output 'jsonpath={..namespace}'
命令说明:
| |
作用: 精准获取当前默认命名空间,避免因上下文切换错误导致的"找不到 Pod"问题
输出示例:
| |
空输出时:默认命名空间为 default
权限要求:
- 仅读取本地
~/.kube/config文件,无需集群权限 - 但配置文件需有可读权限(通常 600 或 644)
安全注意事项:
- kubeconfig 文件包含集群访问凭证,权限必须严格限制(建议 600)
- 不要在共享目录存放含有 token 的 kubeconfig
命令5:kubectl config get-contexts
命令说明:
| |
作用:
- 验证是否连接到正确的集群
- 上下文包含:集群地址、用户、命名空间三元组
- 活跃上下文标记为
*
输出示例:
| |
常见错误场景:
- 上下文指向 test 集群,但用户在 prod 集群查找 Pod
- 切换上下文命令:
kubectl config use-context prod-cluster
1.3 验证集群连接状态
命令6:kubectl cluster-info
命令说明:
| |
作用: 快速诊断 kubeconfig 配置是否正确、API Server 是否可达
正常输出:
| |
错误输出:
| |
→ kubeconfig 未配置或API Server 未启动
权限要求:
- 仅需匿名访问或最小只读权限
- 如果提示 Unauthorized,说明证书或 token 错误
命令7:kubectl get nodes
命令说明:
| |
作用:
- 验证集群基础设施状态
- 确保至少有一个 Ready 节点可供调度
典型输出:
| |
关键排查点:
- STATUS = NotReady:节点故障,所有 Pod 无法运行
- ROLES = master:是否为仅有 master 节点的单节点集群?
- NoSchedule 污点: master 节点默认有污点,普通 Pod 无法调度
二、针对性解决方案
场景 1:Pod 尚未创建(最常见)
命令8:kubectl run nginx-pod --image=nginx:1.25 --port=80
命令说明:
| |
kubectl run:快速创建 Pod/Deployment 的命令--image:指定容器镜像(Docker Hub 或私有仓库)--port:声明容器暴露的端口(仅作为文档,不实际创建 Service)--restart=Never:创建独立 Pod(默认会创建 Deployment)
作用: 在测试环境中快速拉起一个 Nginx 容器,验证集群基本功能
输出:
| |
权限要求:
- 需要 Role 权限:
pods/create - 生产环境通常禁止普通用户直接创建 Pod(通过 RBAC 限制)
安全注意事项:
- 镜像拉取策略:默认
IfNotPresent,可能拉取到被污染的镜像 - 镜像签名:生产环境应启用镜像签名验证(如 Cosign)
- 资源限制:未设置 limits,可能耗尽节点资源
命令9:YAML 方式创建 Pod
YAML 配置说明:
| |
作用:
- 声明式部署:YAML 是生产环境标准方式
- 版本控制:可放入 Git,实现 Infrastructure as Code
- 可复用性:便于修改和批量创建
创建命令:
| |
权限要求:
pods/create+pods/update(对于 apply)- 建议通过 CI/CD 流水线执行,禁止直接在生产集群手动 apply
命令10:kubectl get pods nginx-pod -w
命令说明:
| |
作用: 持续跟踪 Pod 状态,观察从 Pending → Running 的完整过程,快速定位卡在哪个阶段
典型输出流:
| |
状态分析:
- Pending:调度中,可能资源不足、镜像拉取中
- ContainerCreating:正在创建容器,可能拉取镜像慢
- Running:成功运行
排错提示:
若长时间卡在 Pending,立即执行 kubectl describe pod nginx-pod 查看 Events
场景 2:Pod 存在于其他命名空间
命令11:kubectl get pods -A --field-selector metadata.name=nginx-pod
命令说明:
| |
--field-selector:按字段精确过滤,比 grep 更高效(服务端过滤)
作用: 精准查询指定名称的 Pod 存在于哪个命名空间,避免 grep 误匹配
输出:
| |
权限要求:
- 需要 ClusterRole 的
list权限 - 普通用户可能报 Forbidden
命令12:kubectl logs nginx-pod -n project-a
命令说明:
| |
作用: 跨命名空间查看 Pod 日志,解决因 namespace 错误导致的日志查询失败
权限要求:
- 需要 Role 权限:
pods/log(在目标 namespace) - 即使
pods/get权限不足,只要显式指定-n且有pods/log权限即可
注意事项:
- 若忘记
-n,默认查询当前上下文 namespace,导致 NotFound - 最佳实践:总是显式指定
-n,避免依赖上下文
场景 3:Pod 已被删除
命令13:kubectl get events --field-selector involvedObject.name=nginx-pod
命令说明:
| |
作用: 回溯历史,查看 Pod 的完整生命周期事件,包括创建、调度、删除等
典型输出:
| |
关键事件:
- Deleted:明确显示 Pod 被删除
- Killing:容器被终止
权限要求:
- 需要 ClusterRole 的
events/list权限 - 事件默认保留 1 小时(可由
--event-ttl配置)
注意事项:
- 事件存储在 etcd,不支持长期审计,如需持久化需接入外部系统(如 ELK)
- 若未找到 Deleted 事件,可能 Pod 从未创建成功
场景 4:名称拼写错误
命令14:kubectl get pods -A | grep -i nginx
命令说明:
| |
作用: 模糊匹配 Pod 名称,快速找到相似名称,解决大小写、后缀差异问题
典型输出:
| |
后续操作:
| |
注意事项:
- grep 是客户端过滤,会先获取所有 Pod 再过滤,大集群性能差
- 生产环境建议使用
--field-selector替代 grep
三、查看日志的正确命令
命令15:kubectl logs nginx-pod
命令说明:
| |
作用: 获取 Pod 中容器的**标准输出(stdout)和标准错误(stderr)**日志
输出示例:
| |
权限要求:
- 需要 Role 权限:
pods/log - 默认 Role
edit包含此权限,view也包含
注意事项:
- 仅显示当前运行容器的日志,崩溃重启后旧日志丢失(需用
--previous) - 日志存储在节点
/var/log/pods/目录,受节点磁盘空间限制
命令16:kubectl logs -f nginx-pod
命令说明:
| |
作用:
持续监视日志输出,类似 tail -f,用于观察实时请求或调试线上问题
使用场景:
- 观察用户请求处理日志
- 监控错误发生时机
- 性能压测时实时查看
退出方式:
按 Ctrl+C 终止
权限要求:
同 pods/log,但会保持长连接,防火墙需允许 WebSocket 连接
注意事项:
- 长时间运行可能消耗较多网络带宽
- 若 Pod 重启,连接会中断,需重新执行命令
命令17:kubectl logs --tail=100 nginx-pod
命令说明:
| |
作用: 仅显示最后 N 行日志,避免全量日志刷屏,快速查看最新事件
输出: 直接输出最近的 100 条日志记录
对比:tail -f vs tail -n
--tail:静态输出最后 N 行-f:动态流式输出
权限要求:
同 pods/log
命令18:kubectl logs nginx-pod -c sidecar
命令说明:
| |
作用: 多容器 Pod 中,精确查看特定容器的日志(默认仅查看第一个容器)
使用场景:
- Sidecar 日志收集器(Fluentd)异常
- Istio 代理(envoy)日志
- 初始化容器(initContainer)日志
典型 Pod 结构:
| |
权限要求:
pods/log权限即可,无需额外配置
命令19:kubectl logs --previous nginx-pod
命令说明:
| |
作用: 查看上一个容器实例的日志(容器崩溃重启前的日志),诊断 CrashLoopBackOff 关键命令
输出示例:
| |
使用前提:
- Pod 必须至少重启过一次(RESTARTS > 0)
- kubelet 保留旧日志(默认保留,直到被新日志覆盖)
权限要求:
pods/log权限(部分集群需额外配置pods/log/previous)
注意事项:
- 若容器频繁重启(如每 10 秒),旧日志可能很快被覆盖
- 配合
kubectl describe pod查看 Restart Count 和 Last State
四、生产环境建议
4.1 避免手动创建 Pod
命令20:kubectl create deployment nginx-deploy --image=nginx:1.25 --replicas=2
命令说明:
| |
作用: 创建 Deployment 控制器,自动管理 Pod 副本,实现自愈、滚动更新、回滚
对比:Pod vs Deployment
| 特性 | 独立 Pod | Deployment |
|---|---|---|
| 自愈 | ❌ 删除后永久消失 | ✅ 自动重建 |
| 扩缩容 | 手动创建多个 | ✅ 一键扩缩 |
| 更新 | 手动删除重建 | ✅ 滚动更新 |
| 版本管理 | ❌ | ✅ 记录 revision |
| 生产推荐 | ❌ 仅测试 | ✅ 标准方式 |
底层机制:
- Deployment → ReplicaSet → Pod
- 删除 Pod 后,ReplicaSet 立即创建新 Pod 保证副本数
权限要求:
deployments/create、replicasets/create、pods/create- 生产环境应通过 CI/CD 执行,禁止手动创建
命令21:kubectl get pods -l app=nginx-deploy
命令说明:
| |
作用: 通过标签查询 Deployment 管理的所有 Pod,无需关心具体名称
输出示例:
| |
优势:
- 无需记忆自动生成的 Pod 后缀
- Deployment 更新后 Pod 名称变化,但标签不变
命令22:kubectl logs -l app=nginx-deploy
命令说明:
| |
作用: 聚合查询所有匹配标签的 Pod 日志,批量查看
权限要求:
pods/log权限 + 标签选择器范围
注意事项:
- 日志会交错输出,需配合
--prefix区分来源 - 单个 Pod 日志量大的场景慎用
4.2 常用别名与快捷方式
命令23:配置 Shell 别名
配置方法:
| |
作用: 提升效率,减少重复输入(运维高频操作)
生效方式:
| |
安全注意事项:
- 别名在共享环境(如 jump server)可能覆盖他人配置
- 脚本中禁用别名,应使用完整命令保证可移植性
4.3 调试技巧
命令24:kubectl describe pod nginx-pod
命令说明:
| |
作用: 获取 Pod 的详细状态信息,包括事件、资源、调度、网络等,是排查问题的首选命令
输出详解:
| 段落 | 关键信息 | 排查价值 |
|---|---|---|
| Name/Namespace | Pod 全称 | 确认查询对象正确 |
| Node | 所在节点 | 节点故障时定位 |
| Labels | 标签 | Service 是否匹配 |
| Annotations | 注解 | 审计、监控配置 |
| Status | Pod 阶段 | Pending/CrashLoopBackOff |
| IP | Pod IP | 网络连通性测试 |
| Containers | 容器状态 | 退出码、重启次数 |
| Events | 核心事件 | 调度失败、镜像拉取、启动错误 |
典型 Events 分析:
| |
权限要求:
- 需要
pods/get权限 - 节点信息需
nodes/get(系统组件事件)
五、快速检查清单
完整排查流程(含命令详解)
| |
生产环境标准排查命令集
| |
总结:kubectl get/describe/logs 是排查 Pod NotFound 的核心三剑客,理解每个命令的权限范围、命名空间上下文、输出含义,是 Kubernetes 运维的基本功。生产环境务必遵循最小权限、声明式部署、标签化管理三大原则。