将复制控制平面迁移到使用云控制器管理器

云控制器管理器是一个 Kubernetes 控制平面 组件,它嵌入特定于云的控制逻辑。云控制器管理器使您可以将集群链接到云提供商的 API,并将与该云平台交互的组件与仅与集群交互的组件分开。

通过将 Kubernetes 与底层云基础设施之间的互操作性逻辑解耦,云控制器管理器组件使云提供商能够以与主 Kubernetes 项目不同的速度发布功能。

背景

作为 云提供商提取工作 的一部分,所有特定于云的控制器必须从 kube-controller-manager 中移出。所有在 kube-controller-manager 中运行云控制器的现有集群必须迁移到在特定于云提供商的 cloud-controller-manager 中运行控制器。

领导者迁移提供了一种机制,通过该机制,HA 集群可以在升级复制的控制平面时,通过两个组件之间的共享资源锁,安全地将“特定于云”的控制器从 kube-controller-manager 迁移到 cloud-controller-manager。对于单节点控制平面,或者如果在升级期间可以容忍控制器管理器的不可用性,则不需要领导者迁移,并且可以忽略本指南。

可以通过在 kube-controller-managercloud-controller-manager 上设置 --enable-leader-migration 来启用领导者迁移。领导者迁移仅在升级期间适用,可以在升级完成后安全地禁用或保留启用状态。

本指南将引导您完成将控制平面从具有内置云提供商的 kube-controller-manager 升级到同时运行 kube-controller-managercloud-controller-manager 的手动过程。如果您使用工具来部署和管理集群,请参阅该工具和云提供商的文档以获取迁移的具体说明。

开始之前

假设控制平面正在运行 Kubernetes 版本 N 并要升级到版本 N + 1。尽管可以在同一版本内迁移,但理想情况下,迁移应作为升级的一部分执行,以便可以将配置更改与每个版本保持一致。N 和 N + 1 的确切版本取决于每个云提供商。例如,如果云提供商构建了一个 cloud-controller-manager 用于与 Kubernetes 1.24 一起使用,那么 N 可以是 1.23,N + 1 可以是 1.24。

控制平面节点应运行启用领导者选举的 kube-controller-manager,这是默认设置。从版本 N 开始,必须使用 --cloud-provider 标志设置一个树内云提供商,并且 cloud-controller-manager 尚未部署。

树外云提供商必须使用领导者迁移实现构建了 cloud-controller-manager。如果云提供商导入版本 v0.21.0 或更高版本的 k8s.io/cloud-providerk8s.io/controller-manager,则领导者迁移将可用。但是,对于 v0.22.0 之前的版本,领导者迁移是 alpha 版本,并且需要在 cloud-controller-manager 中启用特性门 ControllerManagerLeaderMigration

本指南假设每个控制平面节点的 kubelet 启动 kube-controller-managercloud-controller-manager 作为其清单定义的静态 Pod。如果组件在不同的设置中运行,请相应地调整步骤。

为了授权,本指南假设集群使用 RBAC。如果其他授权模式授予 kube-controller-managercloud-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 运行 routeservicecloud-node-lifecycle。以下示例配置显示了分配。

领导者迁移可以在没有配置的情况下启用。有关详细信息,请参阅 默认配置

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

或者,因为控制器可以在任何控制器管理器下运行,所以将两侧的 component 设置为 * 会使配置文件在迁移的双方之间保持一致。

# wildcard version
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: *

在每个控制平面节点上,将内容保存到 /etc/leadermigration.conf,并更新 kube-controller-manager 的清单,以便将文件以相同位置安装在容器内。此外,更新相同的清单以添加以下参数

  • --enable-leader-migration 用于在控制器管理器上启用领导者迁移
  • --leader-migration-config=/etc/leadermigration.conf 用于设置配置文件

重新启动每个节点上的 kube-controller-manager。此时,kube-controller-manager 已启用领导者迁移,并已准备好进行迁移。

部署云控制器管理器

在版本 N + 1 中,控制器到管理器的分配的所需状态可以用一个新的配置文件表示,如下所示。请注意,每个 controllerLeaderscomponent 字段从 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

在创建版本 N + 1 的控制平面节点时,内容应部署到 /etc/leadermigration.confcloud-controller-manager 的清单应更新为以与版本 N 的 kube-controller-manager 相同的方式安装配置文件。同样,将 --enable-leader-migration--leader-migration-config=/etc/leadermigration.conf 添加到 cloud-controller-manager 的参数中。

使用更新的 cloud-controller-manager 清单创建版本 N + 1 的新控制平面节点,并将 --cloud-provider 标志设置为 external 以供 kube-controller-manager 使用。版本 N + 1 的 kube-controller-manager 绝对不能启用领导者迁移,因为使用外部云提供商,它不再运行迁移的控制器,因此它不参与迁移。

请参阅 云控制器管理器管理,以详细了解如何部署 cloud-controller-manager

升级控制平面

控制平面现在包含版本 N 和 N + 1 的节点。版本 N 的节点仅运行 kube-controller-manager,而版本 N + 1 的节点同时运行 kube-controller-managercloud-controller-manager。迁移的控制器(如配置中指定)根据哪个控制器管理器持有迁移租约,在版本 N 的 kube-controller-manager 或版本 N + 1 的 cloud-controller-manager 下运行。控制器永远不会在任何时间都在两个控制器管理器下运行。

以滚动方式创建版本 N + 1 的新控制平面节点,并关闭一个版本 N 的节点,直到控制平面仅包含版本 N + 1 的节点。如果需要从版本 N + 1 回滚到 N,请将具有为 kube-controller-manager 启用的领导者迁移的版本 N 的节点添加到控制平面,每次替换一个版本 N + 1 的节点,直到只有版本 N 的节点。

(可选) 禁用领导者迁移

现在控制平面已升级为同时运行版本 N + 1 的 kube-controller-managercloud-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-managercloud-controller-manager,如果没有任何标志启用任何树内云提供商或更改控制器的所有权,则可以使用默认配置以避免手动创建配置文件。

特殊情况:迁移节点 IPAM 控制器

如果您的云提供商提供了节点 IPAM 控制器的实现,您应该切换到 cloud-controller-manager 中的实现。通过将 --controllers=*,-nodeipam 添加到其标志中,在版本 N + 1 的 kube-controller-manager 中禁用节点 IPAM 控制器。然后将 nodeipam 添加到迁移控制器的列表中。

# wildcard version, with 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: *

下一步

上次修改时间:2023 年 5 月 31 日下午 1:06 PST:调整领导者迁移任务页面的行换行(3b2a703efe)