Kubernetes常见故障排查指南:6类证据链与命令清单

面向平台团队、SRE和运维工程师,梳理Kubernetes常见故障排查的证据链方法,覆盖Pod、事件、节点、网络、存储和发布变更,并提供辅助命令清单,帮助团队减少盲目重启、误判根因和临时救火,走向可复盘的故障治理。

使用方式:本文不是Kubernetes命令库,而是一套故障排查证据链。命令只用于取证,最终目标是判断影响面、定位根因、恢复服务并留下可复盘材料。

Kubernetes常见故障排查最容易走向两个极端:一种是看到Pod异常就立刻重启,先把现象压下去;另一种是收藏大量kubectl命令,却不知道在什么场景下使用。对企业生产环境来说,这两种方式都不够。排障需要先确认影响面,再逐层收集资源状态、事件、日志、节点、网络、存储和发布变更证据,最后形成结论和复盘。

如果没有证据链,故障处理会变成个人经验;如果只有命令清单,没有判断顺序,团队也很难把经验沉淀为稳定性能力。

Kubernetes故障排查从现象资源事件节点网络存储到发布变更复盘的证据链
图:Kubernetes故障排查从现象资源事件节点网络存储到发布变更复盘的证据链

先判断影响面:不要一上来就重启Pod

排障第一步不是执行命令,而是回答影响面问题。影响面决定排障优先级,也决定是否需要升级应急响应。

建议先确认:

  • 是单个Pod异常,还是同一应用多个副本异常
  • 是单个Namespace异常,还是多个团队或多个集群受影响
  • 是新版本发布后异常,还是无明显变更的运行时异常
  • 是应用不可访问,还是性能变慢、错误率上升或任务堆积
  • 是否影响核心业务路径,是否需要先回滚或切流

如果影响面扩大,不应由单个工程师在命令行里持续试错。应同步应用负责人、平台值班、安全或网络相关角色,并记录开始时间、现象、影响范围和已执行动作。

排障的第一条原则,是先保护证据和服务,再选择修复动作。盲目删除Pod、清理节点或修改配置,可能让现场证据丢失,也可能把局部故障扩大为平台故障。

证据一:Pod状态和容器日志

Pod是大多数Kubernetes故障的第一观察对象,但Pod状态不能单独解释全部问题。`Pending`可能是资源不足、调度约束或镜像问题;`CrashLoopBackOff`可能是应用启动失败、配置错误、依赖不可用或探针设置不当;`Running`也不代表业务可用。

常用取证命令包括:

“`bash

kubectl get pod -n <namespace> -o wide

kubectl describe pod <pod-name> -n <namespace>

kubectl logs <pod-name> -n <namespace> –previous

kubectl get pod <pod-name> -n <namespace> -o yaml

“`

查看Pod时,应重点关注4类信息:调度到哪个节点,容器是否反复重启,事件里是否有镜像拉取、探针、资源或挂载错误,日志是否能解释应用自身异常。

如果只看到容器重启而不看`–previous`日志,就可能错过上一次崩溃前的关键错误;如果只看当前日志,不看事件,就可能把镜像拉取失败、存储挂载失败或调度失败误判为应用问题。

证据二:事件不是噪音,而是控制面的时间线

Kubernetes事件记录了控制器、调度器、kubelet和相关组件对资源的操作结果。很多故障在日志里看不到,但事件会留下线索,例如镜像拉取失败、节点不可调度、资源不足、探针失败、PVC挂载失败、Secret不存在等。

常用命令包括:

“`bash

kubectl get events -n <namespace> –sort-by=.lastTimestamp

kubectl describe deployment <deployment-name> -n <namespace>

kubectl describe rs -n <namespace>

“`

事件排查要看时间顺序。不要只看最后一条,也不要忽略重复次数。比如一个Pod最终处于Running,但事件里出现过多次探针失败,说明启动过程可能不稳定;一个Deployment副本不足,事件里可能已经提示资源配额、镜像或调度约束问题。

对企业平台团队来说,事件还可以作为复盘材料。它能说明故障何时开始、控制器做过什么、失败发生在哪一层,以及人工操作是否改变了资源状态。

证据三:节点和资源压力

当多个Pod同时异常,或者Pod长期Pending、频繁驱逐、调度失败时,需要从节点和资源层排查。节点问题常见于CPU、内存、磁盘、网络、kubelet状态、运行时异常或节点不可达。

常用命令包括:

“`bash

kubectl get nodes -o wide

kubectl describe node <node-name>

kubectl top node

kubectl top pod -n <namespace>

“`

如果集群没有安装指标采集组件,`kubectl top`可能不可用,此时应结合平台监控、节点监控和日志系统查看资源趋势。

节点排查时应注意三个判断:

  • Pod无法调度,是节点资源不足、污点、亲和性、配额还是存储约束导致
  • Pod被驱逐,是内存、磁盘、PID、临时存储还是节点压力导致
  • 多个应用异常,是同一节点问题,还是同一镜像、同一发布或同一依赖问题

节点层排障不要轻易把问题归因于“Kubernetes不稳定”。很多节点异常背后是容量规划不足、资源请求不准、磁盘清理不及时、镜像缓存膨胀或运行时维护缺失。

证据四:网络路径和服务发现

应用不可访问时,很多团队会先怀疑网络。但Kubernetes网络问题往往要分层看:Service选择器是否匹配Pod,Pod是否Ready,端口是否正确,DNS是否解析,NetworkPolicy是否限制访问,Ingress或网关是否配置正确,下游服务是否可达。

常用取证命令包括:

“`bash

kubectl get svc,endpoints,endpointslice -n <namespace>

kubectl describe svc <service-name> -n <namespace>

kubectl get ingress -n <namespace>

kubectl exec -n <namespace> <pod-name> — nslookup <service-name>

“`

如果Service没有Endpoints,通常先检查标签选择器和Pod就绪状态;如果Endpoints存在但访问失败,再看端口、协议、网络策略、DNS和网关配置。不要一开始就把问题推给底层网络插件。

企业环境还要注意多集群、跨Namespace和网关链路。一次访问失败可能经过DNS、Service、Sidecar、网关、负载均衡和外部依赖,排查时应画出请求路径,按路径逐段验证。

证据五:存储和配置变更

有状态应用、日志目录、上传目录、数据库客户端缓存、消息中间件和批处理任务,都会让故障与存储或配置有关。常见现象包括Pod无法启动、PVC无法绑定、挂载失败、应用启动后找不到配置、Secret缺失或配置更新没有生效。

常用命令包括:

“`bash

kubectl get pvc,pv -n <namespace>

kubectl describe pvc <pvc-name> -n <namespace>

kubectl get configmap,secret -n <namespace>

kubectl describe deployment <deployment-name> -n <namespace>

“`

存储问题不能只看PVC是否Bound,还要看挂载事件、节点可用性、存储类、访问模式和应用读写方式。配置问题也不能只看对象是否存在,还要确认应用是否引用了正确Key,配置更新是否需要重启,密钥是否由正确流程发放。

如果故障发生在配置变更之后,应优先回看变更记录和发布流水线。很多“应用突然坏了”并不是运行时故障,而是配置、Secret、镜像Tag或依赖地址被修改后缺少验证。

证据六:发布变更和回滚边界

Kubernetes故障经常与发布变更相关。镜像版本、环境变量、资源限制、探针、网络策略、Ingress规则、HPA策略和依赖配置都可能引发问题。排障时必须把“最近发生了什么”纳入证据链。

常用命令包括:

“`bash

kubectl rollout status deployment/<deployment-name> -n <namespace>

kubectl rollout history deployment/<deployment-name> -n <namespace>

kubectl describe deployment <deployment-name> -n <namespace>

“`

回滚前要确认问题是否真的由应用版本引起。若故障来自数据库变更、配置中心、外部依赖、存储挂载或网络策略,单纯回滚Deployment可能不能恢复服务,甚至会引入兼容性问题。

更稳妥的做法是把发布变更和观测数据结合起来:发布前后错误率是否变化,是否集中在某个版本,是否只有新Pod异常,是否所有流量都经过同一路径,是否存在未同步配置或依赖变更。

命令清单:只作为取证入口

以下命令适合作为排障辅助清单,但不应脱离场景机械执行。

目的 常用命令
查看资源概览 `kubectl get pod,deploy,svc -n <namespace> -o wide`
查看Pod证据 `kubectl describe pod <pod-name> -n <namespace>`
查看上次崩溃日志 `kubectl logs <pod-name> -n <namespace> –previous`
查看事件时间线 `kubectl get events -n <namespace> –sort-by=.lastTimestamp`
查看节点状态 `kubectl describe node <node-name>`
查看Service端点 `kubectl get svc,endpoints,endpointslice -n <namespace>`
查看发布状态 `kubectl rollout status deployment/<name> -n <namespace>`
查看发布历史 `kubectl rollout history deployment/<name> -n <namespace>`

这张表的意义是快速取证,不是鼓励在生产环境中边猜边改。涉及删除、强制重启、修改资源、回滚发布、驱逐Pod或下线节点的动作,应遵守变更流程和应急权限边界。

把一次排障变成团队能力

故障恢复后,排障并没有结束。平台团队应把证据整理成复盘材料,至少包含:现象和影响面、时间线、触发因素、直接原因、根因判断、恢复动作、残余风险和改进项。

如果复盘只写“重启后恢复”,下次仍然会重复救火。更有价值的复盘应回答:为什么监控没有提前发现,为什么发布前没有拦住,为什么权限或配置允许风险进入生产,为什么团队没有清晰回滚边界。

这也是Kubernetes平台化运维的重要差异。单个工程师可以靠经验处理一次故障,但企业需要把经验沉淀为监控规则、发布门禁、资源配额、安全策略、知识库和演练机制。

下一步建议

建议平台团队先选择最近3次Kubernetes故障复盘,按本文的6类证据链重新整理一次:Pod与日志、事件、节点资源、网络路径、存储配置、发布变更。检查哪些证据当时缺失,哪些命令依赖个人经验,哪些信息没有进入统一可观测系统。

下一步可以把高频故障固化为平台检查项:发布前自动检查探针、资源请求、镜像来源和配置引用;运行中统一采集事件、日志、指标和审计;故障后沉淀复盘模板和改进项闭环。若当前工具链无法支撑这些动作,可以进一步评估企业级容器平台、可观测体系和稳定性治理能力。

FAQ

Kubernetes故障排查第一步应该做什么?

第一步应确认影响面和业务优先级:是单个Pod、单个应用、单个Namespace,还是多个集群或核心业务受影响。影响面确定后,再决定是否先止血、回滚、切流或进入完整排查。

Pod是Running为什么应用仍然不可用?

Running只表示容器进程处于运行状态,不代表业务可服务。还需要检查Readiness探针、Service端点、网关路由、应用日志、下游依赖、错误率和关键接口是否正常。

命令清单能否替代排障流程?

不能。命令清单只能帮助取证,真正的排障流程需要判断现象、收集证据、验证假设、执行恢复、保留现场并复盘。没有判断顺序的命令越多,越容易造成误操作。

什么时候应该回滚Deployment?

当证据显示故障与新镜像、新配置或Deployment变更高度相关,并且回滚不会引入数据、依赖或兼容风险时,可以按变更流程回滚。若问题来自外部依赖、存储、网络策略或数据库变更,单纯回滚可能无效。

原创声明:本文为 Alauda 原创技术内容,非商业转载须注明出处:https://www.alauda.cn/blog/459/。

文中图示和文章内容未经许可不得用于商业转载、培训课件、营销材料或二次分发。

(0)
K8s入门教程:企业新人4阶段部署第一个应用
上一篇 2026年6月30日 下午5:27
AI基础设施全景:算力、存储、网络与平台治理
下一篇 2026年6月30日 下午8:55

相关推荐