首先本文所有的 source code 基於 kubernetes 1.19 版本,所有 source code 為了版面的整潔會精簡掉部分 log 相關的程式碼,僅保留核心邏輯,如果有見解錯誤的地方,還麻煩觀看本文的大大們提出,感謝!
本篇文章基於Kubernetes kubelet 探測 pod 的生命症狀 Http Get以及Kubernetes kubelet 探測 pod 的生命症狀 Exec繼續往上蓋的違建(X),大部分的內容都差不多,如有看過前一篇的並且建立基礎觀念的朋友可以直接滑到最下面看 kubernetes kubelet 如何透過 tcp socket 探測 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 的 tcp socket 去探測 pod 的生命狀態。
probes
|
|
runProbeWithRetries 主要傳入探針型態,探針規格,pod狀態,pod spec,以及要探測哪一個 container,接著透過 runProbe function 去執行探測。
|
|
runProbe function 主要是執行探針探測的動作。
|
|
針對上述用到的 function 進行一些補充~
|
|
tcp socket
kubernetes worker 上的 kubelet 會定期發送一個 command exec request 給 pod 內的 container ,如果 coomand exec status code 回傳成功 0 ,判斷目前 container 是否正常運作運作,若是不在這個 status code 範圍就會把 pod 刪掉。
pods/probe/tcp-liveness-readiness.yaml
範例是擷取自 kubernetes 官方網站,撰寫一個 yaml 檔送給 kubernetes 告訴 kubernetes 幫忙啟動一個 pod 並且建立一個 livenessProbe , livenessProbe 會透過 tcp socket 方法去判斷 container 的 8080 port 是否正常。
|
|
我們就以這個範例 kubelet livenessProbe 的 tcp socket 底層是如何實現的吧,先從觸發點來看
|
|
如果探針型態為 TCPSocket 的話,就會透過(非常非常非常外面注入的)tcp 物件去處理探針,至於怎麼注入的…之後再找時間整理xD
我們來看怎麼一下透過 pb.tcp.Probe(host, port, timeout) 這個 function 做到 tcp socket 探測吧。
source code
|
|
由於 tcp socket 的篇幅有點短,附上 tcp socket 的測試給大家參考xD
source code
|
|
小結
以上為 kubelet 探測 pod 的生命症狀 - tcp socket 簡易分析,簡單來說 kubernetes worker node 上的 kubelet process 會有一隻 worker 的 thread 建立一個探針,該 worker 會把 pod prob spec 解析出來並建立對應的探針,本篇以 prob 為 tcp socket 為例。
我們看到了 net.DialTimeout 執行的結果沒有 error 的話就當作當作成功,其他結果都回報 Failure 。
文章中若有出現錯誤的見解希望各位在觀看文章的大大們可以指出哪裡有問題,讓我學習改進,謝謝。