k8s startupProbe最佳实践

前言:

先举一个探针配置的例子

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 感知故障的速度。

我们可以通过日志系统分析服务多次的启动时间,如下图


image.png

图中可以知道做大值是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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容