故障排查
学习目标
- 掌握 Kubernetes 故障排查的系统方法
- 学会使用调试工具和命令
- 理解常见问题的排查流程
核心概念
故障排查方法论
系统化排查流程:
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...