98·综合实战高级

故障排查

kubernetestroubleshootingdebugging

故障排查

学习目标

  1. 掌握 Kubernetes 故障排查的系统方法
  2. 学会使用调试工具和命令
  3. 理解常见问题的排查流程

核心概念

故障排查方法论

系统化排查流程:

1. 收集信息
   - 症状是什么?
   - 什么时候开始的?
   - 影响范围?

2. 定位层级
   - 集群层?Node 层?Pod 层?应用层?

3. 分析日志
   - kubectl describe
   - kubectl logs
   - 事件

4. 验证假设
   - 复现问题
   - 对比正常情况

5. 修复和验证
   - 应用修复
   - 验证效果

常见问题分类

┌─────────────────────────────────────────────────────────┐
│                 问题分类                                 │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │              Pod 层问题                           │  │
│  │  - CrashLoopBackOff                              │  │
│  │  - ImagePullBackOff                              │  │
│  │  - Pending                                       │  │
│  │  - OOMKilled                                     │  │
│  └──────────────────────────────────────────────────┘  │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │              Service 层问题                       │  │
│  │  - 无法访问服务                                   │  │
│  │  - 负载均衡异常                                   │  │
│  │  - DNS 解析失败                                   │  │
│  └──────────────────────────────────────────────────┘  │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │              Node 层问题                          │  │
│  │  - NotReady                                      │  │
│  │  - 资源不足                                       │  │
│  │  - 磁盘/网络问题                                  │  │
│  └──────────────────────────────────────────────────┘  │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │              集群层问题                           │  │
│  │  - API Server 异常                                │  │
│  │  - etcd 问题                                      │  │
│  │  - 证书过期                                       │  │
│  └──────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────┘

实践练习

练习 1:Pod 启动失败排查

# 症状:Pod 处于 CrashLoopBackOff 状态

# 步骤 1:查看 Pod 状态
kubectl get pods
kubectl describe pod <pod-name>

# 步骤 2:查看日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous  # 查看上次崩溃的日志

# 步骤 3:检查事件
kubectl get events --field-selector involvedObject.name=<pod-name>

# 常见原因:
# - 应用启动失败
# - 配置错误
# - 依赖服务不可用
# - 资源限制过低

练习 2:镜像拉取失败排查

# 症状:Pod 处于 ImagePullBackOff 状态

# 步骤 1:查看详细信息
kubectl describe pod <pod-name>
# 关注 Events 部分

# 步骤 2:检查镜像名称
# 确认镜像名称和标签正确

# 步骤 3:检查镜像仓库认证
kubectl get secret <pull-secret> -o yaml

# 步骤 4:手动测试拉取
docker pull <image-name>

# 常见原因:
# - 镜像名称错误
# - 镜像不存在
# - 私有仓库认证失败
# - 网络问题

练习 3:Pod Pending 排查

# 症状:Pod 长时间处于 Pending 状态

# 步骤 1:查看 Pod 事件
kubectl describe pod <pod-name>

# 步骤 2:检查 Node 资源
kubectl describe nodes
kubectl top nodes

# 步骤 3:检查调度约束
# - nodeSelector
# - affinity
# - tolerations

# 常见原因:
# - 资源不足(CPU/内存)
# - 没有合适的 Node
# - PVC 未绑定
# - 调度约束无法满足

练习 4:Service 访问问题排查

# 症状:无法通过 Service 访问应用

# 步骤 1:检查 Service 状态
kubectl get svc <service-name>
kubectl describe svc <service-name>

# 步骤 2:检查 Endpoints
kubectl get endpoints <service-name>
# 确认有可用的 Endpoints

# 步骤 3:检查 Pod 标签
kubectl get pods --show-labels
# 确认 Pod 标签与 Service selector 匹配

# 步骤 4:测试连通性
kubectl run test-pod --image=busybox -it --rm -- sh
# 在 Pod 内测试
wget -qO- http://<service-name>:<port>
nslookup <service-name>

练习 5:DNS 问题排查

# 症状:服务发现失败

# 步骤 1:检查 CorePod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns

# 步骤 2:测试 DNS 解析
kubectl run dns-test --image=busybox -it --rm -- sh
nslookup kubernetes.default
nslookup <service-name>.<namespace>.svc.cluster.local

# 步骤 3:检查 DNS 配置
kubectl exec <pod-name> -- cat /etc/resolv.conf

# 常见原因:
# - CoreDNS 未运行
# - DNS 配置错误
# - 网络策略阻止

练习 6:资源问题排查

# 症状:Pod 被 OOMKilled

# 步骤 1:查看 Pod 状态
kubectl describe pod <pod-name>
# 关注 Last State 中的 OOMKilled

# 步骤 2:查看资源使用
kubectl top pod <pod-name>

# 步骤 3:检查资源限制
kubectl get pod <pod-name> -o yaml | grep -A 5 resources

# 步骤 4:调整资源限制
kubectl edit pod <pod-name>
# 或修改 Deployment

练习 7:网络问题排查

# 步骤 1:检查 Pod 网络
kubectl exec <pod-name> -- ip addr
kubectl exec <pod-name> -- ping <other-pod-ip>

# 步骤 2:检查 Service 网络
kubectl exec <pod-name> -- nslookup <service-name>
kubectl exec <pod-name> -- wget -qO- http://<service-name>

# 步骤 3:检查网络策略
kubectl get networkpolicies
kubectl describe networkpolicy <policy-name>

# 步骤 4:使用调试容器
kubectl debug -it <pod-name> --image=nicolaka/netshoot

调试工具

常用调试镜像

# 网络调试
kubectl run netshoot --image=nicolaka/netshoot -it --rm -- bash

# DNS 调试
kubectl run dnsutils --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- nslookup kubernetes

# 简单测试
kubectl run busybox --image=busybox -it --rm -- sh

临时容器调试

# Kubernetes 1.23+ 支持临时容器
kubectl debug -it <pod-name> --image=busybox --target=<container-name>

# 添加调试容器
kubectl debug -it <pod-name> --image=debug-tools --name=debugger

系统日志查看

# kubelet 日志
journalctl -u kubelet -f

# 容器运行时日志
journalctl -u containerd -f

# 系统日志
dmesg | tail -50

排查检查清单

Pod 问题检查清单

□ kubectl get pods - 查看状态
□ kubectl describe pod - 查看详情
□ kubectl logs - 查看日志
□ kubectl logs --previous - 查看上次日志
□ kubectl get events - 查看事件
□ 资源限制是否合理
□ 配置是否正确
□ 依赖服务是否可用

Service 问题检查清单

□ kubectl get svc - 查看 Service
□ kubectl get endpoints - 查看 Endpoints
□ Pod 标签是否匹配
□ 端口配置是否正确
□ 网络策略是否阻止
□ DNS 是否正常

小结

要点说明
排查方法收集信息→定位层级→分析日志→验证假设
常用命令describe、logs、events、top
调试工具netshoot、busybox、临时容器
关键检查状态、日志、事件、资源、配置
最佳实践系统化排查,不要猜测

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「最佳实践」 以巩固所学知识。