節點關機

在 Kubernetes 叢集中,節點可以規劃好的正常方式關機,或因斷電或其他外部原因而意外關機。如果節點在關機前未被排空,節點關機可能會導致工作負載失敗。節點關機可以是正常非正常

正常節點關機

功能狀態: Kubernetes v1.21 [beta] (預設啟用:true)

kubelet 嘗試偵測節點系統關機,並終止在節點上執行的 Pod。

Kubelet 確保 Pod 在節點關機期間遵循正常的 Pod 終止程序。在節點關機期間,kubelet 不接受新的 Pod (即使這些 Pod 已繫結到節點)。

正常節點關機功能依賴 systemd,因為它利用 systemd inhibitor locks 來延遲節點關機,並具有給定的持續時間。

正常節點關機由 GracefulNodeShutdown 功能閘道 控制,該閘道在 1.21 中預設啟用。

請注意,預設情況下,以下描述的兩個組態選項 shutdownGracePeriodshutdownGracePeriodCriticalPods 都設定為零,因此不會啟用正常節點關機功能。若要啟用此功能,應適當設定兩個 kubelet 組態設定,並將其設定為非零值。

一旦 systemd 偵測到或通知節點關機,kubelet 會在節點上設定 NotReady 狀況,並將 reason 設定為 "node is shutting down"。kube-scheduler 會遵循此狀況,並且不會將任何 Pod 排程到受影響的節點;預計其他第三方排程器也會遵循相同的邏輯。這表示新的 Pod 將不會排程到該節點上,因此不會有任何 Pod 啟動。

kubelet 會在 PodAdmission 階段拒絕 Pod,如果偵測到節點正在關閉,即使 Pod 具有 node.kubernetes.io/not-ready:NoSchedule容忍度,也不會在該處啟動。

當 kubelet 透過 API 在其節點上設定該狀況的同時,kubelet 也會開始終止任何在本機執行的 Pod。

在正常關機期間,kubelet 會在兩個階段終止 Pod

  1. 終止在節點上執行的常規 Pod。
  2. 終止在節點上執行的重要 Pod

正常節點關機功能透過兩個 KubeletConfiguration 選項進行配置

  • shutdownGracePeriod:
    • 指定節點應延遲關機的總持續時間。這是常規 Pod 和重要 Pod 的 Pod 終止總寬限期。
  • shutdownGracePeriodCriticalPods:
    • 指定在節點關機期間用於終止重要 Pod 的持續時間。此值應小於 shutdownGracePeriod

例如,如果 shutdownGracePeriod=30sshutdownGracePeriodCriticalPods=10s,則 kubelet 將節點關機延遲 30 秒。在關機期間,前 20 秒 (30-10) 將保留用於正常終止常規 Pod,最後 10 秒將保留用於終止重要 Pod

基於 Pod 優先順序的正常節點關機

功能狀態: Kubernetes v1.24 [beta] (預設啟用:true)

為了在正常節點關機期間提供更大的彈性,以便對 Pod 進行排序,正常節點關機會考量 Pod 的 PriorityClass,前提是您已在叢集中啟用此功能。此功能允許叢集管理員根據優先順序類別明確定義正常節點關機期間 Pod 的排序。

如上所述的正常節點關機功能,會分兩個階段關閉 Pod:非重要 Pod,然後是重要 Pod。如果需要額外的彈性,以更精細的方式明確定義關機期間 Pod 的排序,則可以使用基於 Pod 優先順序的正常關機。

當正常節點關機考量 Pod 優先順序時,就可以分多個階段執行正常節點關機,每個階段關閉特定優先順序類別的 Pod。可以透過精確的階段和每個階段的關機時間來配置 kubelet。

假設叢集中有以下自訂 Pod 優先順序類別

Pod 優先順序類別名稱Pod 優先順序類別值
custom-class-a100000
custom-class-b10000
custom-class-c1000
常規/未設定0

kubelet 配置中,shutdownGracePeriodByPodPriority 的設定可能如下所示

Pod 優先順序類別值關機週期
10000010 秒
10000180 秒
1000120 秒
060 秒

對應的 kubelet 配置 YAML 配置如下

shutdownGracePeriodByPodPriority:
  - priority: 100000
    shutdownGracePeriodSeconds: 10
  - priority: 10000
    shutdownGracePeriodSeconds: 180
  - priority: 1000
    shutdownGracePeriodSeconds: 120
  - priority: 0
    shutdownGracePeriodSeconds: 60

上表表示任何 priority 值 >= 100000 的 Pod 將只有 10 秒的停止時間,任何值 >= 10000 且 < 100000 的 Pod 將有 180 秒的停止時間,任何值 >= 1000 且 < 10000 的 Pod 將有 120 秒的停止時間。最後,所有其他 Pod 將有 60 秒的停止時間。

不必指定對應於所有類別的值。例如,您可以改用以下設定

Pod 優先順序類別值關機週期
100000300 秒
1000120 秒
060 秒

在上述情況下,具有 custom-class-b 的 Pod 將與 custom-class-c 進入相同的關機組別。

如果特定範圍內沒有 Pod,則 kubelet 不會等待該優先順序範圍內的 Pod。相反,kubelet 會立即跳到下一個優先順序類別值範圍。

如果啟用此功能但未提供任何配置,則不會採取任何排序動作。

使用此功能需要啟用 GracefulNodeShutdownBasedOnPodPriority 功能閘道,並在 kubelet 配置中將 ShutdownGracePeriodByPodPriority 設定為包含 Pod 優先順序類別值及其各自關機週期的所需配置。

graceful_shutdown_start_time_secondsgraceful_shutdown_end_time_seconds 指標會在 kubelet 子系統下發出,以監控節點關機。

非正常節點關機處理

功能狀態: Kubernetes v1.28 [stable] (預設啟用:true)

kubelet 的節點關機管理器可能無法偵測到節點關機動作,原因可能是命令未觸發 kubelet 使用的抑制鎖定機制,或是使用者錯誤,即 ShutdownGracePeriodShutdownGracePeriodCriticalPods 未正確配置。有關更多詳細資訊,請參閱上面的正常節點關機章節。

當節點關機但未被 kubelet 的節點關機管理器偵測到時,屬於 StatefulSet 的 Pod 將卡在關機節點上的終止狀態,並且無法移動到新的執行中節點。這是因為關機節點上的 kubelet 無法刪除 Pod,因此 StatefulSet 無法建立具有相同名稱的新 Pod。如果 Pod 使用了磁碟區,則 VolumeAttachment 將不會從原始關機節點中刪除,因此這些 Pod 使用的磁碟區將無法連接到新的執行中節點。因此,在 StatefulSet 上執行的應用程式將無法正常運作。如果原始關機節點恢復運作,Pod 將被 kubelet 刪除,並且新的 Pod 將在不同的執行中節點上建立。如果原始關機節點沒有恢復運作,這些 Pod 將永遠卡在關機節點上的終止狀態。

為了減輕上述情況,使用者可以手動將污點 node.kubernetes.io/out-of-serviceNoExecuteNoSchedule 效果新增到節點,將其標記為停止服務。如果節點被標記為停止服務且具有此污點,則節點上的 Pod 將被強制刪除(如果其上沒有相符的容忍度),並且在節點上終止的 Pod 的磁碟區分離操作將立即發生。這允許停止服務節點上的 Pod 在不同的節點上快速恢復。

在非正常關機期間,Pod 會在兩個階段終止

  1. 強制刪除沒有相符 out-of-service 容忍度的 Pod。
  2. 立即對此類 Pod 執行分離磁碟區操作。

逾時時強制儲存分離

在任何 Pod 刪除未成功 6 分鐘的情況下,如果節點在該時刻不健康,Kubernetes 將強制分離正在卸載的磁碟區。任何仍在節點上執行且使用強制分離磁碟區的工作負載都將導致違反 CSI 規範,該規範指出 ControllerUnpublishVolume必須在呼叫所有 NodeUnstageVolumeNodeUnpublishVolume 且磁碟區成功後呼叫」。在這種情況下,相關節點上的磁碟區可能會遇到資料損壞。

強制儲存分離行為是可選的;使用者可以選擇改用「非正常節點關機」功能。

可以透過在 kube-controller-manager 中設定 disable-force-detach-on-timeout 配置欄位來停用逾時時強制分離功能。停用逾時時強制分離功能表示,在不健康狀態超過 6 分鐘的節點上託管的磁碟區將不會刪除其關聯的 VolumeAttachment

套用此設定後,仍連接到磁碟區的不健康 Pod 必須透過上述非正常節點關機程序來恢復。

Windows 正常節點關機

功能狀態: Kubernetes v1.32 [alpha] (預設啟用:false)

Windows 正常節點關機功能取決於以 Windows 服務形式執行的 kubelet,然後它將具有已註冊的服務控制處理常式,以給定的持續時間延遲 presshutdown 事件。

Windows 正常節點關機由 WindowsGracefulNodeShutdown 功能閘道控制,該功能閘道在 1.32 中作為 Alpha 功能引入。

Windows 正常節點關機無法取消。

如果 Kubelet 未以 Windows 服務形式執行,它將無法設定和監控 Preshutdown 事件,節點將必須經歷上述非正常節點關機程序。

在啟用 Windows 正常節點關機功能,但 kubelet 未以 Windows 服務形式執行的情況下,kubelet 將繼續執行而不是失敗。但是,它將記錄錯誤,指示需要以 Windows 服務形式執行。

下一步

深入了解以下內容

上次修改時間:2024 年 11 月 14 日上午 10:47 PST:新增 Windows 正常節點關機文件 (e4bdcbcf5b)