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

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

相关推荐
好吃的肘子2 小时前
ElasticSearch入门详解
java·大数据·elasticsearch·搜索引擎·云原生
alden_ygq3 小时前
Kubernetes生产实战(十九):镜像拉取失败排查处理
云原生·容器·kubernetes
hie988943 小时前
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
云原生·容器·kubernetes
may_一一5 小时前
Docker宿主机IP获取
tcp/ip·docker·容器
加勒比海涛5 小时前
微服务架构实战:从服务拆分到RestTemplate远程调用
微服务·云原生·架构
alden_ygq6 小时前
Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
java·安全·kubernetes
掘金-我是哪吒8 小时前
分布式微服务系统架构第128集:elastic-search安装部署
分布式·微服务·云原生·架构·系统架构
小马爱打代码13 小时前
K8S - 蓝绿发布实战 - Argo Rollouts 零停机方案解析
云原生·容器·kubernetes
檀越剑指大厂15 小时前
【Docker系列】docker inspect查看容器部署位置
运维·docker·容器