Node
節點是 Kubernetes 的核心元件之一,其生命週期可以簡要概括為:註冊、執行、下線。本文將簡要介紹 Node
生命週期中發生的關鍵事件。
節點註冊
每個 node
節點都需要執行 kubelet
,kubelet
啟動後會向 kube-apiserver
發起節點的註冊請求,即建立一個新的 node
資源物件。
Kubelet
配置檔案中的 registerNode
(或命令列引數 --register-node
)的值預設為 true,用來控制是否自動註冊節點。如果你希望手動管理節點的註冊行為,可以將此項設定為 false。
節點的名稱 nodename
由以下因素決定:
- 如果配置了 cloud provider,則由雲供應商提供名稱。
- 否則使用本機的
hostname
,而hostname
也可以透過kubelet
的配置項--hostname-override
覆蓋掉。
註冊節點實質上是建立了一個新的 node
資源物件,此時 kubelet
便會收集有關節點的狀態資訊一併提交。該介面也可以重複提交,反覆註冊並不會有什麼影響。
節點心跳機制
節點的心跳機制包括兩部分:節點 .status
狀態資訊更新,以及節點對應的 lease
物件更新。
Kubelet
配置檔案中的 nodeStatusUpdateFrequency
(或命令列引數 --node-status-update-frequency
)預設為 10 秒鐘。這意味著當節點狀態發生改變時,或者達到了 10 秒鐘,kubelet 會向 kube-apiserver 發起請求,以更新節點的 .status
狀態資訊。
每個節點都會在 kube-node-lease
這個名稱空間中維護一個同名的 lease
物件,更新頻率為 kubelet
配置檔案中的 nodeLeaseDurationSeconds
(預設 40 秒)* 0.25,即 10 秒鐘。
節點健康監控
controller-manager
中的 node-controller
(準確說是 node-lifecycle-controller
)負責監控節點的健康情況。如果一切正常,那自然萬事大吉。
但是如果節點出現網路中斷或者當機等情況時,node-controller
便會發現節點的心跳資訊長時間未更新,一旦超過 controller-manager
的配置項 --node-monitor-grace-period
設定的時長(預設 40 秒,在未來的 v1.32 版將會變更為 50 秒),node-controller
會將該節點的狀態設定為 Unknown
,並給節點打上 Taint
汙點,避免新的 pod 被排程。隨後再等待 5 分鐘,如果節點仍未恢復心跳,則開始向 kube-apiserver 發起請求,驅逐節點上的 pod 等資源。
節點的正常下線也非常類似,標記汙點、重新排程 pod、下線節點。
(我是凌虛,關注我,無廣告,專注技術,不煽動情緒,歡迎與我交流)
參考資料:
- https://kubernetes.io/docs/concepts/architecture/nodes/
- https://kubernetes.io/docs/reference/node/node-status/
- https://kubernetes.io/docs/reference/command-line-tools-refer...
- https://github.com/kubernetes/kubernetes/pull/126287