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

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

Kubernetes 集群故障排查是运维和开发的核心技能。面对 Pod 不断 CrashLoopBackOff、节点 NotReady、网络不通等问题,如何快速定位根因?本文系统梳理 K8s 故障排查的分层方法论、常用命令和实用工具,帮助你建立从集群到 Pod 的完整排查思路。

一、排查方法论:从外到内,逐层缩小
遵循“从集群到节点,再到 Pod/容器”的逐层缩小原则:

集群层:节点是否正常?核心组件是否健康?

资源层:Deployment、Service、Ingress 等资源配置是否正确?

Pod 层:Pod 处于什么状态?Events 有什么信息?

容器层:容器日志输出什么?能否进入容器调试?

二、集群层排查
2.1 检查节点状态

# 查看所有节点状态kubectl get nodes# 查看节点详细信息(Events、Conditions、资源容量)kubectl describenode<node-name># 查看节点资源使用(需安装 Metrics Server)kubectltopnodes

正常节点应处于 Ready 状态。若节点为 NotReady,通常表示 kubelet 无法与 API Server 通信。kubectl describe node 会显示具体原因(如 Kubelet stopped posting node status)。

2.2 查看集群事件

# 查看所有事件(按时间排序)kubectl get events --sort-by='.lastTimestamp'# 查看特定命名空间的事件kubectl get events-n<namespace># 持续监控事件kubectl get events-w

事件(Events)是排查问题的第一手线索,包含调度失败、镜像拉取失败、探针错误等关键信息。

2.3 检查核心组件

# 查看 kube-system 命名空间下所有 Podkubectl get pods-nkube-system# 查看特定组件日志(如 kube-apiserver)kubectl logs-nkube-system<pod-name>

三、资源层排查
3.1 检查 Deployment / StatefulSet / Service

# 查看 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 状态

# 查看所有命名空间的 Podkubectl get pods-A# 查看特定 Pod 的详细信息kubectl describe pod<pod-name># 查看 Pod 的 YAML 定义kubectl get pod<pod-name>-oyaml

kubectl describe pod 的 Events 字段是排查的核心入口,会显示:

调度失败原因

镜像拉取失败详情

容器启动失败原因

探针失败记录

4.2 常见 Pod 状态及原因

五、容器层排查
5.1 查看日志

# 查看 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 进入容器调试

# 进入容器 Shellkubectlexec-it<pod-name>-- /bin/bash# 若容器无 bash,使用 shkubectlexec-it<pod-name>-- /bin/sh# 多容器 Pod 指定容器kubectlexec-it<pod-name>-c<container-name>-- /bin/bash

5.3 临时容器(Ephemeral Container)调试
kubectl debug 可以在不重启 Pod 的情况下,向运行中的 Pod 注入一个临时调试容器,共享目标容器的命名空间。

# 在 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 端口转发调试

# 将本地端口转发到 Pod 端口kubectl port-forward pod/<pod-name>8080:80# 转发到 Servicekubectl port-forward service/<svc-name>8080:80

六、网络问题排查
6.1 测试 Pod 间通信

# 创建一个临时调试 Podkubectl run debug--image=busybox-it--rm--restart=Never --sh# 在调试 Pod 中测试连通性ping<target-pod-ip>curlhttp://<service-name>:<port>nslookup<service-name>

6.2 检查 Service 和 Endpoints

# 查看 Service 的 Endpoints(应有 Pod IP)kubectl get endpoints<svc-name># 若 Endpoints 为空,检查 selector 是否匹配 Pod 标签kubectl describe svc<svc-name>

6.3 检查网络插件(CNI)

# 查看 CNI 插件 Pod 状态kubectl get pods-nkube-system|grep-E'calico|flannel|cilium|weave'# 查看 CNI 插件日志kubectl logs-nkube-system<cni-pod-name>

七、节点级排查
7.1 节点资源与状态

# 查看节点资源使用kubectltopnodes# 查看节点详情(Conditions、Taints、资源容量)kubectl describenode<node-name># 封锁节点(不再调度新 Pod)kubectl cordon<node-name># 排空节点(驱逐所有 Pod,用于维护)kubectl drain<node-name>--ignore-daemonsets --delete-emptydir-data

7.2 节点上查看 kubelet 日志

# systemd 系统journalctl-ukubelet-f# 或查看日志文件tail-f/var/log/kubelet.log

八、常用排查命令速查

# === 集群状态 ===kubectl get nodes-owide kubectl cluster-info kubectl get events --sort-by='.lastTimestamp'# === 资源状态 ===kubectl get all-n<namespace># 查看命名空间下所有资源kubectl get deploy,rs,po-lapp=myapp# 按标签筛选kubectl describe deploy<name># === Pod 调试 ===kubectl logs<pod>--previouskubectlexec-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# 强制删除卡住的 Podkubectl cordon / uncordon / drain<node># 节点维护

九、常见故障场景及解决

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