W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)限。
控制器管理器的默認(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)者遷移可以選擇使用一個(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)行已遷移的控制器,因此不參與遷移。
現(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)為止。
現(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
?。
從 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)建配置文件。
如果你的云供應(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: *
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: