安全地排空節點

本頁面展示如何安全排空節點,並可選地遵循你所定義的 PodDisruptionBudget。

準備工作

本任務假設你已滿足以下先決條件:

  1. 在節點排空期間,你的應用程式不需要高可用性,或者
  2. 你已閱讀了 PodDisruptionBudget 概念,並已為需要它們的應用程式配置了 PodDisruptionBudget

(可選)配置中斷預算

為了確保你的工作負載在維護期間仍然可用,你可以配置 PodDisruptionBudget

如果可用性對你正在排空或可能在這些節點上執行的任何應用程式都很重要,請首先配置 PodDisruptionBudget,然後繼續遵循本指南。

建議將 AlwaysAllow 非健康 Pod 驅逐策略 設定到你的 PodDisruptionBudget 中,以支援在節點排空期間驅逐行為異常的應用程式。預設行為是等待應用程式 Pod 變為健康,然後才能進行排空。

使用 kubectl drain 將節點從服務中移除

你可以在對節點執行維護(例如核心升級、硬體維護等)之前,使用 kubectl drain 安全地從節點中驅逐所有 Pod。安全驅逐允許 Pod 的容器優雅終止,並將遵循你所指定的 PodDisruptionBudget。

kubectl drain 成功返回時,這表示所有 Pod(除了上一段中描述的被排除的 Pod)都已安全驅逐(遵循所需的優雅終止期,並遵循你所定義的 PodDisruptionBudget)。然後,透過關閉其物理機電源或(如果在雲平臺上執行)刪除其虛擬機器來關閉節點是安全的。

首先,確定你希望排空的節點的名稱。你可以使用以下命令列出叢集中的所有節點:

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,併為該集合設定了 minAvailable: 2 的 PodDisruptionBudget,則僅當所有三個副本 Pod 都健康時,kubectl drain 才會從 StatefulSet 中驅逐 Pod;如果然後你並行發出多個排空命令,Kubernetes 會遵循 PodDisruptionBudget,並確保在任何給定時間只有一個(計算為 replicas - minAvailable)Pod 不可用。任何會導致健康副本數量低於指定預算的排空都將被阻止。

驅逐 API

如果你不想使用 kubectl drain(例如為了避免呼叫外部命令,或者為了更精細地控制 Pod 驅逐過程),你也可以使用驅逐 API 以程式設計方式進行驅逐。

有關更多資訊,請參閱 API 發起的驅逐

下一步

上次修改時間:2023 年 5 月 11 日下午 6:08 (太平洋標準時間):從先決條件中移除最低 K8s 版本要求 (6282a22fac)