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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alden_ygq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值