天天看點

【K8s任務】安全地清空一個節點

參考:​​https://kubernetes.io/zh/docs/tasks/administer-cluster/safely-drain-node/​​

使用 kubectl drain 從服務中删除一個節點

在對節點執行維護(例如核心更新、硬體維護等)之前, 可以使用 kubectl drain 從節點安全地逐出所有 Pods。 安全的驅逐過程允許 Pod 的容器 體面地終止(​​https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination),​​ 并確定滿足指定的 PodDisruptionBudgets。

說明: 預設情況下, kubectl drain 将忽略節點上不能殺死的特定系統 Pod; 有關更多細節,請參閱 kubectl drain 文檔(​​https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands/#drain)。​​

kubectl drain 的成功傳回,表明所有的 Pods(除了上一段中描述的被排除的那些), 已經被安全地逐出(考慮到期望的終止寬限期和你定義的 PodDisruptionBudget)。 然後就可以安全地關閉節點, 比如關閉實體機器的電源,如果它運作在雲平台上,則删除它的虛拟機。

首先,确定想要清空的節點的名稱。可以用以下指令列出叢集中的所有節點:

kubectl get nodes
      

接下來,告訴 Kubernetes 清空節點:

kubectl drain <node name>
      

一旦它傳回(沒有報錯), 你就可以下線此節點(或者等價地,如果在雲平台上,删除支援該節點的虛拟機)。 如果要在維護操作期間将節點留在叢集中,則需要運作:

kubectl uncordon <node name>
      

然後告訴 Kubernetes,它可以繼續在此節點上排程新的 Pods。

并行清空多個節點

kubectl drain 指令一次隻能發送給一個節點。 但是,你可以在不同的終端或背景為不同的節點并行地運作多個 kubectl drain 指令。 同時運作的多個 drain 指令仍然遵循你指定的 PodDisruptionBudget 。

例如,如果你有一個三副本的 StatefulSet, 并設定了一個 PodDisruptionBudget,指定 minAvailable: 2。 如果所有的三個 Pod 均就緒,并且你并行地發出多個 drain 指令, 那麼 kubectl drain 隻會從 StatefulSet 中逐出一個 Pod, 因為 Kubernetes 會遵守 PodDisruptionBudget 并確定在任何時候隻有一個 Pod 不可用 (最多不可用 Pod 個數的計算方法:replicas - minAvailable)。 任何會導緻就緒副本數量低于指定預算的清空操作都将被阻止。