Kubernetes Node 節點的生命週期簡述

凌虚發表於2024-11-01

Node 節點是 Kubernetes 的核心元件之一,其生命週期可以簡要概括為:註冊、執行、下線。本文將簡要介紹 Node 生命週期中發生的關鍵事件。

節點註冊

每個 node 節點都需要執行 kubeletkubelet 啟動後會向 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

相關文章