Sunday面试指南

Kubernetes 三种探针有什么区别?存活、就绪和启动检查失败后会怎样?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:Kubernetes 的 liveness、readiness 和 startup 探针怎么分?

🙋‍♂️ 我:存活判断进程是否正常,就绪判断能不能接请求,启动判断应用有没有启动好。

🧑‍💻 面试官:readiness 失败,会重启容器吗?应用启动要两分钟,liveness 十秒就开始检查,会有什么问题?

🙋‍♂️ 我:readiness 不负责重启;启动慢时,需要避免被存活探针提前杀掉。

🧑‍💻 面试官:那数据库短暂不可用,三个探针都返回失败,是更保险,还是把服务反复重启了?

先说失败后要采取什么动作:「继续等启动、暂时不接流量,还是重启恢复」。

面试速答(60 秒版)

startupProbe 给应用启动阶段一个独立检查。配置它以后,在启动探针成功前,存活和就绪探针不会开始执行;启动检查持续失败达到阈值时,会终止相应容器,再按重启策略处理。

readinessProbe 判断当前是否适合接流量。失败会让 Pod 不再作为常规 Service 流量的就绪后端,但不会仅因为就绪失败就重启容器。

livenessProbe 判断是否需要通过重启恢复。失败达到阈值时,kubelet 会终止相应容器,并按重启策略处理。因此,不能把所有外部依赖故障都塞进存活检查,避免一个数据库问题引发所有实例反复重启。探针内容与时间预算都要按应用真实状态设计。

Kubernetes 启动就绪存活探针的失败动作

知识点详解:应用启动慢,和应用卡死,是两种问题

探针在问谁,谁来执行动作?

假设咱们把一个 API 服务放在 Pod 里运行。进程还在,不代表它已经能接请求,也不代表重启就能解决当前问题。

探针由 kubelet 对相应容器执行诊断,可以通过 HTTP、TCP、exec 或 gRPC 等方式检查。检查结果交给对应机制处理,而不是应用自己看到失败就必须退出。

三种探针可能都使用 HTTP 接口,但接口相似不代表职责相同。真正需要区分的是判断目标与失败后的动作。Kubernetes 探针文档说明了这些规则。

启动探针,避免还没开门就被判坏

假设服务启动时需要加载配置和预热数据,正常要一段时间。

如果存活探针太早开始,并把“还没准备好”当成故障,容器可能在每次启动过程中被杀掉。它又重新启动,再被同一个检查杀掉,始终走不到可用状态。

startupProbe 可以先判断启动是否完成。在成功之前,liveness 和 readiness 被这个启动阶段挡住,不会提前参与检查。

启动成功后,才进入正常的存活与就绪检查。启动探针不是每次业务请求都重复执行的健康判断,也不替后续阶段永久担保。

给它的预算应覆盖合理的启动长尾,同时仍能发现真正卡在启动阶段的实例。预算可以结合 failureThreshold 与 periodSeconds 等估算,但精确触发时刻还受初始延迟、检查耗时与调度影响,不能当成严格秒表。

启动探针成功前屏蔽存活和就绪检查

就绪失败,是先把流量绕开

假设服务已经启动,但当前正在恢复某项必要连接,暂时不能正确处理请求。

readiness 返回失败,可以让这个 Pod 不再作为常规 Service 流量的就绪后端。其他就绪实例继续承担请求,当前容器可以留着恢复。

这里的“摘流量”不是瞬间撤销所有网络连接,也不保证所有访问方式都消失。已有请求、直连 Pod,以及特殊的 Service 或流量配置,需要分别理解。

所以,就绪失败后还需要考虑正在处理的请求怎么办。容器没有被重启,也不代表里面所有工作自动安全结束。

等它恢复并通过就绪检查,再重新进入相应流量范围。这适合某些可恢复的暂时状态,不必把它们全部转成重启。

readiness 失败后的 Service 流量分配

存活失败,为什么需要特别谨慎?

假设进程陷入无法自行恢复的卡死,重启可能让服务重新取得进展。这才是 liveness 常见的使用目的。

达到失败阈值后,kubelet 会终止对应容器,再依据 restartPolicy 等规则决定后续处理。常见服务工作负载使用可重启策略,但不能省略这些条件,断言任何 Pod 都一定无限重启。

它通常重启的是相应容器,不是因为一次探针失败就必然删除并重建整个 Deployment。

如果把数据库可用性作为所有实例的存活条件,数据库短暂故障时,整个服务可能开始一轮轮重启。重新连接和预热又增加依赖压力,恢复反而更困难。

外部依赖是否影响 readiness,也要看当前服务是不是完全不能接任何有用请求。有合法降级能力时,判断可能不同。不要把“查得越深越保险”当成探针设计原则。

数据库短暂故障可能被存活探针放大

三个接口,应该表达三种状态

可以把接口职责理解成下面这样,而不是直接把它们全部代理到同一个深度检查。

状态要回答的问题失败后主要动作
启动初始化是否已经完成?持续失败达到阈值,终止并按策略处理
就绪当前适不适合接常规流量?标记不就绪,不因此直接重启
存活当前是否需要通过重启恢复?失败达到阈值,终止并按策略处理

检查还应该足够轻量,响应结构清楚。健康接口本身很慢,可能在高负载时制造假故障;每次都执行昂贵外部查询,也可能让检查成为新的负担。

本文不提供一份声称适合所有服务的固定 YAML。路径、端口、时间预算和失败条件,应来自应用设计与真实测试,不能复制一个数值就认定可以上线。

怎样验证没有“越检查越糟”?

在测试环境分别制造启动较慢、暂时无法接请求、进程卡死和依赖短暂故障。

检查启动阶段是否有完整机会、就绪失败是否只改变接流量资格、存活失败是否按预期触发容器处理,以及依赖恢复后有没有不必要的重启风暴。

再看 Pod Events、探针失败原因、容器重启次数和流量结果。不是健康接口返回一次 200,就证明三个阶段都正确。

面试官继续追问

readiness 失败,为什么进程还在?

这是设计职责:它改变接流量资格,不负责直接重启。应用可以留在原地恢复相应状态。

startup 成功了,以后还会再帮应用判健康吗?

后续阶段交给存活与就绪检查。容器再次启动时会重新经历启动阶段,但不能把一次成功当成永久健康证明。

TCP 端口能连接,就说明业务正常吗?

只能证明对应检查条件满足。端口接受连接,不保证业务依赖、请求处理与响应内容都符合要求,探针需要匹配自己真正想判断的能力。

面试速记卡

  • startup:先确认启动完成,成功前挡住 liveness 与 readiness。
  • readiness:调整接常规 Service 流量的资格,不因此直接重启。
  • liveness:判断是否需要重启恢复,达到阈值后按容器策略处理。
  • 依赖故障:不一律变成存活失败,避免重启与依赖压力互相放大。
  • 验证:慢启动、暂时不就绪、卡死与依赖恢复分别测试。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历