探究 kubernetes 探针参数 periodSeconds 和 timeoutSeconds
问题起源
kubernetes probes 的配置中有两个容易混淆的参数,periodSeconds和timeoutSeconds,其配置方式如下:
官方对这两个参数的解释如下:
periodSeconds: How often (in seconds) to perform the probe. Default to 10 seconds. The minimum value is 1.
timeoutSeconds: Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1.
意思是说periodSeconds表示执行探针的周期,而timeoutSeconds表示执行探针的超时时间。
网上有不少针对这两个参数的讨论(如下),其中涉及到一个问题,如果timeoutSeconds > periodSeconds 会怎么样?
其中在上面的第 3 篇中对timeoutSeconds>periodSeconds的情况有如下描述,即在这种情况下,如果探针超时,则探针周期等于timeoutSeconds。那么这种说法是否正确呢?
If you had the opposite (
timeoutSeconds=10,periodSeconds=5), then the probes would look as follows:
源码探究
鉴于网上众说纷纭,我们通过源码来一探究竟。
kubernetes 的探针机制是由 kubelet 执行的,目前支持exec、grpc、httpGet、tcpSocket这 4 种探针方式。
探针的代码逻辑并不复杂,以 v1.30.2 的代码为例,其入口函数如下,可以看到它会启动一个周期为w.spec.PeriodSeconds(即探针中定义的periodSeconds)定时器,周期性地执行探针。
现在已经找到periodSeconds的用途,下一步需要找到timeoutSeconds。
- 首先进入 - doProbe函数,它调用了- w.probeManager.prober.probe:
- 下面的 - probe函数用于执行一个特定的探针。需要注意的是,它调用了- pb.runProbeWithRetries,其中- maxProbeRetries值为 3,说明在一个周期(- periodSeconds)中最多可以执行 3 次探针命令:
- runProbeWithRetries的注释说明,可能会执行多次探针,直到探针返回成功或全部尝试失败:
- 在 - runProbe函数中,最终找到了- timeoutSeconds对应的参数- p.TimeoutSeconds,其作为各个探针命令的超时参数,如在- httpGet类型的探针中,它作为了- httpClient的请求超时时间:
至此我们可以拼接出periodSeconds和timeoutSeconds的关系,其逻辑关系与如下代码类似。
总结
- periodSeconds用于启动一个周期性调用探针命令的定时器,而- timeoutSeconds作为探针命令的超时参数
- timeoutSeconds和- periodSeconds之间并没有明确的关系。如果- timeoutSeconds=10s,- periodSeconds=5s,则本次探针周期可能为[5s, 30s)之内的任意值,并不是该文中说的- periodSeconds=timeoutSeconds(由于本文写于 3 年前,经查阅- v1.19.10版本代码,逻辑上与现有版本代码相同。)
- 由于健康检查的逻辑大部分都不会很复杂,如检查某个文件是否存在,检查服务的 - /hleathzhttp endpoint 是否可以访问等,因此建议将- timeoutSeconds设置为一个小于- periodSeconds的合理的值。
failureThreshold/successThreshold和maxProbeRetries的关系
- maxProbeRetries用于定义一次探针周期内探针命令执行的最大尝试次数;
- 如果在一个探针周期内,探针命令返回成功,则 - successThreshold加 1,反之- failureThreshold加 1;
文章转载自:charlieroro








 
    
评论