随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

Pod健康异常排查

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
    

四、排错流程图(保存到手机随时查看)

CrashLoopBackOff

Pending

ImagePullBackOff

Pod异常

查看Pod状态

检查容器日志

检查资源配额

检查镜像权限

检查应用错误/OOM

扩容节点/调整请求

配置镜像密钥

调整探针/资源限制


五、防患于未然:三大预防措施

  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

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

posted on   Leo-Yide  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示