Pod 從創建到退出的過程稱為Pod生命週期, 這段過程Pod會處於多種狀態以及執行一些行為, 包含創建主容器(main container
), 及其他像是初始化容器(init container
), 容器啟動後鉤子(post start hook
), 容器存活性探測(liveness probe
), 容器就續性探測(readiness probe
), 容器終止前鉤子(pre stop hook
), 其它這幾項操作是否執行會取決於Pod的定義。
圖片參考書:【Kubernetes 進階實踐】
init container(初始化容器):
在Pod Spec中使用的字段為spec.initContainers
, 是以列表的方式設定的。
init container 和 Pod要運行的應用是兩個不同的container, init container指的是在容器開始運作之前要預先完成的工作, 初始化容器完成之前, Pod的狀態都會是Initializing
。 如果定義多個初始化容器, 它們會依照定義的順序一一執行, 且必須等到前一個執行成功後, 下一個才會開始做,過程中任何一個初始化容器執行失敗就會再度啟動所有初始化容器重新執行工作, 除非把 restartPolicy
設定為Never
。
restartPolicy
重啟策略
容器的應用程序發生錯誤或容器申請超出限制的資源都可能導致Pod終止, 此時會根據 restartPolicy
來決定是否該重建Pod。
restartPolicy
有三種設定:
Always
: Pod終止就重啟, 此為default
設定。OnFailure
: Pod發生錯誤時才重啟。Never
: 從不重啟。lifecycle hook
(生命週期鉤子):
hook 在Pod Spec中使用的字段為spec.lifecycle
,它會隨時檢測Pod的生命週期中發生的事件, 當對應的時間點來臨時會依照用戶指定的程序運行。
K8s提供兩個hook:
postStart
: 容器創建後立刻運行。preStop
: 容器終止之前運行, 在它完成之前會阻塞刪除容器的操作, 等他執行完容器才會刪除。container probe
(容器探測):
用來定期確認容器健康狀態的設計, 是由kubelet定期呼叫container中定義的handler來診斷container目前是否正常運作, 透過自我檢測與修復來避免把流量導到不健康的Pod。
K8s支持三種用在Pod探測的處理器:
ExecAction
: 在容器內執行命命, 再根據其回傳的狀態進行診斷, 回傳0
表示成功, 其餘皆為失敗。TCPSocketAction
: 透過對容器上的TCP端口進行檢查, 其端口有打開表示成功, 否則為失敗。HTTPGetAction
: 透過對容器IP地址上的指定端口發起http GET 請求進行診斷, 如果回應狀態大於等於200且小於400, 則為成功, 其餘皆為失敗。kubelet 可以執行三種探測:
livenessProbe
(存活性探測): 顯示容器是否正常運作, 如果探測失敗kubelet會終止容器, 容器會依照重啟策略進行下一個動作; 如果容器不支援存活性探測, 則默認狀態為 Success
。readinessProbe
(就緒性探測): 顯示容器是否準備好提供服務, 如果探測失敗Endpoint Controller 會從匹配的所有Service Endpoint list 刪除Pod IP; 如果容器不支援就緒性探測, 則默認狀態為 Success
。startupProbe
(啟動探測): 顯示容器中的應用是否已經啟動, 如果啟動startupProbe則其他探測都會被禁用,直到startupProbe成功為; 如果探測失敗kubelet會終止容器, 容器會依照重啟策略進行下一個動作; 如果容器不支援存活性探測, 則默認狀態為 Success
。每次探測的回傳結果可能有下列三種:
Success
- 只有這個狀態表示成功Failure
- 失敗Unknown
- 失敗圖片參考書:【Kubernetes 進階實踐】
對照上圖理解創建過程:
watch
機制來追蹤檢查API Server的狀態變化watcher
發現API Server創建新的Pod, 但尚未調度到工作節點圖片參考書:【Kubernetes 進階實踐】
對照上圖理解終止過程:
dead
terminating
terminating
, 啟動Pod關閉流程Endpoint Controller
監控到 Pod terminating
, 從 Service 的 endpoint list 中移除Podterminating
就會執行, 若是在寬限期過後preStop仍未執行為, 則流程會從第二步驟重新進行一次。預設的寬限期為30s, 可以透過kubectl delete --grace-period=<seconds>
改變預設值, 若是要設定為0則要搭配 --force
, 設定0表示直接強制刪除指定的Pod。
查看 pods 列表所使用的kubectl get pod
會列出一個STATUS欄位, 他表示目前Pod的狀態, Pod的狀態變化參考:
每天花一點時間啃一點K8s, 把它當成維生素每天補充一點, 你就會越來越強壯的。
第10天, 對自己說點打氣的話, 然後繼續回去看書吧!