第二十篇:《K8s 故障排查常用命令与技巧》

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 集群故障。