1. 就绪探针(Readiness Probe)失败 = 切断流量
这是它的本职工作。当就绪探针检测到应用还没准备好(比如正在启动、或者依赖的数据库连不上)时,Kubernetes 会把这个 Pod 从 Service 的负载均衡池中剔除。此时,Pod 依然活着,但外部用户的请求已经打不进来了。
2. 存活探针(Liveness Probe)失败 = 切断流量 + 杀掉重启
虽然存活探针的最终目的是“重启容器”,但在它触发重启之前,Kubernetes 同样会先切断流量。当存活探针判定容器已经“假死”或崩溃时,K8s 不仅会将其从流量路由中移除,还会直接杀死该容器并根据策略重新启动它。
● 对外的表现是一致的:无论 K8s 内部走的是哪条逻辑,这个 Pod 都会瞬间失去所有的外部流量,用户完全无感知。
● 内部的结局不同:因为存活探针失败了,K8s 的下一步动作是“杀头重开”(强制重启);而如果仅仅是就绪探针失败,K8s 只会让它“原地等待”。
● 存活探针(Liveness) 就是你的“自我意志”。它只关注自己内部有没有崩溃、有没有死锁。只要我自己没病,哪怕外面狂风暴雨、数据库全挂了,我也依然要坚强地活着(不被重启),只是暂时关门谢客(就绪探针切断流量)。
● 如果把自己的生死交给了外部依赖,那就相当于把命运交给了别人。一旦外部环境恶化,自己就会跟着陪葬,这在系统设计中叫“耦合度过高”,在人生中叫“丧失独立性”。
最核心的法则就是:“生死大权必须掌握在自己手里。”
1. 存活探针(Liveness Probe):只查自己,绝不外求
● 核心原则:保持极度的简单和轻量。它只检测应用内部的状态,比如主线程是否还活着、进程是否卡死、内存是否溢出。
● 避坑指南:绝对不要在 Liveness 探针里去 ping 数据库或外部服务。因为如果数据库真的挂了,所有 Pod 的 Liveness 探针都会失败,K8s 会认为整个集群的应用都坏了,从而疯狂重启所有的 Pod,引发灾难性的雪崩效应。
2. 就绪探针(Readiness Probe):可以查依赖,控制流量
● 核心原则:负责评估应用是否真正具备处理请求的能力。
● 实战做法:你可以放心地在 Readiness 探针中加入对数据库、Redis 或 ES 的连接检查。当这些外部组件出故障时,Readiness 探针失败,K8s 只会把这个 Pod 从 Service 的后端列表中剔除(停止分配新流量),但绝对不会重启容器。这就给了应用一个喘息的机会,一旦数据库恢复,流量自然就会回来。
“双管齐下”的配置是非常安全的:它们共同为你守住了第一道防线(绝对不让有问题的请求进来),而存活探针则负责在必要时执行第二道防线(自动修复故障)。