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

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

相关推荐
LQ深蹲不写BUG16 小时前
微服务事务管理利器:Seata 核心原理与实践指南
微服务·云原生·架构
nathan052917 小时前
Kubernetes 实战练习指南
云原生·容器·kubernetes
無名之輩17 小时前
Nvidia Device Plugin入门二之envvar策略
kubernetes
云和数据.ChenGuang19 小时前
微服务技术栈
微服务·云原生·架构
syty202019 小时前
K8s是什么
容器·kubernetes·dubbo
江团1io020 小时前
微服务雪崩问题与系统性防御方案
微服务·云原生·架构
Evan Wang21 小时前
使用Terraform管理阿里云基础设施
阿里云·云原生·terraform
向上的车轮1 天前
基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
开发语言·云原生·golang
灵犀物润1 天前
Kubernetes 配置检查与发布安全清单
安全·容器·kubernetes
360智汇云1 天前
k8s交互桥梁:走进Client-Go
golang·kubernetes·交互