安全地排空節點
本頁說明如何安全地排空節點,選擇性地尊重您定義的 PodDisruptionBudget。
開始之前
此任務假設您已滿足以下先決條件
- 您不需要您的應用程式在節點排空期間具有高可用性,或者
- 您已閱讀關於 PodDisruptionBudget 概念的資訊,並且已為需要它們的應用程式 配置 PodDisruptionBudgets。
(選用)配置中斷預算
為了確保您的工作負載在維護期間保持可用,您可以配置 PodDisruptionBudget。
如果可用性對於在您要排空的節點上執行或可能執行的任何應用程式都很重要,請先 配置 PodDisruptionBudgets,然後繼續遵循本指南。
建議將 AlwaysAllow
不健康 Pod 驅逐策略 設定為您的 PodDisruptionBudgets,以支援在節點排空期間驅逐行為不當的應用程式。預設行為是等待應用程式 Pod 變得 健康,然後才能繼續排空。
使用 kubectl drain
從服務中移除節點
您可以使用 kubectl drain
在對節點執行維護(例如核心升級、硬體維護等)之前,安全地從節點驅逐所有 Pod。安全驅逐允許 Pod 的容器 優雅地終止,並且將尊重您指定的 PodDisruptionBudgets。
當 kubectl drain
成功傳回時,表示所有 Pod(除了前一段描述中排除的 Pod)都已安全地驅逐(尊重所需的優雅終止期間,並尊重您定義的 PodDisruptionBudget)。然後,可以安全地關閉節點,方法是關閉其實體機器,或者,如果在雲端平台上執行,則刪除其虛擬機器。
注意
如果任何新的 Pod 容忍 node.kubernetes.io/unschedulable
污點,則這些 Pod 可能會排程到您已排空的節點。除了 DaemonSets 之外,請避免容忍該污點。
如果您或另一個 API 使用者直接為 Pod 設定 nodeName
欄位(繞過排程器),則 Pod 會綁定到指定的節點,並將在那裡執行,即使您已排空該節點並將其標記為不可排程。
首先,識別您要排空的節點名稱。您可以使用以下命令列出叢集中的所有節點
kubectl get nodes
接下來,告訴 Kubernetes 排空節點
kubectl drain --ignore-daemonsets <node name>
如果存在由 DaemonSet 管理的 Pod,您將需要使用 kubectl
指定 --ignore-daemonsets
才能成功排空節點。單獨使用 kubectl drain
子命令實際上並不會排空節點的 DaemonSet Pod:DaemonSet 控制器(控制平面的一部分)會立即使用新的等效 Pod 取代遺失的 Pod。DaemonSet 控制器也會建立忽略不可排程污點的 Pod,這允許新的 Pod 啟動到您正在排空的節點上。
一旦它傳回(沒有給出錯誤),您可以關閉節點電源(或等效地,如果在雲端平台上,則刪除支援節點的虛擬機器)。如果您在維護操作期間將節點留在叢集中,則需要執行
kubectl uncordon <node name>
之後,告訴 Kubernetes 它可以恢復將新的 Pod 排程到節點上。
並行排空多個節點
kubectl drain
命令應一次僅針對單一節點發出。但是,您可以並行執行多個針對不同節點的 kubectl drain
命令,可以在不同的終端機或在背景中執行。並行執行的多個排空命令仍將尊重您指定的 PodDisruptionBudget。
例如,如果您有一個具有三個副本的 StatefulSet,並且已為該集合設定 PodDisruptionBudget,指定 minAvailable: 2
,則僅當所有三個副本 Pod 都 健康 時,kubectl drain
才會從 StatefulSet 中驅逐 Pod;如果然後您並行發出多個排空命令,Kubernetes 會尊重 PodDisruptionBudget,並確保在任何給定時間僅有 1 個(計算為 replicas - minAvailable
)Pod 不可用。任何會導致 健康 副本數量低於指定預算的排空都會被封鎖。
驅逐 API
如果您不想使用 kubectl drain(例如避免呼叫外部命令,或更精細地控制 Pod 驅逐程序),您也可以使用驅逐 API 以程式化方式引起驅逐。
如需更多資訊,請參閱 API 發起的驅逐。
下一步
- 遵循步驟以 配置 Pod 中斷預算 來保護您的應用程式。