找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1122

积分

0

好友

144

主题
发表于 2025-12-25 08:17:31 | 查看: 34| 回复: 0

Kubernetes 功能强大,但在复杂的生产环境中,一旦出现问题,排查往往涉及多个层面。大多数故障并非源于 Kubernetes 自身缺陷,而是资源、配置、网络与权限等组合因素导致的结果。

本文将系统梳理 K8s 生产环境中最常见的 20 类故障现象,并按排查方向进行分类归纳,帮助你在面对问题时能够快速定位,思路清晰。

01 Pod 启动与运行类故障(最常见)

1) Pod 一直处于 Pending 状态

常见原因

  • 节点资源不足:CPU 或内存(Memory)耗尽。
  • 调度规则不匹配:NodeSelector / Affinity 条件无法满足。
  • 存储未就绪:PersistentVolumeClaim (PVC) 处于 Pending 状态,未绑定到可用的 PV。
  • 污点不容忍:节点存在 Taint,而 Pod 未配置相应的 Toleration。

排查指令kubectl describe pod <pod-name> 查看详细事件。

2)ImagePullBackOff / ErrImagePull

常见原因

  • 镜像信息错误:镜像名称或标签(tag)拼写错误。
  • 私有仓库认证失败:未正确配置 imagePullSecrets
  • 网络不通:节点无法访问指定的镜像仓库地址。

排查建议:查看 Pod 的 Events 信息通常比查看容器日志更直接有效。

3) CrashLoopBackOff

常见原因

  • 应用自身崩溃:容器启动后,主进程立即退出。
  • 配置错误:应用配置文件、环境变量有误。
  • 端口冲突:容器内端口已被占用。
  • 探针配置过严:Liveness 或 Readiness 探针过早失败,导致重启循环。

排查重点

  • 查看容器最近一次的启动日志:kubectl logs <pod-name> --previous
  • 关注 Pod 的 restartCount

4) Readiness 探针失败,Pod 不接收流量

常见原因

  • 探针配置错误:检查路径、端口或命令不正确。
  • 应用启动缓慢:在探针超时前,应用尚未完成初始化。
  • 依赖未就绪:Pod 依赖的数据库、缓存等外部服务不可用。

典型表现:Pod 状态为 Running,但通过 Service 无法访问。

5) Liveness 探针导致 Pod 频繁重启

典型问题

  • 探针误用:将业务逻辑检查(如依赖数据库)放入 Liveness 探针,一旦依赖抖动,Pod 就会被重启。
  • 网络抖动误判:因网络瞬间波动导致探针失败,触发不必要的重启。

生产建议:Liveness 探针应用于判断进程本身是否存活,配置应相对保守,避免过度敏感。

02 节点与资源类故障

6) 节点状态为 NotReady

常见原因

  • Kubelet 异常:进程崩溃或配置错误。
  • 磁盘空间耗尽:根目录或特定分区 100% 使用。
  • 内存耗尽:节点 OOM,系统不稳定。
  • 网络分区:节点与控制平面网络中断。

排查路径:使用 kubectl describe node <node-name> 查看节点条件,并登录节点检查 kubelet 服务日志。

7) Pod 被 OOMKilled

原因

  • 内存限制过小:Pod 或容器的 memory.limits 设置低于应用实际需求。
  • 应用内存泄漏:应用自身存在 Bug,内存使用量持续增长直至突破限制。

核心认知OOMKilled 是 Linux 内核行为,不是 Kubernetes 的 Bug,本质是资源规划问题。

8) CPU 被限流,应用性能下降

典型表现

  • CPU Limit 设置过低:应用在业务高峰期的实际 CPU 需求超过了预设的 limits
  • 负载预估不足:未充分考虑突发流量或批处理任务的资源需求。

重要提示:CPU limits 是硬性上限,一旦达到,容器进程将被内核限流(Throttling),导致响应变慢。在云原生/IaaS环境中,需结合监控数据合理设定。

9) 节点磁盘压力(DiskPressure)

常见来源

  • 容器日志膨胀:未配置日志轮转(logrotate)或日志级别不当。
  • emptyDir 滥用:临时卷写入大量数据且未清理。
  • 镜像层堆积:未定期执行镜像垃圾回收。

关联影响:磁盘满往往是导致 Node NotReady 的深层原因之一。

03 网络与 Service 类故障

10) Service 访问间歇性超时

常见原因

  • kube-proxy 规则异常:iptables/IPVS 规则未正确同步。
  • Pod 就绪状态抖动:Endpoint 列表因 Pod Readiness 变化而频繁更新。
  • Conntrack 表满:节点连接跟踪表耗尽,影响新建连接。

排查思路:这类网络/系统层面问题,必须结合具体节点的网络状态和内核参数进行分析。

11) Pod 之间网络不通

可能原因

  • CNI 插件异常:网络插件(如 Calico, Flannel)的 DaemonSet 或配置有问题。
  • NetworkPolicy 拦截:存在网络策略(NetworkPolicy)禁止了 Pod 间的流量。
  • 底层网络问题:MTU 不匹配、VXLAN/IPIP 隧道故障等。

优先检查项:确认是否被预期的网络策略(NetworkPolicy)所阻挡。

12) NodePort 可访问,但 ClusterIP 无法访问

多见于

  • kube-proxy 进程故障:负责 Service 虚拟IP转发的组件异常。
  • iptables/IPVS 规则损坏:规则被意外清理或与其他软件冲突。

临时解决:有时重启节点上的 kube-proxy Pod 即可恢复。

13) Ingress 访问异常

常见问题

  • 后端 Service 配置错误:Service 端口号、名称写错。
  • Ingress Controller 异常:Nginx Ingress、Traefik 等控制器 Pod 有问题。
  • 证书问题:TLS 证书过期或格式错误。

排查步骤:首先检查 Ingress Controller 的日志输出。

04 发布、升级与控制器类故障

14) Deployment 滚动更新卡住

原因

  • 新 Pod 就绪失败:新版本 Pod 的 Readiness 探针始终无法通过。
  • 更新策略过保守maxUnavailable 设置为 0,且新 Pod 无法就绪,导致旧 Pod 无法被替换。

机制理解:Deployment 会确保在旧 Pod 完全停止前,新 Pod 必须就绪,否则会暂停滚动。

15) 升级后业务异常,但 Pod 状态正常

典型原因

  • 配置变更引发问题:新版本镜像依赖的 ConfigMap/Secret 内容有误。
  • 依赖服务不兼容:新版本应用与下游的数据库、API 接口等存在版本不匹配。

重要提醒:Kubernetes 只保证 Pod “存活”,不保证业务逻辑 “正确”。

16) 实际 Pod 副本数与预期不符

可能原因

  • HPA 正在工作:Horizontal Pod Autoscaler 根据指标动态调整了副本数。
  • 手动干预遗留:有人直接修改了底层的 ReplicaSet 对象。
  • 多控制器冲突:多个控制器(如 Deployment 和 StatefulSet)管理了同一组 Pod 标签。

黄金法则:永远以 Deployment(或 StatefulSet)声明的 replicas 数为最终期望状态。

05 权限、安全与配置类故障

17) Pod 内应用无法访问 Kubernetes API

原因

  • ServiceAccount 权限不足:关联的 RBAC Role 或 ClusterRole 未授予相应权限。
  • Token 未挂载:Pod 未使用默认或指定的 ServiceAccount。
  • RBAC 拒绝访问:显式配置的规则拒绝了该请求。

关键线索:查看错误信息中是否包含 Forbidden

18) 更新了 ConfigMap/Secret,但 Pod 内未生效

常见于

  • 未重启 Pod:以环境变量(env)方式注入的配置,更新后需重启 Pod。
  • 使用方式限制:通过 volume 挂载的配置,虽然会更新,但部分应用可能需要发送信号或热重载才能读取新配置。

核心概念:配置更新 ≠ 应用热更新,需根据注入方式决定后续操作。

19) Job / CronJob 未按预期执行

原因

  • 并发策略限制.spec.concurrencyPolicy 设置为 ForbidReplace,且已有 Job 在运行。
  • 历史 Job 未清理.spec.failedJobsHistoryLimit / .spec.successfulJobsHistoryLimit 设置过小,导致资源被占满。
  • 节点时间不同步:CronJob 的调度基于控制平面节点时间。

排查对象:关注 Job 对象本身的状态,而非其创建出的 Pod。

20) 集群“一切正常”,但业务不可用

最危险的一类问题

  • 监控指标缺失:缺乏针对业务逻辑(如订单成功率、接口响应时间)的有效监控。
  • 没有定义 SLO/SLI:未建立清晰的服务水平目标与指标。
  • 过度关注基础设施:只检查了 Pod、Node 状态,未验证核心业务链路。

根本认知Kubernetes 集群健康不等同于业务应用健康。完善的运维/DevOps体系需要建立从基础设施到业务层的全栈可观测性。

总结

Kubernetes 生产环境中的事故,绝大多数源于资源规划、配置管理、网络策略以及对系统机制的认知偏差。熟练掌握以上 20 类常见故障的排查思路,能帮助你有效应对大部分线上挑战,提升系统稳定性。




上一篇:小红书账号包装实战:内容有赞却涨粉慢的底层优化方案
下一篇:深入解析ELF文件头部结构:Linux系统编程与逆向工程基础
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 20:14 , Processed in 0.295484 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表