Kubernetes 集群故障排查是运维和开发的核心技能。面对 Pod 不断 CrashLoopBackOff、节点 NotReady、网络不通等问题,如何快速定位根因?本文系统梳理 K8s 故障排查的分层方法论、常用命令和实用工具,帮助你建立从集群到 Pod 的完整排查思路。
一、排查方法论:从外到内,逐层缩小
遵循"从集群到节点,再到 Pod/容器"的逐层缩小原则:
集群层:节点是否正常?核心组件是否健康?
资源层:Deployment、Service、Ingress 等资源配置是否正确?
Pod 层:Pod 处于什么状态?Events 有什么信息?
容器层:容器日志输出什么?能否进入容器调试?
二、集群层排查
2.1 检查节点状态
bash
# 查看所有节点状态
kubectl get nodes
# 查看节点详细信息(Events、Conditions、资源容量)
kubectl describe node <node-name>
# 查看节点资源使用(需安装 Metrics Server)
kubectl top nodes
正常节点应处于 Ready 状态。若节点为 NotReady,通常表示 kubelet 无法与 API Server 通信。kubectl describe node 会显示具体原因(如 Kubelet stopped posting node status)。
2.2 查看集群事件
bash
# 查看所有事件(按时间排序)
kubectl get events --sort-by='.lastTimestamp'
# 查看特定命名空间的事件
kubectl get events -n <namespace>
# 持续监控事件
kubectl get events -w
事件(Events)是排查问题的第一手线索,包含调度失败、镜像拉取失败、探针错误等关键信息。
2.3 检查核心组件
bash
# 查看 kube-system 命名空间下所有 Pod
kubectl get pods -n kube-system
# 查看特定组件日志(如 kube-apiserver)
kubectl logs -n kube-system <pod-name>
三、资源层排查
3.1 检查 Deployment / StatefulSet / Service
bash
# 查看 Deployment 状态
kubectl get deployments
kubectl describe deployment <name>
# 查看 ReplicaSet(了解滚动更新进度)
kubectl get rs
kubectl describe rs <name>
# 查看 Service 和 Endpoints(确认后端 Pod 是否正常)
kubectl get svc,ep
3.2 检查资源配置
YAML 语法错误:kubectl apply 时会报错,仔细查看错误信息。
镜像拉取失败:检查镜像名是否正确、是否有 imagePullSecret。
资源不足:kubectl describe pod 的 Events 会显示 Insufficient cpu/memory。
四、Pod 层排查
4.1 查看 Pod 状态
bash
# 查看所有命名空间的 Pod
kubectl get pods -A
# 查看特定 Pod 的详细信息
kubectl describe pod <pod-name>
# 查看 Pod 的 YAML 定义
kubectl get pod <pod-name> -o yaml
kubectl describe pod 的 Events 字段是排查的核心入口,会显示:
调度失败原因
镜像拉取失败详情
容器启动失败原因
探针失败记录
4.2 常见 Pod 状态及原因

五、容器层排查
5.1 查看日志
bash
# 查看 Pod 日志
kubectl logs <pod-name>
# 多容器 Pod 指定容器
kubectl logs <pod-name> -c <container-name>
# 查看上一个崩溃容器的日志(关键!)
kubectl logs <pod-name> --previous
# 实时跟踪日志
kubectl logs -f <pod-name>
--previous 参数在排查 CrashLoopBackOff 时至关重要------崩溃容器的日志可能包含启动失败的具体错误。
5.2 进入容器调试
bash
# 进入容器 Shell
kubectl exec -it <pod-name> -- /bin/bash
# 若容器无 bash,使用 sh
kubectl exec -it <pod-name> -- /bin/sh
# 多容器 Pod 指定容器
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash
5.3 临时容器(Ephemeral Container)调试
kubectl debug 可以在不重启 Pod 的情况下,向运行中的 Pod 注入一个临时调试容器,共享目标容器的命名空间。
bash
# 在 Pod 中启动一个临时调试容器(共享进程命名空间)
kubectl debug -it <pod-name> --image=busybox --target=<container-name>
# 在节点上创建调试 Pod(用于节点级排查)
kubectl debug node/<node-name> -it --image=ubuntu
临时容器可以安装调试工具(如 htop、tcpdump、curl),直接检查目标容器的网络、进程和文件系统。
5.4 端口转发调试
bash
# 将本地端口转发到 Pod 端口
kubectl port-forward pod/<pod-name> 8080:80
# 转发到 Service
kubectl port-forward service/<svc-name> 8080:80
六、网络问题排查
6.1 测试 Pod 间通信
bash
# 创建一个临时调试 Pod
kubectl run debug --image=busybox -it --rm --restart=Never -- sh
# 在调试 Pod 中测试连通性
ping <target-pod-ip>
curl http://<service-name>:<port>
nslookup <service-name>
6.2 检查 Service 和 Endpoints
bash
# 查看 Service 的 Endpoints(应有 Pod IP)
kubectl get endpoints <svc-name>
# 若 Endpoints 为空,检查 selector 是否匹配 Pod 标签
kubectl describe svc <svc-name>
6.3 检查网络插件(CNI)
bash
# 查看 CNI 插件 Pod 状态
kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium|weave'
# 查看 CNI 插件日志
kubectl logs -n kube-system <cni-pod-name>
七、节点级排查
7.1 节点资源与状态
bash
# 查看节点资源使用
kubectl top nodes
# 查看节点详情(Conditions、Taints、资源容量)
kubectl describe node <node-name>
# 封锁节点(不再调度新 Pod)
kubectl cordon <node-name>
# 排空节点(驱逐所有 Pod,用于维护)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
7.2 节点上查看 kubelet 日志
bash
# systemd 系统
journalctl -u kubelet -f
# 或查看日志文件
tail -f /var/log/kubelet.log
八、常用排查命令速查
bash
# === 集群状态 ===
kubectl get nodes -o wide
kubectl cluster-info
kubectl get events --sort-by='.lastTimestamp'
# === 资源状态 ===
kubectl get all -n <namespace> # 查看命名空间下所有资源
kubectl get deploy,rs,po -l app=myapp # 按标签筛选
kubectl describe deploy <name>
# === Pod 调试 ===
kubectl logs <pod> --previous
kubectl exec -it <pod> -- /bin/sh
kubectl debug -it <pod> --image=busybox
# === 网络调试 ===
kubectl get svc,ep
kubectl port-forward pod/<pod> 8080:80
kubectl run debug --image=nicolaka/netshoot -it --rm -- sh # 专业网络调试镜像[reference:52]
# === 资源清理 ===
kubectl delete pod <pod> --force --grace-period=0 # 强制删除卡住的 Pod
kubectl cordon / uncordon / drain <node> # 节点维护
九、常见故障场景及解决

十、小结
Kubernetes 故障排查需要系统化的方法:从集群层 → 资源层 → Pod 层 → 容器层逐层缩小范围。核心三板斧是 kubectl describe(查看 Events)、kubectl logs --previous(查看崩溃日志)和 kubectl exec(进入容器调试)。对于复杂问题,kubectl debug 临时容器和 netshoot 等专业镜像能提供强大支持。掌握这些命令和思路,你就能从容应对大多数 K8s 集群故障。