Kubernetes故障排查与诊断:从问题定位到解决方案
Kubernetes故障排查与诊断:从问题定位到解决方案
一、引言
在Kubernetes集群运行过程中,各种故障和异常是不可避免的。掌握高效的故障排查方法是每个Kubernetes运维工程师必备的技能。本文将介绍从问题定位到解决方案的完整流程。
二、常见故障场景分析
2.1 Pod无法启动
# 查看Pod状态 kubectl get pods -n default # 查看Pod详细信息 kubectl describe pod my-pod -n default # 查看Pod日志 kubectl logs my-pod -n default # 查看最近一次启动失败的容器日志 kubectl logs my-pod -n default --previous2.2 Pod处于Pending状态
# 查看调度器事件 kubectl get events -n default | grep my-pod # 检查节点资源 kubectl describe node node-1 # 查看调度器日志 kubectl logs kube-scheduler -n kube-system2.3 Pod处于CrashLoopBackOff状态
# 查看容器退出原因 kubectl get pod my-pod -o jsonpath='{.status.containerStatuses[0].lastState.terminated}' # 检查健康检查配置 kubectl get pod my-pod -o yaml | grep -A 20 livenessProbe # 进入容器调试 kubectl exec -it my-pod -- /bin/bash三、网络故障排查
3.1 Pod间通信失败
# 在Pod内部测试网络连通性 kubectl exec -it pod-1 -- ping pod-2-ip # 检查DNS解析 kubectl exec -it pod-1 -- nslookup service-name # 检查网络策略 kubectl get networkpolicy -n default # 使用tcpdump抓包 kubectl exec -it pod-1 -- tcpdump -i eth03.2 Service无法访问
# 检查Service配置 kubectl get service my-service -o yaml # 检查Endpoint状态 kubectl get endpoints my-service # 测试Service端口 kubectl port-forward service/my-service 8080:80 # 检查kube-proxy状态 kubectl get pods -n kube-system -l k8s-app=kube-proxy四、存储故障排查
4.1 PVC无法绑定
# 检查PVC状态 kubectl get pvc my-pvc -n default # 检查StorageClass配置 kubectl get storageclass # 检查PV状态 kubectl get pv # 查看卷绑定事件 kubectl get events -n default | grep my-pvc4.2 存储卷挂载失败
# 查看Pod挂载信息 kubectl describe pod my-pod | grep -A 10 Volumes # 检查节点存储状态 kubectl describe node node-1 | grep -A 20 Volumes # 检查存储插件日志 kubectl logs -n kube-system -l app=csi-attacher五、控制平面故障排查
5.1 API Server不可用
# 检查API Server状态 kubectl get componentstatuses # 查看API Server日志 kubectl logs kube-apiserver -n kube-system # 检查API Server端口 telnet localhost 6443 # 检查etcd连接 etcdctl --endpoints=https://localhost:2379 endpoint health5.2 Controller Manager故障
# 查看Controller Manager状态 kubectl get pods -n kube-system -l k8s-app=kube-controller-manager # 查看日志 kubectl logs kube-controller-manager -n kube-system # 检查leader选举 kubectl get endpoints kube-controller-manager -n kube-system六、节点故障排查
6.1 节点NotReady状态
# 查看节点状态 kubectl get nodes # 查看节点详情 kubectl describe node node-1 # 检查kubelet状态 systemctl status kubelet # 查看kubelet日志 journalctl -u kubelet -f6.2 节点资源不足
# 查看节点资源使用情况 kubectl top nodes # 检查节点污点 kubectl describe node node-1 | grep Taints # 检查节点驱逐状态 kubectl get events -n kube-system | grep Evicted七、日志与监控分析
7.1 结构化日志分析
# 使用kubetail聚合日志 kubetail my-app -n default # 使用stern过滤日志 stern "error" -n default # 日志导出分析 kubectl logs my-pod -n default > /tmp/pod.log cat /tmp/pod.log | jq '.level, .message'7.2 Prometheus指标分析
# 查询Pod重启次数 sum(increase(kube_pod_container_status_restarts_total[1h])) by (pod) # 查询Pod内存使用 sum(container_memory_working_set_bytes) by (pod) # 查询网络错误率 sum(rate(kube_pod_network_errors_total[5m])) by (pod)八、故障排查流程总结
┌─────────────────────────────────────────────────────────────┐ │ 故障排查流程 │ ├─────────────────────────────────────────────────────────────┤ │ 1. 确认问题现象 │ │ └── kubectl get pods, describe, logs │ ├─────────────────────────────────────────────────────────────┤ │ 2. 定位问题范围 │ │ └── 单个Pod/整个Service/节点级/集群级 │ ├─────────────────────────────────────────────────────────────┤ │ 3. 收集诊断信息 │ │ └── 日志、事件、指标、配置 │ ├─────────────────────────────────────────────────────────────┤ │ 4. 分析根本原因 │ │ └── 资源不足/网络问题/配置错误/镜像问题 │ ├─────────────────────────────────────────────────────────────┤ │ 5. 实施解决方案 │ │ └── 调整配置/修复代码/扩容/重启组件 │ ├─────────────────────────────────────────────────────────────┤ │ 6. 验证修复效果 │ │ └── 监控指标/日志/功能测试 │ └─────────────────────────────────────────────────────────────┘九、总结
Kubernetes故障排查需要系统的方法论和丰富的经验。通过掌握各种排查工具和方法,可以快速定位问题并实施有效的解决方案。定期进行故障演练和复盘是提升排查能力的关键。
