Kubernetes 安全地清空一個(gè)節(jié)點(diǎn)

2022-06-08 09:32 更新

安全地清空一個(gè)節(jié)點(diǎn)

本頁(yè)展示了如何在確保 PodDisruptionBudget 的前提下,安全地清空一個(gè)節(jié)點(diǎn)。

在開(kāi)始之前

您的 Kubernetes 服務(wù)器必須是 1.5 版或更高版本。 要檢查版本,請(qǐng)輸入 ?kubectl version?。

此任務(wù)假定你已經(jīng)滿(mǎn)足了以下先決條件:

  • 使用的 Kubernetes 版本 >= 1.5。
  • 以下兩項(xiàng),具備其一:
    1. 在節(jié)點(diǎn)清空期間,不要求應(yīng)用程序具有高可用性
    2. 你已經(jīng)了解了 PodDisruptionBudget 的概念, 并為需要它的應(yīng)用程序配置了 PodDisruptionBudget。

(可選) 配置干擾預(yù)算

為了確保你的負(fù)載在維護(hù)期間仍然可用,你可以配置一個(gè) ?PodDisruptionBudget?。 如果可用性對(duì)于正在清空的該節(jié)點(diǎn)上運(yùn)行或可能在該節(jié)點(diǎn)上運(yùn)行的任何應(yīng)用程序很重要, 首先 配置一個(gè) ?PodDisruptionBudgets ?并繼續(xù)遵循本指南。

使用 kubectl drain 從服務(wù)中刪除一個(gè)節(jié)點(diǎn)

在對(duì)節(jié)點(diǎn)執(zhí)行維護(hù)(例如內(nèi)核升級(jí)、硬件維護(hù)等)之前, 可以使用 ?kubectl drain? 從節(jié)點(diǎn)安全地逐出所有 Pods。 安全的驅(qū)逐過(guò)程允許 Pod 的容器 體面地終止, 并確保滿(mǎn)足指定的 PodDisruptionBudgets。

Note: 默認(rèn)情況下, ?kubectl drain? 將忽略節(jié)點(diǎn)上不能殺死的特定系統(tǒng) Pod; 有關(guān)更多細(xì)節(jié),請(qǐng)參閱 kubectl drain 文檔。

?kubectl drain? 的成功返回,表明所有的 Pods(除了上一段中描述的被排除的那些), 已經(jīng)被安全地逐出(考慮到期望的終止寬限期和你定義的 PodDisruptionBudget)。 然后就可以安全地關(guān)閉節(jié)點(diǎn), 比如關(guān)閉物理機(jī)器的電源,如果它運(yùn)行在云平臺(tái)上,則刪除它的虛擬機(jī)。

首先,確定想要清空的節(jié)點(diǎn)的名稱(chēng)??梢杂靡韵旅盍谐黾褐械乃泄?jié)點(diǎn):

kubectl get nodes

接下來(lái),告訴 Kubernetes 清空節(jié)點(diǎn):

kubectl drain <node name>

一旦它返回(沒(méi)有報(bào)錯(cuò)), 你就可以下線(xiàn)此節(jié)點(diǎn)(或者等價(jià)地,如果在云平臺(tái)上,刪除支持該節(jié)點(diǎn)的虛擬機(jī))。 如果要在維護(hù)操作期間將節(jié)點(diǎn)留在集群中,則需要運(yùn)行:

kubectl uncordon <node name>

然后告訴 Kubernetes,它可以繼續(xù)在此節(jié)點(diǎn)上調(diào)度新的 Pods。

并行清空多個(gè)節(jié)點(diǎn) 

?kubectl drain? 命令一次只能發(fā)送給一個(gè)節(jié)點(diǎn)。 但是,你可以在不同的終端或后臺(tái)為不同的節(jié)點(diǎn)并行地運(yùn)行多個(gè) ?kubectl drain? 命令。 同時(shí)運(yùn)行的多個(gè) drain 命令仍然遵循你指定的 PodDisruptionBudget 。

例如,如果你有一個(gè)三副本的 StatefulSet, 并設(shè)置了一個(gè) ?PodDisruptionBudget?,指定 ?minAvailable: 2?。 如果所有的三個(gè) Pod 均就緒,并且你并行地發(fā)出多個(gè) drain 命令, 那么 ?kubectl drain? 只會(huì)從 StatefulSet 中逐出一個(gè) Pod, 因?yàn)?nbsp;Kubernetes 會(huì)遵守 PodDisruptionBudget 并確保在任何時(shí)候只有一個(gè) Pod 不可用 (最多不可用 Pod 個(gè)數(shù)的計(jì)算方法:?replicas - minAvailable?)。 任何會(huì)導(dǎo)致就緒副本數(shù)量低于指定預(yù)算的清空操作都將被阻止。

驅(qū)逐 API

如果你不喜歡使用 ?kubectl drain? (比如避免調(diào)用外部命令,或者更細(xì)化地控制 pod 驅(qū)逐過(guò)程), 你也可以用驅(qū)逐 API 通過(guò)編程的方式達(dá)到驅(qū)逐的效果。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)