Kubernetes 遷移多副本的控制面以使用云控制器管理器

2022-06-08 13:39 更新

遷移多副本的控制面以使用云控制器管理器

FEATURE STATE: Kubernetes v1.24 [stable]

?cloud-controller-manager? 是指嵌入特定云的控制邏輯之 控制平面組件。 ?cloud-controller-manager? 允許你將你的集群連接到云提供商的 API 之上, 并將與該云平臺(tái)交互的組件同與你的集群交互的組件分離開來。

通過分離 Kubernetes 和底層云基礎(chǔ)設(shè)置之間的互操作性邏輯, ?cloud-controller-manager? 組件使云提供商能夠以不同于 Kubernetes 主項(xiàng)目的 步調(diào)發(fā)布新特征。

背景

作為云驅(qū)動(dòng)提取工作 的一部分,所有特定于云的控制器都必須移出 ?kube-controller-manager?。 所有在 ?kube-controller-manager? 中運(yùn)行云控制器的現(xiàn)有集群必須遷移到特定于云廠商的 ?cloud-controller-manager? 中運(yùn)行這些控制器。

領(lǐng)導(dǎo)者遷移(Leader Migration)提供了一種機(jī)制,使得 HA 集群可以通過這兩個(gè)組件之間共享資源鎖, 在升級(jí)多副本的控制平面時(shí),安全地將“特定于云”的控制器從 ?kube-controller-manager? 遷移到 ?cloud-controller-manager?。 對(duì)于單節(jié)點(diǎn)控制平面,或者在升級(jí)過程中可以容忍控制器管理器不可用的情況,則不需要領(lǐng)導(dǎo)者遷移, 亦可以忽略本指南。

領(lǐng)導(dǎo)者遷移可以通過在 ?kube-controller-manager? 或 ?cloud-controller-manager? 上設(shè)置 ?--enable-leader-migration? 來啟用。 領(lǐng)導(dǎo)者遷移僅在升級(jí)期間適用,并且在升級(jí)完成后可以安全地禁用或保持啟用狀態(tài)。

本指南將引導(dǎo)你手動(dòng)將控制平面從內(nèi)置的云驅(qū)動(dòng)的 ?kube-controller-manager? 升級(jí)為 同時(shí)運(yùn)行 ?kube-controller-manager? 和 ?cloud-controller-manager?。 如果使用某種工具來部署和管理集群,請(qǐng)參閱對(duì)應(yīng)工具和云驅(qū)動(dòng)的文檔以獲取遷移的具體說明。

在開始之前

假定控制平面正在運(yùn)行 Kubernetes 版本 N,要升級(jí)到版本 N+1。 盡管可以在同一版本內(nèi)進(jìn)行遷移,但理想情況下,遷移應(yīng)作為升級(jí)的一部分執(zhí)行, 以便可以配置的變更可以與發(fā)布版本變化對(duì)應(yīng)起來。 N 和 N+1 的確切版本值取決于各個(gè)云廠商。例如,如果云廠商構(gòu)建了一個(gè)可與 Kubernetes 1.24 配合使用的 ?cloud-controller-manager?,則 N 可以為 1.23,N+1 可以為 1.24。

控制平面節(jié)點(diǎn)應(yīng)運(yùn)行 ?kube-controller-manager? 并啟用領(lǐng)導(dǎo)者選舉,這也是默認(rèn)設(shè)置。 在版本 N 中,樹內(nèi)云驅(qū)動(dòng)必須設(shè)置 ?--cloud-provider? 標(biāo)志,而且 ?cloud-controller-manager? 應(yīng)該尚未部署。

樹外云驅(qū)動(dòng)必須已經(jīng)構(gòu)建了一個(gè)實(shí)現(xiàn)了領(lǐng)導(dǎo)者遷移的 ?cloud-controller-manager?。 如果云驅(qū)動(dòng)導(dǎo)入了 v0.21.0 或更高版本的 ?k8s.io/cloud-provider? 和 ?k8s.io/controller-manager?, 則可以進(jìn)行領(lǐng)導(dǎo)者遷移。 但是,對(duì) v0.22.0 以下的版本,領(lǐng)導(dǎo)者遷移是一項(xiàng) Alpha 階段功能,需要在 ?cloud-controller-manager? 中啟用特性門控 ?ControllerManagerLeaderMigration?。

本指南假定每個(gè)控制平面節(jié)點(diǎn)的 kubelet 以靜態(tài) Pod 的形式啟動(dòng) ?kube-controller-manager? 和 ?cloud-controller-manager?,靜態(tài) Pod 的定義在清單文件中。 如果組件以其他設(shè)置運(yùn)行,請(qǐng)相應(yīng)地調(diào)整這里的步驟。

關(guān)于鑒權(quán),本指南假定集群使用 RBAC。如果其他鑒權(quán)模式授予 ?kube-controller-manager? 和 ?cloud-controller-manager? 組件權(quán)限,請(qǐng)以與該模式匹配的方式授予所需的訪問權(quán)限。

授予訪問遷移租約的權(quán)限

控制器管理器的默認(rèn)權(quán)限僅允許訪問其主租約(Lease)對(duì)象。為了使遷移正常進(jìn)行, 需要授權(quán)它訪問其他 Lease 對(duì)象。

你可以通過修改 ?system::leader-locking-kube-controller-manager? 角色來授予 ?kube-controller-manager? 對(duì) Lease API 的完全訪問權(quán)限。 本任務(wù)指南假定遷移 Lease 的名稱為 ?cloud-provider-extraction-migration?。

?kubectl patch -n kube-system role 'system::leader-locking-kube-controller-manager' -p '{"rules": [ {"apiGroups":[ "coordination.k8s.io"], "resources": ["leases"], "resourceNames": ["cloud-provider-extraction-migration"], "verbs": ["create", "list", "get", "update"] } ]}' --type=merge ?

對(duì) ?system::leader-locking-cloud-controller-manager? 角色執(zhí)行相同的操作。

?kubectl patch -n kube-system role 'system::leader-locking-cloud-controller-manager' -p '{"rules": [ {"apiGroups":[ "coordination.k8s.io"], "resources": ["leases"], "resourceNames": ["cloud-provider-extraction-migration"], "verbs": ["create", "list", "get", "update"] } ]}' --type=merge?

初始領(lǐng)導(dǎo)者遷移配置

領(lǐng)導(dǎo)者遷移可以選擇使用一個(gè)表示如何將控制器分配給不同管理器的配置文件。 目前,對(duì)于樹內(nèi)云驅(qū)動(dòng),?kube-controller-manager? 運(yùn)行 ?route?、?service ?和 ?cloud-node-lifecycle?。以下示例配置顯示的是這種分配。

領(lǐng)導(dǎo)者遷移可以不指定配置的情況下啟用。

kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
controllerLeaders:
  - name: route
    component: kube-controller-manager
  - name: service
    component: kube-controller-manager
  - name: cloud-node-lifecycle
    component: kube-controller-manager

或者,由于控制器可以在任一控制器管理器下運(yùn)行,因此將雙方的 ?component ?設(shè)置為 ?*? 可以使遷移雙方的配置文件保持一致。

# 通配符版本
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
controllerLeaders:
  - name: route
    component: *
  - name: service
    component: *
  - name: cloud-node-lifecycle
    component: *

在每個(gè)控制平面節(jié)點(diǎn)上,請(qǐng)將如上內(nèi)容保存到 ?/etc/leadermigration.conf? 中, 并更新 ?kube-controller-manager? 清單,以便將文件掛載到容器內(nèi)的同一位置。 另外,請(qǐng)更新同一清單,添加以下參數(shù):

  • ?--enable-leader-migration? 在控制器管理器上啟用領(lǐng)導(dǎo)者遷移
  • ?--leader-migration-config=/etc/leadermigration.conf? 設(shè)置配置文件

在每個(gè)節(jié)點(diǎn)上重新啟動(dòng) ?kube-controller-manager?。這時(shí),?kube-controller-manager? 已啟用領(lǐng)導(dǎo)者遷移,為遷移準(zhǔn)備就緒。

部署云控制器管理器

在版本 N+1 中,如何將控制器分配給不同管理器的預(yù)期分配狀態(tài)可以由新的配置文件表示, 如下所示。請(qǐng)注意,各個(gè) ?controllerLeaders ?的 ?component ?字段從 ?kube-controller-manager? 更改為 ?cloud-controller-manager?。 或者,使用上面提到的通配符版本,它具有相同的效果。

kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
controllerLeaders:
  - name: route
    component: cloud-controller-manager
  - name: service
    component: cloud-controller-manager
  - name: cloud-node-lifecycle
    component: cloud-controller-manager

當(dāng)創(chuàng)建版本 N+1 的控制平面節(jié)點(diǎn)時(shí),應(yīng)將如上內(nèi)容寫入到 ?/etc/leadermigration.conf?。 你需要更新 ?cloud-controller-manager? 的清單,以與版本 N 的 ?kube-controller-manager? 相同的方式掛載配置文件。 類似地,添加 ?--enable-leader-migration? 和 ?--leader-migration-config=/etc/leadermigration.conf? 到 ?cloud-controller-manager? 的參數(shù)中。

使用已更新的 ?cloud-controller-manager? 清單創(chuàng)建一個(gè)新的 N+1 版本的控制平面節(jié)點(diǎn), 同時(shí)設(shè)置 ?kube-controller-manager? 的 ?--cloud-provider? 標(biāo)志為 ?external?。 版本為 N+1 的 ?kube-controller-manager? 不能啟用領(lǐng)導(dǎo)者遷移, 因?yàn)樵谑褂猛獠吭乞?qū)動(dòng)的情況下,它不再運(yùn)行已遷移的控制器,因此不參與遷移。

升級(jí)控制平面

現(xiàn)在,控制平面同時(shí)包含 N 和 N+1 版本的節(jié)點(diǎn)。 版本 N 的節(jié)點(diǎn)僅運(yùn)行 ?kube-controller-manager?,而版本 N+1 的節(jié)點(diǎn)同時(shí)運(yùn)行 ?kube-controller-manager? 和 ?cloud-controller-manager?。 根據(jù)配置所指定,已遷移的控制器在版本 N 的 ?kube-controller-manager? 或版本 N+1 的 ?cloud-controller-manager? 下運(yùn)行,具體取決于哪個(gè)控制器管理器擁有遷移租約對(duì)象。 任何時(shí)候都不會(huì)有同一個(gè)控制器在兩個(gè)控制器管理器下運(yùn)行。

以滾動(dòng)的方式創(chuàng)建一個(gè)新的版本為 N+1 的控制平面節(jié)點(diǎn),并將版本 N 中的一個(gè)關(guān)閉, 直到控制平面僅包含版本為 N+1 的節(jié)點(diǎn)。 如果需要從 N+1 版本回滾到 N 版本,則將 ?kube-controller-manager? 啟用了領(lǐng)導(dǎo)者遷移的、 且版本為 N 的節(jié)點(diǎn)添加回控制平面,每次替換 N+1 版本中的一個(gè),直到只有版本 N 的節(jié)點(diǎn)為止。

(可選)禁用領(lǐng)導(dǎo)者遷移

現(xiàn)在,控制平面已經(jīng)完成升級(jí),同時(shí)運(yùn)行版本 N+1 的 ?kube-controller-manager? 和 ?cloud-controller-manager?。領(lǐng)導(dǎo)者遷移的任務(wù)已經(jīng)結(jié)束,可以被安全地禁用以節(jié)省一個(gè) Lease 資源。在將來可以安全地重新啟用領(lǐng)導(dǎo)者遷移,以完成回滾。

在滾動(dòng)管理器中,更新 ?cloud-controller-manager? 的清單以同時(shí)取消設(shè)置 ?--enable-leader-migration? 和 ?--leader-migration-config=? 標(biāo)志,并刪除 ?/etc/leadermigration.conf? 的掛載,最后刪除 ?/etc/leadermigration.conf?。 要重新啟用領(lǐng)導(dǎo)者遷移,請(qǐng)重新創(chuàng)建配置文件,并將其掛載和啟用領(lǐng)導(dǎo)者遷移的標(biāo)志添加回到 ?cloud-controller-manager?。

默認(rèn)配置

從 Kubernetes 1.22 開始,領(lǐng)導(dǎo)者遷移提供了一個(gè)默認(rèn)配置,它適用于控制器與管理器間默認(rèn)的分配關(guān)系。 可以通過設(shè)置 ?--enable-leader-migration?,但不設(shè)置 ?--leader-migration-config=? 來啟用默認(rèn)配置。

對(duì)于 ?kube-controller-manager? 和 ?cloud-controller-manager?,如果沒有用參數(shù)來啟用樹內(nèi)云驅(qū)動(dòng)或者改變控制器屬主, 則可以使用默認(rèn)配置來避免手動(dòng)創(chuàng)建配置文件。

特殊情況:遷移節(jié)點(diǎn) IPAM 控制器

如果你的云供應(yīng)商提供了節(jié)點(diǎn) IPAM 控制器的實(shí)現(xiàn),你應(yīng)該切換到 ?cloud-controller-manager? 中的實(shí)現(xiàn)。 通過在其標(biāo)志中添加 ?--controllers=*,-nodeipam? 來禁用 N+1 版本的 ?kube-controller-manager? 中的節(jié)點(diǎn) IPAM 控制器。 然后將 ?nodeipam ?添加到遷移的控制器列表中。

# 通配符版本,帶有 nodeipam
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
controllerLeaders:
  - name: route
    component: *
  - name: service
    component: *
  - name: cloud-node-lifecycle
    component: *
  - name: nodeipam
-   component: *


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)