Kubernetes 调试技能
概览
系统化的工具包,用于调试和排查 Kubernetes 集群、Pod、服务和部署的问题。提供脚本、工作流程和参考指南,以高效识别和解决常见的 Kubernetes 问题。
何时使用此技能
遇到以下情况时调用此技能:
- Pod 故障(CrashLoopBackOff、ImagePullBackOff、Pending、OOMKilled)
- 服务连接或 DNS 解析问题
- 网络策略或入口问题
- 卷和存储挂载失败
- 部署 rollout 问题
- 集群健康或性能下降
- 资源耗尽(CPU/内存)
- 配置问题(ConfigMaps、Secrets、RBAC)
调试工作流程
按照这个系统化的方法来处理任何 Kubernetes 问题:
1. 确定问题层级
对问题进行分类:
- 应用层:应用崩溃、错误、缺陷
- Pod 层:Pod 无法启动、重启或挂起
- 服务层:网络连接、DNS 问题
- 节点层:节点未就绪、资源耗尽
- 集群层:控制平面问题、API 问题
- 存储层:卷挂载失败、PVC 问题
- 配置层:ConfigMap、Secret、RBAC 问题
2. 收集诊断信息
根据范围使用适当的诊断脚本:
Pod 级别诊断
使用 scripts/pod_diagnostics.py 进行综合 Pod 分析:
python3 scripts/pod_diagnostics.py <pod-name> -n <namespace>
此脚本收集:
- Pod 状态和描述
- Pod 事件
- 容器日志(当前和之前的)
- 资源使用情况
- 节点信息
- YAML 配置
输出可以保存以供分析:python3 scripts/pod_diagnostics.py <pod-name> -n <namespace> -o diagnostics.txt
集群级健康检查
使用 scripts/cluster_health.sh 进行整体集群诊断:
./scripts/cluster_health.sh
此脚本检查:
- 集群信息和版本
- 节点状态和资源
- 所有命名空间中的 Pods
- 失败/挂起的 Pods
- 最近的事件
- 部署、服务、有状态副本集、守护进程集
- PVC 和 PV
- 组件健康
- 常见错误状态(CrashLoopBackOff、ImagePullBackOff)
网络诊断
使用 scripts/network_debug.sh 进行连接问题:
./scripts/network_debug.sh <namespace> <pod-name>
此脚本分析:
- Pod 网络配置
- DNS 设置和解析
- 服务端点
- 网络策略
- 连接测试
- CoreDNS 日志
3. 遵循特定问题的流程
根据确定的问题,参考 references/troubleshooting_workflow.md 获取详细的工作流程:
- Pod 挂起:资源/调度工作流程
- CrashLoopBackOff:应用崩溃工作流程
- ImagePullBackOff:拉取镜像工作流程
- 服务问题:网络连接工作流程
- DNS 故障:DNS 故障排除工作流程
- 资源耗尽:性能调查工作流程
- 存储问题:PVC 绑定工作流程
- 部署卡住:Rollout 工作流程
4. 应用针对性修复
参考 references/common_issues.md 获取常见问题的特定解决方案。
常见调试模式
模式 1:Pod 无法启动
# 快速评估
kubectl get pod <pod-name> -n <namespace>
kubectl describe pod <pod-name> -n <namespace>
# 详细诊断
python3 scripts/pod_diagnostics.py <pod-name> -n <namespace>
# 检查常见原因:
# - ImagePullBackOff:验证镜像存在和凭证
# - CrashLoopBackOff:检查带有 --previous 标志的日志
# - Pending:检查节点资源和调度
模式 2:服务连接问题
# 验证服务和端点
kubectl get svc <service-name> -n <namespace>
kubectl get endpoints <service-name> -n <namespace>
# 网络诊断
./scripts/network_debug.sh <namespace> <pod-name>
# 从调试 Pod 测试连接
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash
# 内部:curl <service-name>.<namespace>.svc.cluster.local:<port>
# 检查网络策略
kubectl get networkpolicies -n <namespace>
模式 3:应用性能问题
# 检查资源使用情况
kubectl top nodes
kubectl top pods -n <namespace> --containers
# 获取 Pod 指标
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 10 resources
# 检查 OOMKilled
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 10 lastState
# 查看应用日志
kubectl logs <pod-name> -n <namespace> --tail=100
模式 4:集群健康评估
# 运行综合健康检查
./scripts/cluster_health.sh > cluster-health-$(date +%Y%m%d-%H%M%S).txt
# 检查输出:
# - 节点条件和资源压力
# - 失败或挂起的 Pods
# - 最近的错误事件
# - 组件健康状态
# - 资源配额使用情况
基本手动命令
虽然脚本可以自动化诊断,但要理解这些核心命令:
Pod 调试
# 查看 Pod 状态
kubectl get pods -n <namespace> -o wide
# 详细 Pod 信息
kubectl describe pod <pod-name> -n <namespace>
# 查看日志
kubectl logs <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous # 之前的容器
kubectl logs <pod-name> -n <namespace> -c <container> # 特定容器
# 在 Pod 中执行命令
kubectl exec <pod-name> -n <namespace> -it -- /bin/sh
# 获取 Pod YAML
kubectl get pod <pod-name> -n <namespace> -o yaml
服务和网络调试
# 检查服务
kubectl get svc -n <namespace>
kubectl describe svc <service-name> -n <namespace>
# 检查端点
kubectl get endpoints -n <namespace>
# 测试 DNS
kubectl exec <pod-name> -n <namespace> -- nslookup kubernetes.default
# 查看事件
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
资源监控
# 节点资源
kubectl top nodes
kubectl describe nodes
# Pod 资源
kubectl top pods -n <namespace>
kubectl top pod <pod-name> -n <namespace> --containers
紧急操作
# 重启部署
kubectl rollout restart deployment/<name> -n <namespace>
# 回滚部署
kubectl rollout undo deployment/<name> -n <namespace>
# 强制删除卡住的 Pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
# 排空节点(维护)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 限制节点(防止调度)
kubectl cordon <node-name>
参考文档
详细的故障排除指南
参考 references/troubleshooting_workflow.md 获取:
- 每种问题类型的逐步工作流程
- 诊断的决策树
- 系统化调试的命令序列
- 快速参考命令备忘单
常见问题数据库
参考 references/common_issues.md 获取:
- 每个常见问题的详细解释
- 症状和原因
- 特定的调试步骤
- 解决方案和修复
- 预防策略
最佳实践
系统化方法
- 观察:在做出改变之前收集事实
- 分析:使用诊断脚本来收集全面的数据
- 假设:对根本原因形成理论
- 测试:用针对性的命令验证假设
- 修复:应用适当的解决方案
- 验证:确认问题已解决
- 记录:记录发现以供将来参考
数据收集
- 将诊断输出保存到文件以供分析
- 在重启失败的 Pods 之前捕获日志
- 记录事件时间线以供事故报告
- 导出资源指标以进行趋势分析
预防
- 设置适当的资源请求和限制
- 实施健康检查(liveness/readiness probes)
- 使用适当的日志记录和监控
- 逐步应用网络策略
- 在非生产环境中测试更改
- 维护集群架构的文档
高级调试技术
调试容器(Kubernetes 1.23+)
# 附加临时调试容器
kubectl debug <pod-name> -n <namespace> -it --image=nicolaka/netshoot
# 创建调试 Pod 的副本
kubectl debug <pod-name> -n <namespace> -it --copy-to=<debug-pod-name> --container=<container>
端口转发以进行测试
# 将 Pod 端口转发到本地机器
kubectl port-forward pod/<pod-name> -n <namespace> <local-port>:<pod-port>
# 转发服务端口
kubectl port-forward svc/<service-name> -n <namespace> <local-port>:<service-port>
代理 API 访问
# 启动 kubectl 代理
kubectl proxy --port=8080
# 访问 API
curl http://localhost:8080/api/v1/namespaces/<namespace>/pods/<pod-name>
自定义列输出
# 自定义 Pod 信息
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,IP:.status.podIP
# 节点污点
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
故障排除清单
在升级问题之前,请验证:
- [ ] 查看 Pod 事件:
kubectl describe pod - [ ] 查看 Pod 日志(当前和之前的)
- [ ] 验证节点上的资源可用性
- [ ] 确认镜像存在且可访问
- [ ] 验证服务选择器与 Pod 标签匹配
- [ ] 从 Pods 测试 DNS 解析
- [ ] 检查网络策略
- [ ] 查看最近的集群事件
- [ ] 确认 ConfigMaps/Secrets 存在
- [ ] 验证 RBAC 权限
- [ ] 检查资源配额/限制
- [ ] 查看集群组件健康状态
相关工具
Kubernetes 调试的其他有用工具:
- kubectl-debug:高级调试插件
- stern:多 Pod 日志跟踪
- kubectx/kubens:上下文和命名空间切换
- k9s:Kubernetes 的终端 UI
- lens:Kubernetes 的桌面 IDE
- Prometheus/Grafana:监控和报警
- Jaeger/Zipkin:分布式跟踪