别让探针害了你:一次价值百万的Kubernetes健康检查惨案

欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓

关注公众号,免费学技术~

如有问题欢迎添加作者微信👉:15011572657


一、事故现场:凌晨的噩梦

凌晨 2 点,某金融公司监控系统报警:支付服务异常中断。几分钟内,多个微服务进入“CrashLoopBackOff”状态,业务全面瘫痪。

短短 37 分钟,交易中断造成直接经济损失超百万元。

事后排查发现——罪魁祸首竟是一个看似无害的配置项:存活探测(Liveness Probe)

在这次事故中,探测路径 /healthz 被配置为判断容器是否“活着”,但该路径在应用完全启动前即能响应 200 状态码。
结果 Kubernetes 误以为容器“活着”,但实际上核心模块尚未加载完成,服务无法响应外部请求。探针持续判定失败 → Pod 被不断重启 → 所有实例陷入“死亡循环”。

一句话总结:
👉 探针没错,错的是我们不理解它。

二、两个探针,两个世界

很多开发者、甚至资深运维都对这两个探针的作用模糊不清。
要真正避免类似事故,必须理解它们的本质区别。

1️⃣ 存活探测(Liveness Probe)

问题:应用程序是不是“死”了?

  • 失败后果:Kubernetes 重启容器

  • 适用场景:检测程序死锁、线程卡死、不可恢复异常

  • 关键原则必须幂等,不能因重启带来副作用

示例配置:

livenessProbe:  httpGet:    path: /healthz    port: 8080  initialDelaySeconds: 30   # 必须大于应用最长启动时间  periodSeconds: 10  timeoutSeconds: 5  failureThreshold: 3

2️⃣ 就绪探测(Readiness Probe)

问题:应用程序准备好接收流量了吗?

  • 失败后果:Pod 从 Service 负载列表中移除

  • 适用场景:应用启动缓慢、初始化资源、外部依赖未就绪

  • 关键原则保护应用免受未准备好的流量冲击

示例配置:

readinessProbe:  httpGet:    path: /ready    port: 8080  initialDelaySeconds: 10  periodSeconds: 5  failureThreshold: 2

📘 一句话总结区别:

存活探测负责“活着”,就绪探测负责“能干活”。


三、实战:健康检查的正确打开方式

1. HTTP 检查(最常用)

httpGet:  path: /health  port: 8080

适合 Web 服务,返回 200 即视为成功。

2. Exec 检查(执行命令)

exec:  command: ["cat", "/tmp/healthy"]

3. TCP Socket 检查

tcpSocket:  port: 3306

适用于数据库、Redis 等非 HTTP 服务,只检查端口连通性。

四、三个真实场景下的最佳实践

✅ 场景一:启动依赖多,加载时间长

readinessProbe:  httpGet:    path: /ready    port: 8080  initialDelaySeconds: 20  failureThreshold: 10  # 给依赖服务充分启动时间

启动慢不是错,错的是没告诉探针“等等我”。

✅ 场景二:存活探测太“勤快”导致雪崩

livenessProbe:  httpGet:    path: /health    port: 8080  initialDelaySeconds: 60  periodSeconds: 30  failureThreshold: 2

探测频繁 + 超时太短 = 自己把自己打死

✅ 场景三:数据库服务混合探测

livenessProbe:  tcpSocket:    port: 3306  initialDelaySeconds: 300
readinessProbe:  exec:    command:    - mysql    - -h127.0.0.1    - -e    - "SELECT 1"

先探活,再探“能不能用”。

五、常见坑与解决方案

常见问题

典型症状

正确做法

存活探测太敏感

Pod 无限重启

调大 failureThreshold、延长 initialDelaySeconds

就绪探测路径错误

Pod 永远未就绪

确保探测路径返回 200 状态码

探测逻辑太重

应用 CPU 飙升

使用轻量级接口,如内存级变量判断

忽略启动顺序

应用依赖未就绪

结合 Init Container 或延时策略

六、快速排查思路

查看探针事件

kubectl describe pod <pod-name>

重点关注:

Liveness probe failed: container will be restartedReadiness probe failed: container will be removed from service endpoints

查看Pod日志

kubectl logs <pod-name>


检查Pod就绪状态

kubectl get pods -o wide

READY 一列显示:当前就绪容器数/总容器数。


七、结语:健康检查不是装饰,而是生死线

Liveness Probe 和 Readiness Probe 是 Kubernetes 自愈与高可用的核心机制。
正确使用它们,可以:

  • 自动恢复故障实例

  • 实现零停机部署

  • 防止流量雪崩

  • 提升系统韧性

反之,一个配置错误,可能让集群在凌晨全线崩溃。

在 Kubernetes 世界里,健康探针不是“锦上添花”,而是“保命符”。



✅ 检查清单(送你一句话总结)

探针类型

判断问题

失败后果

建议策略

Liveness

活着没?

重启容器

慢一点、稳一点

Readiness

能干活吗?

下线流量

灵敏一点、轻一点

💡 温馨提醒
现在,回头检查你的 Pod YAML ——
是否有探针配置太激进?路径是否正确?延时是否充足?
别等到下一个凌晨,才发现代价有多大。

END

➤  往期精彩回顾

图片

图片

欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩先超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值