Kubernetes排错(十四):Pod状态异常排查手册

当你在凌晨三点收到告警,发现Pod在崩溃循环中挣扎时,如何快速定位问题?本文将为你梳理一套生产环境通用的Pod排错流程,并附上救火队员必备的实用命令清单!

一、5分钟快速定位:四步锁定问题方向

步骤1:查看Pod状态特征

复制代码
kubectl get pod -o wide
# 重点观察STATUS和RESTARTS列

常见状态解析表:

状态 含义 紧急程度
CrashLoopBackOff 容器持续崩溃重启 🔴 立刻处理
ImagePullBackOff 镜像拉取失败 🔴 立刻处理
Pending 调度失败 🟡 30分钟内处理
Evicted 节点资源不足被驱逐 🟡 30分钟内处理

步骤2:查看事件日志(90%问题可定位)

复制代码
kubectl describe pod <pod-name>
# 重点关注Events部分的Warning事件

步骤3:查看容器日志

复制代码
# 查看标准输出日志(适合Java/Python应用)
kubectl logs <pod-name> --tail=100

# 查看多容器中的指定容器日志
kubectl logs <pod-name> -c <container-name>

# 实时追踪日志流
kubectl logs <pod-name> -f

步骤4:快速进入调试模式

复制代码
# 进入容器Shell(需容器有shell环境)
kubectl exec -it <pod-name> -- sh

# 调试无Shell容器(使用临时调试镜像)
kubectl debug -it <pod-name> --image=nicolaka/netshoot
二、八大经典故障场景与破解之道

场景1:镜像拉取失败(ImagePullBackOff)

👉 排查命令

复制代码
# 查看镜像地址是否正确
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[].image}'

# 手动模拟拉取测试
docker pull <image-url>

场景2:OOM内存溢出(Exit Code 137)

👉 解决方案

复制代码
resources:
  limits:
    memory: "512Mi"  # 根据监控数据调整
  requests:
    memory: "256Mi"

场景3:存活探针配置不当

👉 调优示例

复制代码
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30  # 避免冷启动误杀
  periodSeconds: 5
  failureThreshold: 3      # 允许偶发故障

场景4:节点资源不足(Pending状态)

👉 诊断命令

复制代码
kubectl describe node | grep -A 10 Allocated
# 查看CPU/Memory/GPU分配情况

场景5:持久卷挂载失败

👉 排查流程

  1. 检查PVC状态 kubectl get pvc
  2. 验证StorageClass配置
  3. 查看Volume错误详情 kubectl describe pv <pv-name>

场景6:服务依赖故障

👉 网络连通性测试

复制代码
kubectl exec <pod-name> -- nc -zv mysql-service 3306
kubectl exec <pod-name> -- curl -I http://redis-service:6379

场景7:配置文件错误(ConfigMap/Secret)

👉 对比检查

复制代码
# 查看容器内挂载的配置文件
kubectl exec <pod-name> -- cat /etc/config/app.properties

# 对比集群中的ConfigMap
kubectl get configmap <cm-name> -o yaml

场景8:内核不兼容(CreateContainerError)

👉 典型场景

  • 容器要求内核版本 > 5.x
  • Seccomp安全策略限制
  • 缺失内核模块(如nfs.ko)
三、生产环境排错工具箱

1. 可视化神器推荐

  • K9s :终端可视化仪表盘

    复制代码
    brew install k9s && k9s
  • Lens:跨平台桌面管理工具

  • Octant:Web版集群浏览器

2. 高级诊断命令

复制代码
# 查看容器启动耗时
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[].state.waiting.reason}'

# 检查PID 1进程状态
kubectl exec <pod-name> -- ps aux

# 抓取容器内网络流量
kubectl debug <pod-name> --image=nicolaka/netshoot -- tcpdump -i eth0 -w /tmp/dump.pcap

3. 监控告警集成

  • Prometheus + Grafana看板指标:

    复制代码
    # 容器重启次数统计
    sum(kube_pod_container_status_restarts_total{namespace="$namespace"}) by (pod)
  • Alertmanager规则示例:

    复制代码
    - alert: PodCrashLoop
      expr: kube_pod_container_status_restarts_total > 3
      for: 5m
四、排错流程图(保存到手机随时查看)
五、防患于未然:三大预防措施
  1. 混沌工程演练

    复制代码
    # 使用Chaos Mesh模拟Pod故障
    kubectl apply -f network-delay-experiment.yaml
  2. 健康检查规范

    • 所有服务必须配置readinessProbe/livenessProbe
    • 关键服务增加startupProbe
  3. 资源监控基线

    复制代码
    # 设置HPA自动扩容
    kubectl autoscale deployment myapp --cpu-percent=80 --min=2 --max=10
结语

面对Pod故障,记住三个黄金法则:

  1. 先恢复再排查 - 优先通过副本数保障服务可用
  2. 日志是破案线索 - 善用日志收集系统(如ELK)
  3. 预防优于救火 - 建立完善的监控告警体系

现在,立刻执行以下检查:

复制代码
# 检查集群中所有异常Pod
kubectl get pods --field-selector=status.phase!=Running -A

记住:每个故障都是改进的机会,完善的故障复盘机制能让你的系统越挫越强!

相关推荐
运维-大白同学4 小时前
2025最全面开源devops运维平台功能介绍
linux·运维·kubernetes·开源·运维开发·devops
努力进修7 小时前
跨设备文件共享零烦恼!PicoShare+cpolar让跨设备传输更简单
云原生·eureka·cpolar
tianyuanwo8 小时前
多平台容器化RPM构建流水线全指南:Fedora、CentOS与Anolis OS
linux·运维·容器·centos·rpm
敲上瘾11 小时前
【探索实战】:Kurator分布式统一应用分发平台的全面解析与实践指南
分布式·容器·kubernetes·serverless
cui_win11 小时前
Docker Compose 部署一个完整的Prometheus监控告警系统
docker·容器·prometheus
roman_日积跬步-终至千里20 小时前
【Docker】Docker Stop 后到底发生了什么?——从信号机制到优雅停机
运维·docker·容器
喵手20 小时前
云端智变:基于 DevUI 与 MateChat 打造下一代云原生智能运维中台实战教学!
运维·云原生·devui·matechat
z***62621 小时前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat
Connie14511 天前
记一次K8s故障告警排查(Grafna告警排查)
云原生·容器·kubernetes·grafana
❀͜͡傀儡师1 天前
Docker部署视频下载器
docker·容器·音视频