Kubernetes 探针配错,Pod 会反复重启而不是直接报错

举报
yd_286814013 发表于 2026/10/27 11:59:35 2026/10/27
【摘要】 探针是 k8s 里最容易被复制粘贴带错的东西。三个探针各管一件事,配错的后果不是报错,而是 Pod 被无声无息地重启,日志里只有一行容器退出。livenessProbe 管的是「活着吗」。失败就往死里重启。它只该检查进程本身还能不能响应,绝对不要在这里查数据库和下游服务。把下游依赖写进 liveness 是最常见的错配:下游抖三秒,你的整个服务被 kubelet 连环重启,本来只是慢查询,最...

探针是 k8s 里最容易被复制粘贴带错的东西。三个探针各管一件事,配错的后果不是报错,而是 Pod 被无声无息地重启,日志里只有一行容器退出。

livenessProbe 管的是「活着吗」。失败就往死里重启。它只该检查进程本身还能不能响应,绝对不要在这里查数据库和下游服务。把下游依赖写进 liveness 是最常见的错配:下游抖三秒,你的整个服务被 kubelet 连环重启,本来只是慢查询,最后变成雪崩。原则是 liveness 的检查范围不要超出本进程边界。

readinessProbe 管的是「能接流量吗」。失败只是从 Service endpoints 里摘掉,容器不重启。依赖检查、预热未完成、连接池未建立,这些该放这里。滚动更新时它决定新 Pod 什么时候算就绪,配得太宽松会把还没热好的实例放进负载均衡,用户看到的是一波 502。

startupProbe 管的是「启动完了吗」。它通过之前,另外两个探针都不生效。给 JVM 应用准备启动时间最合适,避免为了迁就启动慢而把 liveness 的 initialDelaySeconds 调到 120 秒——那样真的死锁也要等两分钟才发现。

几个具体数值上的坑。timeoutSeconds 默认只有 1 秒,业务接口 GC 停顿一下就成了失败,建议至少 3 秒。failureThreshold 默认 3,配合 periodSeconds 10 秒,意味着 30 秒内连续失败才动作,这个组合对 liveness 来说通常太激进,可以放到 5 次。exec 探针每次都要 fork 一个进程,在高频下本身就有开销,能用 httpGet 就别用 exec。

排查方法:kubectl describe pod 看 Events 里的 Liveness probe failed 和 Killing container,再看 restarts 计数和间隔。如果是固定周期重启,基本就是探针问题;间隔不规律,更像是资源压力下的 OOMKilled,去查 lastState 的 exitCode 是不是 137。

一个经验值:任何探针配置上线前,把 periodSeconds 乘 failureThreshold 算成一个总容忍时间,问自己一句「我的服务真的能在这么久内恢复吗」。算不出来就是没想清楚。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。