前言:
先举一个探针配置的例子
spec:
......
spec:
containers:
......
livenessProbe:
httpGet:
path: /healthy
port: 5000
scheme: HTTP
failureThreshold: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
上面的探针对于启动快的应用是适用的,比如说nginx 前端应用,但对于启动非常慢的大型应用,如果我们按照上面的例子来配置 Readiness 和 Liveness 探针,Pod 将因为探针失败而永远无法启动。
对于一些大型的 Java 应用来说,往往需要数分钟时间才能够完成启动。
StartupProbe 探针特别适用于业务应用启动慢的场景。当 Pod 启动时,如果配置了 StartupProbe,那么 Readiness 和 Liveness 探针都将被临时禁用,直到 StartupProbe 探针返回成功才会启用 Readiness 和 Liveness 探针,这也就避免了 Readiness 和 Liveness 在应用启动阶段造成的干扰。也就是说,我们只要为业务配置合理的 StartupProbe 探针,就可以解决应用启动慢导致其他探针认为 Pod 不健康的问题。
StartupProbe设置经验
一个例子
spec:
containers:
- name: your-container
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
initialDelaySeconds: 120
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1
参数名称 | 参数描述 |
---|---|
initialDelaySeconds: 120 | 初始化延迟时间,告诉 kubelet 在执行第一次探测前应该等待多少秒,默认是 0 秒,最小值是 0 |
periodSeconds: 10 | 探测周期间隔时间,指定了 kubelet 应该每多少秒执行一次存活探测,默认是 10 秒。最小值是 1 |
timeoutSeconds: 5 | 单次探测超时时间,探测的超时后等待多少秒,默认值是 1 秒,最小值是 1。 |
successThreshold: 1 | 从失败转为成功的重试次数,探测器在失败后,被视为成功的最小连续成功数,默认值是 1,存活探测的这个值必须是 1,最小值是 1。 |
failureThreshold: 30 | 从成功转为失败的重试次数,当 Pod 启动了并且探测到失败,Kubernetes 的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃 Pod 会被打上未就绪的标签,默认值是 3,最小值是 1。 |
设置合适的initialDelaySeconds和failureThreshold的值
即使有了 StartupProbe也是需要配置合理的字段值的,如果将 initialDelaySeconds 字段的值从 10 秒钟修改到 120 秒。这当然是可以的,但如果启动时间不是 120 秒,或者你不太确定呢?那似乎可以在修改了 initialDelaySeconds 的基础上再将失败次数 failureThreshold 或者探测间隔 periodSeconds 加大。
这个值需要设置一个合适的最大值,如果为了兼容应用启动慢的问题,我们主动降低了 kubernetes 检测 Pod 健康状态的频率,这会延迟 kubernetes 感知故障的速度。
我们可以通过日志系统分析服务多次的启动时间,如下图
图中可以知道做大值是251,最小值是223,我们可以分析出最大和最小之间有28秒的偏差,保险起见我们可以在最大值的基础上再预留30秒的启动时间,所以我们假设服务最长启动时间为280
从图片中可以看出每次启动都不会低于100s,最小的也是223,我们可以在最小的基础上,稍微小一点,比如将initialDelaySeconds 设置为200s,periodSeconds 周期我们可以保持为10s,那我们剩下就是要计算出合适的failureThreshold 的值。我们可以通过公式,失败阈值=(最长启动时间-初始延迟)/探测周期 得知失败阈值等于16,那么我们就得到了下面的探针配置。
spec:
containers:
- name: your-container
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 16
initialDelaySeconds: 200
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1