前言:
先舉一個探針配置的例子
spec:
......
spec:
containers:
......
livenessProbe:
httpGet:
path: /healthy
port: 5000
scheme: HTTP
failureThreshold: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
上面的探針對于啟動快的應(yīng)用是適用的,比如說nginx 前端應(yīng)用封救,但對于啟動非常慢的大型應(yīng)用,如果我們按照上面的例子來配置 Readiness 和 Liveness 探針捣作,Pod 將因?yàn)樘结樖《肋h(yuǎn)無法啟動誉结。
對于一些大型的 Java 應(yīng)用來說,往往需要數(shù)分鐘時間才能夠完成啟動券躁。
StartupProbe 探針特別適用于業(yè)務(wù)應(yīng)用啟動慢的場景搓彻。當(dāng) Pod 啟動時,如果配置了 StartupProbe嘱朽,那么 Readiness 和 Liveness 探針都將被臨時禁用旭贬,直到 StartupProbe 探針返回成功才會啟用 Readiness 和 Liveness 探針,這也就避免了 Readiness 和 Liveness 在應(yīng)用啟動階段造成的干擾搪泳。也就是說稀轨,我們只要為業(yè)務(wù)配置合理的 StartupProbe 探針,就可以解決應(yīng)用啟動慢導(dǎo)致其他探針認(rèn)為 Pod 不健康的問題岸军。
StartupProbe設(shè)置經(jīng)驗(yàn)
一個例子
spec:
containers:
- name: your-container
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
initialDelaySeconds: 120
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1
參數(shù)名稱 | 參數(shù)描述 |
---|---|
initialDelaySeconds: 120 | 初始化延遲時間奋刽,告訴 kubelet 在執(zhí)行第一次探測前應(yīng)該等待多少秒,默認(rèn)是 0 秒艰赞,最小值是 0 |
periodSeconds: 10 | 探測周期間隔時間佣谐,指定了 kubelet 應(yīng)該每多少秒執(zhí)行一次存活探測,默認(rèn)是 10 秒方妖。最小值是 1 |
timeoutSeconds: 5 | 單次探測超時時間狭魂,探測的超時后等待多少秒,默認(rèn)值是 1 秒党觅,最小值是 1雌澄。 |
successThreshold: 1 | 從失敗轉(zhuǎn)為成功的重試次數(shù),探測器在失敗后杯瞻,被視為成功的最小連續(xù)成功數(shù)镐牺,默認(rèn)值是 1,存活探測的這個值必須是 1魁莉,最小值是 1睬涧。 |
failureThreshold: 30 | 從成功轉(zhuǎn)為失敗的重試次數(shù),當(dāng) Pod 啟動了并且探測到失敗旗唁,Kubernetes 的重試次數(shù)畦浓,存活探測情況下的放棄就意味著重新啟動容器,就緒探測情況下的放棄 Pod 會被打上未就緒的標(biāo)簽逆皮,默認(rèn)值是 3宅粥,最小值是 1。 |
設(shè)置合適的initialDelaySeconds和failureThreshold的值
即使有了 StartupProbe也是需要配置合理的字段值的电谣,如果將 initialDelaySeconds 字段的值從 10 秒鐘修改到 120 秒秽梅。這當(dāng)然是可以的抹蚀,但如果啟動時間不是 120 秒,或者你不太確定呢企垦?那似乎可以在修改了 initialDelaySeconds 的基礎(chǔ)上再將失敗次數(shù) failureThreshold 或者探測間隔 periodSeconds 加大环壤。
這個值需要設(shè)置一個合適的最大值,如果為了兼容應(yīng)用啟動慢的問題,我們主動降低了 kubernetes 檢測 Pod 健康狀態(tài)的頻率钞诡,這會延遲 kubernetes 感知故障的速度郑现。
我們可以通過日志系統(tǒng)分析服務(wù)多次的啟動時間,如下圖
圖中可以知道做大值是251荧降,最小值是223,我們可以分析出最大和最小之間有28秒的偏差接箫,保險(xiǎn)起見我們可以在最大值的基礎(chǔ)上再預(yù)留30秒的啟動時間,所以我們假設(shè)服務(wù)最長啟動時間為280
從圖片中可以看出每次啟動都不會低于100s朵诫,最小的也是223,我們可以在最小的基礎(chǔ)上辛友,稍微小一點(diǎn),比如將initialDelaySeconds 設(shè)置為200s,periodSeconds 周期我們可以保持為10s,那我們剩下就是要計(jì)算出合適的failureThreshold 的值剪返。我們可以通過公式废累,失敗閾值=(最長啟動時間-初始延遲)/探測周期 得知失敗閾值等于16,那么我們就得到了下面的探針配置脱盲。
spec:
containers:
- name: your-container
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 16
initialDelaySeconds: 200
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1