將複製控制平面遷移到使用雲控制器管理器
cloud-controller-manager 是一個 Kubernetes 控制平面 元件,它嵌入了特定於雲的控制邏輯。雲控制器管理器允許你將叢集連結到雲提供商的 API,並將與該雲平臺互動的元件與僅與叢集互動的元件分離開來。
透過解耦 Kubernetes 與底層雲基礎設施之間的互操作性邏輯,雲控制器管理器元件使雲提供商能夠以與 Kubernetes 主專案不同的速度釋出特性。
背景
作為 雲提供商提取工作 的一部分,所有特定於雲的控制器都必須從 kube-controller-manager
中移出。所有在 kube-controller-manager
中運行雲控制器的現有叢集都必須遷移到在特定於雲提供商的 cloud-controller-manager
中執行這些控制器。
Leader Migration 提供了一種機制,在這種機制中,HA 叢集可以在升級複製的控制平面時,透過兩個元件之間共享的資源鎖,安全地將“雲特定”控制器在 kube-controller-manager
和 cloud-controller-manager
之間遷移。對於單節點控制平面,或者如果升級期間可以容忍控制器管理器不可用,則不需要 Leader Migration,可以忽略本指南。
可以透過在 kube-controller-manager
或 cloud-controller-manager
上設定 --enable-leader-migration
來啟用 Leader Migration。Leader Migration 僅在升級期間適用,並且在升級完成後可以安全地停用或保持啟用狀態。
本指南將引導你完成手動升級控制平面的過程,從使用內建雲提供商的 kube-controller-manager
遷移到同時執行 kube-controller-manager
和 cloud-controller-manager
。如果你使用工具部署和管理叢集,請參閱該工具和雲提供商的文件以獲取具體的遷移說明。
準備工作
假定控制平面正在執行 Kubernetes 版本 N 並將升級到版本 N + 1。儘管可以在相同版本內進行遷移,但理想情況下,遷移應作為升級的一部分進行,以便配置更改可以與每個版本保持一致。N 和 N + 1 的確切版本取決於每個雲提供商。例如,如果雲提供商構建了一個 cloud-controller-manager
以與 Kubernetes 1.24 配合使用,則 N 可以是 1.23,N + 1 可以是 1.24。
控制平面節點應執行啟用 Leader Election 的 kube-controller-manager
,這是預設設定。從版本 N 開始,必須使用 --cloud-provider
標誌設定內建雲提供商,並且不應部署 cloud-controller-manager
。
外部雲提供商必須已構建了具有 Leader Migration 實現的 cloud-controller-manager
。如果雲提供商匯入了版本 v0.21.0 或更高版本的 k8s.io/cloud-provider
和 k8s.io/controller-manager
,則 Leader Migration 將可用。但是,對於 v0.22.0 之前的版本,Leader Migration 是 alpha 功能,需要啟用 cloud-controller-manager
中的功能門 ControllerManagerLeaderMigration
。
本指南假定每個控制平面節點的 kubelet 透過其清單啟動 kube-controller-manager
和 cloud-controller-manager
作為靜態 Pod。如果元件在不同的設定中執行,請相應地調整步驟。
對於授權,本指南假定叢集使用 RBAC。如果其他授權模式授予 kube-controller-manager
和 cloud-controller-manager
元件許可權,請以與該模式匹配的方式授予所需的訪問許可權。
授予遷移租約訪問許可權
控制器管理器的預設許可權僅允許訪問其主租約。為了使遷移正常工作,需要訪問另一個租約。
透過修改 system::leader-locking-kube-controller-manager
角色,可以授予 kube-controller-manager
對租約 API 的完全訪問許可權。本任務指南假定遷移租約的名稱為 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`
對 system::leader-locking-cloud-controller-manager
角色執行相同的操作。
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`
初始領導者遷移配置
領導者遷移可選地採用一個表示控制器到管理器分配狀態的配置檔案。目前,在內建雲提供商中,kube-controller-manager
執行 route
、service
和 cloud-node-lifecycle
。以下示例配置顯示了分配情況。
無需配置即可啟用領導者遷移。有關詳細資訊,請參閱預設配置。
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
resourceLock: leases
controllerLeaders:
- name: route
component: kube-controller-manager
- name: service
component: kube-controller-manager
- name: cloud-node-lifecycle
component: kube-controller-manager
或者,由於控制器可以在任一控制器管理器下執行,因此將兩邊的 component
都設定為 *
可以使配置檔案在遷移的兩方之間保持一致。
# wildcard version
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
resourceLock: leases
controllerLeaders:
- name: route
component: *
- name: service
component: *
- name: cloud-node-lifecycle
component: *
在每個控制平面節點上,將內容儲存到 /etc/leadermigration.conf
,並更新 kube-controller-manager
的清單,以便該檔案以相同位置掛載到容器內部。此外,更新相同的清單以新增以下引數:
--enable-leader-migration
啟用控制器管理器上的 Leader Migration--leader-migration-config=/etc/leadermigration.conf
設定配置檔案
重新啟動每個節點上的 kube-controller-manager
。此時,kube-controller-manager
已啟用領導者遷移並已準備好進行遷移。
部署雲控制器管理器
在版本 N + 1 中,控制器到管理器的理想分配狀態可以透過一個新的配置檔案表示,如下所示。請注意,每個 controllerLeaders
的 component
欄位從 kube-controller-manager
更改為 cloud-controller-manager
。或者,可以使用上面提到的萬用字元版本,效果相同。
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
resourceLock: leases
controllerLeaders:
- name: route
component: cloud-controller-manager
- name: service
component: cloud-controller-manager
- name: cloud-node-lifecycle
component: cloud-controller-manager
建立版本 N + 1 的控制平面節點時,內容應部署到 /etc/leadermigration.conf
。cloud-controller-manager
的清單應更新,以與版本 N 的 kube-controller-manager
相同的方式掛載配置檔案。同樣,將 --enable-leader-migration
和 --leader-migration-config=/etc/leadermigration.conf
新增到 cloud-controller-manager
的引數中。
建立一個版本 N + 1 的新控制平面節點,其中包含更新後的 cloud-controller-manager
清單,並且 kube-controller-manager
的 --cloud-provider
標誌設定為 external
。版本 N + 1 的 kube-controller-manager
**不得**啟用 Leader Migration,因為對於外部雲提供商,它不再執行已遷移的控制器,因此不參與遷移。
請參閱雲控制器管理器管理以獲取有關如何部署 cloud-controller-manager
的更多詳細資訊。
升級控制平面
控制平面現在包含版本 N 和 N + 1 的節點。版本 N 的節點只執行 kube-controller-manager
,而版本 N + 1 的節點同時執行 kube-controller-manager
和 cloud-controller-manager
。根據控制器管理器持有遷移租約的情況,配置中指定的已遷移控制器在版本 N 的 kube-controller-manager
或版本 N + 1 的 cloud-controller-manager
下執行。在任何時候,都不會有控制器同時在兩個控制器管理器下執行。
以滾動方式,建立一個版本 N + 1 的新控制平面節點,並關閉一個版本 N 的節點,直到控制平面只包含版本 N + 1 的節點。如果需要從版本 N + 1 回滾到 N,則將啟用 Leader Migration 的版本 N 節點(針對 kube-controller-manager
)重新新增到控制平面,每次替換一個版本 N + 1 的節點,直到只剩下版本 N 的節點。
(可選) 停用領導者遷移
現在控制平面已升級為執行版本 N + 1 的 kube-controller-manager
和 cloud-controller-manager
,領導者遷移已完成其工作,可以安全地停用以節省一個租約資源。將來為了回滾而重新啟用領導者遷移是安全的。
在滾動管理器中,更新 cloud-controller-manager
的清單以取消設定 --enable-leader-migration
和 --leader-migration-config=
標誌,同時移除 /etc/leadermigration.conf
的掛載,最後移除 /etc/leadermigration.conf
。要重新啟用領導者遷移,請重新建立配置檔案並新增其掛載以及啟用領導者遷移的標誌到 cloud-controller-manager
中。
預設配置
從 Kubernetes 1.22 開始,領導者遷移提供了適用於預設控制器到管理器分配的預設配置。可以透過設定 --enable-leader-migration
但不帶 --leader-migration-config=
來啟用預設配置。
對於 kube-controller-manager
和 cloud-controller-manager
,如果沒有啟用任何內建雲提供商或更改控制器所有權的標誌,則可以使用預設配置以避免手動建立配置檔案。
特殊情況:遷移 Node IPAM 控制器
如果你的雲提供商提供了 Node IPAM 控制器的實現,則應切換到 cloud-controller-manager
中的實現。透過向版本 N + 1 的 kube-controller-manager
的標誌中新增 --controllers=*,-nodeipam
來停用 Node IPAM 控制器。然後將 nodeipam
新增到已遷移控制器列表中。
# wildcard version, with nodeipam
kind: LeaderMigrationConfiguration
apiVersion: controllermanager.config.k8s.io/v1
leaderName: cloud-provider-extraction-migration
resourceLock: leases
controllerLeaders:
- name: route
component: *
- name: service
component: *
- name: cloud-node-lifecycle
component: *
- name: nodeipam
- component: *
下一步
- 閱讀 控制器管理器領導者遷移 增強提案。