節點
Kubernetes 透過將容器放入 Pod 中執行在**節點**上,來執行你的工作負載。根據叢集的不同,節點可以是虛擬機器或物理機。每個節點都由控制平面管理,幷包含執行Pod 所需的服務。
通常,一個叢集中有多個節點;在學習或資源有限的環境中,你可能只有一個節點。
節點上的元件包括 kubelet、容器執行時和 kube-proxy。
管理
有兩種主要方式可以將節點新增到API 伺服器:
- 節點上的 kubelet 自行註冊到控制平面
- 你(或其他人工使用者)手動新增一個 Node 物件
在建立 Node 物件後,或者 kubelet 在節點上自行註冊後,控制平面會檢查新的 Node 物件是否有效。例如,如果你嘗試從以下 JSON 清單建立 Node:
{
"kind": "Node",
"apiVersion": "v1",
"metadata": {
"name": "10.240.79.157",
"labels": {
"name": "my-first-k8s-node"
}
}
}
Kubernetes 在內部建立一個 Node 物件(表示)。Kubernetes 檢查是否有 kubelet 註冊到與 Node 的 `metadata.name` 欄位匹配的 API 伺服器。如果節點是健康的(即所有必要的服務都在執行),那麼它就具備執行 Pod 的資格。否則,在它變得健康之前,該節點將被忽略,不參與任何叢集活動。
Node 物件的名稱必須是有效的DNS 子域名。
節點名稱的唯一性
名稱標識一個節點。兩個節點不能同時擁有相同的名稱。Kubernetes 還假定具有相同名稱的資源是同一個物件。對於節點,它隱式假定使用相同名稱的例項將具有相同的狀態(例如網路設定、根磁碟內容)和屬性(如節點標籤)。如果例項在未更改其名稱的情況下被修改,這可能會導致不一致。如果節點需要更換或重大更新,則需要先從 API 伺服器中刪除現有節點物件,然後在更新後重新新增。
節點的自注冊
當 kubelet 標誌 `—register-node` 為 true(預設值)時,kubelet 將嘗試向 API 伺服器註冊自己。這是首選模式,大多數發行版都使用此模式。
對於自注冊,kubelet 以以下選項啟動:
`--kubeconfig` - 用於向 API 伺服器進行身份驗證的憑證路徑。
`--cloud-provider` - 如何與雲供應商通訊以讀取其元資料。
`--register-node` - 自動向 API 伺服器註冊。
`--register-with-taints` - 使用給定的汙點列表(逗號分隔的 `
= : `)註冊節點。 如果 `register-node` 為 false,則此操作為空。
`--node-ip` - 節點的 IP 地址的可選逗號分隔列表。對於每個地址族,你只能指定一個地址。例如,在單棧 IPv4 叢集中,你將此值設定為 kubelet 應為節點使用的 IPv4 地址。有關執行雙棧叢集的詳細資訊,請參閱配置 IPv4/IPv6 雙棧。
如果你不提供此引數,kubelet 將使用節點的預設 IPv4 地址(如果有);如果節點沒有 IPv4 地址,則 kubelet 將使用節點的預設 IPv6 地址。
`--node-labels` - 在叢集中註冊節點時要新增的標籤(參見NodeRestriction 准入外掛強制執行的標籤限制)。
`--node-status-update-frequency` - 指定 kubelet 將其節點狀態釋出到 API 伺服器的頻率。
當節點授權模式和NodeRestriction 准入外掛啟用時,kubelet 僅被授權建立/修改自己的 Node 資源。
注意
如節點名稱唯一性部分所述,當節點配置需要更新時,一個好的做法是重新向 API 伺服器註冊該節點。例如,如果 kubelet 使用一組新的 `--node-labels` 重新啟動,但使用了相同的節點名稱,則更改不會生效,因為標籤僅在節點向 API 伺服器註冊時設定(或修改)。
如果節點配置在 kubelet 重啟時發生更改,已經在節點上排程的 Pod 可能會出現異常行為或導致問題。例如,已執行的 Pod 可能會被新的節點標籤汙點,而其他與該 Pod 不相容的 Pod 將根據新的標籤進行排程。節點重新註冊確保所有 Pod 都將被排出並正確重新排程。
手動節點管理
你可以使用 kubectl 建立和修改 Node 物件。
當你希望手動建立 Node 物件時,設定 kubelet 標誌 `--register-node=false`。
無論 `--register-node` 的設定如何,你都可以修改 Node 物件。例如,你可以在現有 Node 上設定標籤或將其標記為不可排程。
你可以透過向節點新增一個或多個 `node-role.kubernetes.io/
Kubernetes 會忽略節點角色的標籤值;按照約定,你可以將其設定為與你在標籤鍵中用於節點角色的字串相同。
你可以將節點上的標籤與 Pod 上的節點選擇器結合使用,以控制排程。例如,你可以將 Pod 限制為僅有資格在可用節點的一個子集上執行。
將節點標記為不可排程會阻止排程器將新的 Pod 放置在該節點上,但不會影響該節點上現有的 Pod。這在節點重啟或其他維護之前的準備步驟中很有用。
要將節點標記為不可排程,請執行
kubectl cordon $NODENAME
有關更多詳細資訊,請參閱安全地排出節點。
注意
作為DaemonSet一部分的 Pod 能夠容忍在不可排程節點上執行。DaemonSet 通常提供節點本地服務,即使節點正在排出工作負載應用程式,這些服務也應在節點上執行。節點狀態
節點的 Status 包含以下資訊:
你可以使用 `kubectl` 檢視節點的 Status 和其他詳細資訊
kubectl describe node <insert-node-name-here>
有關更多詳細資訊,請參見節點狀態。
節點心跳
Kubernetes 節點發送的心跳有助於你的叢集確定每個節點的可用性,並在檢測到故障時採取行動。
對於節點,有兩種形式的心跳:
節點控制器
節點控制器是一個 Kubernetes 控制平面元件,用於管理節點的各個方面。
節點控制器在節點的生命週期中扮演著多個角色。第一個是在節點註冊時為其分配一個 CIDR 塊(如果啟用了 CIDR 分配)。
第二個是保持節點控制器的內部節點列表與雲提供商的可用機器列表同步。在雲環境中執行且節點不健康時,節點控制器會詢問雲提供商該節點的 VM 是否仍然可用。如果不可用,節點控制器會從其節點列表中刪除該節點。
第三個是監控節點的健康狀況。節點控制器負責:
- 在節點無法訪問的情況下,更新 Node 的 `.status` 欄位中的 `Ready` 狀況。在這種情況下,節點控制器會將 `Ready` 狀況設定為 `Unknown`。
- 如果一個節點仍然無法訪問:觸發對該不可訪問節點上所有 Pod 的API 發起的驅逐。預設情況下,節點控制器在將節點標記為 `Unknown` 和提交第一個驅逐請求之間會等待 5 分鐘。
預設情況下,節點控制器每 5 秒檢查一次每個節點的狀態。可以使用 `kube-controller-manager` 元件上的 `--node-monitor-period` 標誌配置此週期。
驅逐速率限制
在大多數情況下,節點控制器將驅逐速率限制為每秒 `—node-eviction-rate`(預設 0.1),這意味著它每 10 秒不會從超過 1 個節點驅逐 Pod。
當給定可用區域中的節點不健康時,節點驅逐行為會發生變化。節點控制器會同時檢查該區域中不健康的節點百分比(`Ready` 狀態為 `Unknown` 或 `False`)。
- 如果健康狀況不佳的節點所佔比例至少達到 `--unhealthy-zone-threshold`(預設值為 0.55),則會降低驅逐速率。
- 如果叢集規模較小(即節點數小於或等於 `--large-cluster-size-threshold`,預設值為 50),則停止驅逐。
- 否則,驅逐速率會降低到每秒 `—secondary-node-eviction-rate`(預設為 0.01)。
這些策略按可用區域實現的原因是,一個可用區域可能與控制平面分離,而其他區域保持連線。如果你的叢集不跨多個雲提供商可用區域,則驅逐機制不會考慮每個區域的不可用性。
將節點分散到多個可用區域的一個主要原因是,當一個完整的區域宕機時,工作負載可以轉移到健康的區域。因此,如果一個區域中的所有節點都不健康,則節點控制器以 `—node-eviction-rate` 的正常速率驅逐。極端情況是所有區域都完全不健康(叢集中沒有任何節點是健康的)。在這種情況下,節點控制器假定控制平面與節點之間存在連線問題,並且不執行任何驅逐。(如果發生故障並且某些節點重新出現,節點控制器會從剩餘的不健康或無法訪問的節點中驅逐 Pod)。
節點控制器還負責驅逐執行在帶有 `NoExecute` 汙點的節點上的 Pod,除非這些 Pod 容忍該汙點。節點控制器還會新增與節點問題(如節點無法訪問或未準備就緒)相對應的汙點。這意味著排程器不會將 Pod 放置在不健康的節點上。
資源容量跟蹤
Node 物件跟蹤節點的資源容量資訊:例如,可用記憶體量和 CPU 數量。自注冊的節點在註冊期間報告其容量。如果你手動新增節點,則需要在新增時設定節點的容量資訊。
Kubernetes 排程器確保節點上的所有 Pod 都有足夠的資源。排程器會檢查節點上容器請求的總和是否不大於節點的容量。該請求總和包括 kubelet 管理的所有容器,但不包括由容器執行時直接啟動的任何容器,也不包括在 kubelet 控制之外執行的任何程序。
注意
如果你想為非 Pod 程序顯式保留資源,請參閱為系統守護程序保留資源。節點拓撲
Kubernetes v1.27 [stable]
(預設啟用:true)如果已啟用 `TopologyManager` 功能門控,則 kubelet 在做出資源分配決策時可以使用拓撲提示。有關更多資訊,請參見控制節點上的拓撲管理策略。
下一步
瞭解更多資訊:
- 構成節點的元件。
- Node 的 API 定義.
- 架構設計文件的節點部分。
- 優雅/非優雅節點關機.
- 節點自動擴縮,用於管理叢集中節點的數量和大小。
- 汙點和容忍.
- 節點資源管理器.
- Windows 節點的資源管理.