首先本文所有的 source code 基於 kubernetes 1.19 版本,所有 source code 為了版面的整潔會精簡掉部分 log 相關的程式碼,僅保留核心邏輯,如果有見解錯誤的地方,還麻煩觀看本文的大大們提出,感謝!
本篇文章基於Kubernetes kubelet 探測 pod 的生命症狀 Http Get繼續往上蓋的違建(X),大部分的內容都差不多,如有看過前一篇的並且建立基礎觀念的朋友可以直接滑到最下面看 kubernetes kubelet 如何透過 exec 探測 pod 的生命症狀。
使用 kubernetes 在建置自己的服務時,我們通常會透過 kubernetes 所提供的探針(probes) 來探測 pod 的特定服務是否正常運作。 probes 主要用來進行自我修復的功能,例如今天某一隻 process 因為業務邏輯或是程式寫錯造成死鎖的問題,我們就能透過 probes 來重新啟動 pod 來恢復程式的運行。或是假設今天 process 啟動到真正可以提供外部存取提供服務,所花費的時間需要比較長的時候我們也會透過 kubernetes 所提供的探針(probes) 來探測服務是不是可以提供外部使用。
綜上所述 probes 分成兩種
- liveness
主要用來判斷 pod 是否正常運作,如果探測失敗的話 kubelet 會把 pod 殺掉再重新建置。 - readiness
主要用來判斷 pod 是否可以提供給其他服務存取,如果探測失敗的話 kubelet 會把 pod 從 service backend 移除,這樣的話其他服務就無法從 service 存取到該服務。
今天主要跟大家分享是的 kubernetes 怎麼透過 liveness probes 的 exec 去探測 pod 的生命狀態。
probes
|
|
runProbeWithRetries 主要傳入探針型態,探針規格,pod狀態,pod spec,以及要探測哪一個 container,接著透過 runProbe function 去執行探測。
|
|
runProbe function 主要是執行探針探測的動作。
|
|
針對上述用到的 function 進行一些補充~
|
|
exec
kubernetes worker 上的 kubelet 會定期發送一個 HTTP request 給 pod 內的 container ,如果 HTTP status code 回傳成功(400> code >= 200),判斷目前 container 是否正常運作運作,若是不在這個 status code 範圍就會把 pod 刪掉。
pods/probe/exec-liveness.yaml
範例是擷取自 kubernetes 官方網站,撰寫一個 yaml 檔送給 kubernetes 告訴 kubernetes 幫忙啟動一個 pod 並且建立一個 livenessProbe , livenessProbe 會透過 exec 方法去判斷 cat /tmp/healthy 執行指令是否執行成功。
|
|
我們就以這個範例 kubelet livenessProbe 的 exec 底層是如何實現的吧,先從觸發點來看
|
|
如果探針型態為 exec 的話,就會透過(非常非常非常外面注入的)exec 物件去處理探針,至於怎麼注入的…之後再找時間整理xD
我們來看一下怎模透過 ExpandContainerCommandOnlyStatic 這個 function 整理 env 環境變數與 cmd 指令吧~
source code
|
|
source code
Cmd 是一個 interface,它提供了一個與 os/exec 中的 Cmd 非常相似的 API。
|
|
我們來看一下實作 Cmd interface 的 結構體,這個 struct 就是上面 exec prob 呼叫的,由於 interface 有許多 signature 以下範例我們只看 prob exec 會用到的。
|
|
前面講了很多相關的東西只為了組出實作 exec.cmd interface 的物件,execProber 的 prob function 用,我們就來看看底層是怎麼處理。
|
|
小結
以上為 kubelet 探測 pod 的生命症狀 - exec 簡易分析,簡單來說 kubernetes worker node 上的 kubelet process 會有一隻 worker 的 thread 建立一個探針,該 worker 會把 pod prob spec 解析出來並建立對應的探針,本篇以 prob 為 exec 為例。
我們看到了 exec 執行的結果回傳為 0 的話就當作當作成功,其他結果都回報 Failure ,下一章節將會針對 kubelet 如何透過 TCP Prob 探測 pod 的生命症狀。
文章中若有出現錯誤的見解希望各位在觀看文章的大大們可以指出哪裡有問題,讓我學習改進,謝謝。