在K8S中,Pod的探针有哪些及用途?
在 Kubernetes 中,Pod 的探针(Probe)是由 kubelet 定期执行的诊断检查,用于判断容器的运行状态,从而实现自动恢复或流量控制。Kubernetes 提供了三种类型的探针,分别用于不同场景:
1. 存活探针(Liveness Probe)
用途:检测容器是否「存活」(运行状态是否正常)。若探针失败,kubelet 会根据容器的 restartPolicy
(重启策略)重启容器,用于处理容器「假死」(如死锁、进程无响应)等情况。
工作机制:
- 当探针检测失败(连续多次未通过),kubelet 会杀死容器并重启它。
- 若容器未配置存活探针,默认状态为「存活」(永远不会被 kubelet 主动重启)。
适用场景:
- 应用可能因内部错误(如死锁)导致进程存在但无法提供服务的情况。
- 例如:Web 服务进程未崩溃,但无法处理 HTTP 请求(返回 500 错误)。
探测方式:
httpGet
:向容器的指定端口和路径发送 HTTP 请求,返回状态码200-399
视为成功。tcpSocket
:尝试与容器的指定端口建立 TCP 连接,连接成功视为正常。exec
:在容器内执行指定命令,命令退出码为0
视为成功。
2. 就绪探针(Readiness Probe)
用途:检测容器是否「就绪」(是否可以接收请求)。若探针失败,kubelet 会将该 Pod 从对应 Service 的端点列表(Endpoint)中移除,直到探针恢复成功,避免将流量转发到未准备好的容器。
工作机制:
- 探针失败时,仅移除流量路由,不会重启容器(与存活探针的核心区别)。
- 容器启动后,就绪探针首次成功前,Pod 会处于「未就绪」状态(
NotReady
)。
适用场景:
- 容器启动后需要初始化(如加载配置、预热缓存),暂时无法处理请求的情况。
- 应用运行中临时无法服务(如依赖的数据库连接中断),但无需重启的情况。
探测方式:
与存活探针相同(httpGet
、tcpSocket
、exec
),但语义不同(关注「可用性」而非「存活状态」)。
3. 启动探针(Startup Probe)
用途:检测容器是否「启动完成」,主要用于处理启动时间较长的容器(如大型应用、初始化步骤复杂的服务)。它会优先于存活探针和就绪探针执行,直到成功为止。
工作机制:
- 若启动探针未成功,kubelet 会根据
restartPolicy
重启容器,避免存活探针在容器未完全启动时频繁判定失败。 - 启动探针成功后,存活探针和就绪探针才开始生效。
适用场景:
- 应用启动时间超过存活探针超时时间的情况(如需要 5 分钟初始化的服务)。
- 防止存活探针在容器启动阶段误判为失败而不断重启。
探测方式:
与前两种探针相同,但通常设置更长的超时和间隔时间(如 failureThreshold=30
、periodSeconds=10
,允许最长 300 秒启动时间)。
总结:三种探针的核心区别
探针类型 | 核心目标 | 失败动作 | 典型场景 |
---|---|---|---|
存活探针 | 容器是否「活着」 | 重启容器 | 处理死锁、进程无响应 |
就绪探针 | 容器是否「可服务」 | 移除流量路由 | 启动初始化、临时不可用 |
启动探针 | 容器是否「启动完成」 | 重启容器(启动阶段) | 处理慢启动应用 |
通过合理配置这三种探针,可显著提高 Pod 的可用性和稳定性,确保应用在各种异常状态下能自动恢复或隔离。