本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

将 Azure 内置云提供商迁移到外部插件提供商

Kubernetes 正在逐步停止维护树内的云提供商。

从 Kubernetes 1.29 开始,内部云提供商已被禁用。您必须禁用 DisableCloudProvidersDisableKubeletCloudCredentialProvider 才能使用内置 Azure 云提供商或从内置云提供商迁移到外部插件提供商。您可以通过在高级集群配置中,将 feature-gates=DisableCloudProviders=false 作为集群的 Kubelet、Controller Manager 和 API Server 的附加参数来禁用所需的功能门控。此外,在 Kubelet 的参数中设置 DisableKubeletCloudCredentialProvider=false 以启用内置功能,以便对 Azure 容器注册表进行身份验证以获取镜像拉取凭据。有关更多详细信息,请参见 上游文档

在 Kubernetes v1.30 及更高版本中,内置云提供商已被移除。Rancher 允许您在从内置提供商迁移到外部插件提供商时升级到 Kubernetes v1.30。

要从内置云提供商迁移到外部 Azure 云插件提供商,您必须停止现有集群的 kube 控制器管理器并安装 Azure 云控制器管理器。

如果在迁移期间可以接受一些停机时间,请按照说明 设置外部插件提供商。这些说明概述了如何为新配置的集群配置外部插件提供商。在设置过程中,会有一些停机时间,因为旧云提供商停止运行和新云提供商开始运行之间存在时间差。

如果您的设置无法容忍任何控制平面停机时间,则必须启用领导者迁移。这有助于从 kube 控制器管理器中的控制器平稳过渡到云控制器管理器中的对应控制器。

重要说明:

Kubernetes 云控制器迁移文档 表示可以在相同的 Kubernetes 版本下进行迁移,但假设迁移是 Kubernetes 升级的一部分。请参考 Kubernetes 文档 迁移以使用云控制器管理器,查看在迁移之前是否需要自定义您的设置。确认您的 迁移配置值。如果您的云提供商提供 Node IPAM 控制器的实现,您还需要 迁移 IPAM 控制器

从 Kubernetes v1.26 开始,内置持久卷类型 kubernetes.io/azure-diskkubernetes.io/azure-file 已被弃用,不再受支持。在这些驱动程序被弃用后,没有计划将其去除,但您应该迁移到相应的 CSI 驱动程序 disk.csi.azure.comfile.csi.azure.com。要查看存储类的迁移选项并将集群升级到使用 Azure 磁盘和 Azure 文件 CSI 驱动程序,请参见 从内置迁移到 CSI 驱动程序

  • RKE2

  • RKE

  1. 更新集群配置以启用领导者迁移:

    spec:
      rkeConfig:
        machineSelectorConfig:
          - config:
              kube-controller-manager-arg:
                - enable-leader-migration
            machineLabelSelector:
              matchExpressions:
                - key: rke.cattle.io/control-plane-role
                  operator: In
                  values:
                    - 'true'

    请注意,在此步骤中云提供商仍然是 azure

    spec:
      rkeConfig:
        machineGlobalConfig:
          cloud-provider-name: azure
  2. 对控制平面节点进行封锁,以便 Azure 云控制器 Pod 仅在升级到外部插件提供商后在节点上运行:

    kubectl cordon -l "node-role.kubernetes.io/control-plane=true"
  3. 要部署 Azure 云控制器管理器,请使用任何可用选项:

    确认图表已安装,但由于控制平面节点被隔离,新 Pod 尚未运行。

  4. 要启用领导者迁移,请将 --enable-leader-migration 添加到 cloud-controller-manager 的容器参数中:

    kubectl -n kube-system patch deployment cloud-controller-manager \
    --type=json \
    -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--enable-leader-migration"}]'
  5. 更新配置集群以更改云提供商,并从 kube 控制器管理器中移除领导者迁移参数。 如果升级 Kubernetes 版本,请在集群 YAML 文件的 spec.kubernetesVersion 部分中设置 Kubernetes 版本。

    spec:
      rkeConfig:
        machineGlobalConfig:
          cloud-provider-name: external

    从 kube 控制器管理器中移除 enable-leader-migration

    spec:
      rkeConfig:
        machineSelectorConfig:
          - config:
              kube-controller-manager-arg:
                - enable-leader-migration
            machineLabelSelector:
              matchExpressions:
                - key: rke.cattle.io/control-plane-role
                  operator: In
                  values:
                    - 'true'
  6. 解封控制平面节点,以便 Azure 云控制器 Pod 现在在节点上运行:

    kubectl uncordon -l "node-role.kubernetes.io/control-plane=true"
  7. 更新集群。cloud-controller-manager Pod 现在应该正在运行。

    kubectl rollout status deployment -n kube-system cloud-controller-manager
    kubectl rollout status daemonset -n kube-system cloud-node-manager
  8. 云提供商负责设置节点的 ProviderID。检查所有节点是否已用 ProviderID 初始化:

    kubectl describe nodes | grep "ProviderID"
  9. (可选)您还可以在升级后禁用领导者迁移,因为在只有一个云控制器管理器的情况下不需要领导者迁移。 更新 cloud-controller-manager 部署以从容器参数中移除领导者迁移:

    - --enable-leader-migration=true
  1. 更新集群配置以启用 cluster.yml 中的领导者迁移:

    services:
      kube-controller:
        extra_args:
          enable-leader-migration: "true"

    请注意,在此步骤中云提供商仍然是 azure

    cloud_provider:
      name: azure
  2. 对控制平面节点进行封锁,以便 Azure 云控制器 Pod 仅在升级到外部插件提供商后在节点上运行:

    kubectl cordon -l "node-role.kubernetes.io/controlplane=true"
  3. 要安装 Azure 云控制器管理器,请按照在新集群上安装 Azure 云提供商时的相同步骤进行:

  4. 确认图表已安装,但由于控制平面节点被隔离,新 Pod 尚未运行。在下一步更新集群后,RKE 将升级并解封每个节点,并调度 cloud-controller-manager Pod。

  5. 要启用领导者迁移,请将 --enable-leader-migration 添加到 cloud-controller-manager 的容器参数中:

    kubectl -n kube-system patch deployment cloud-controller-manager \
    --type=json \
    -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--enable-leader-migration"}]'
  6. 更新 cluster.yml 以将云提供商更改为 external 并从 kube-controller 中移除领导者迁移参数。

    rancher_kubernetes_engine_config:
      cloud_provider:
        name: external

    如果您不希望在集群中启用 enable-leader-migration,请将其移除:

    services:
      kube-controller:
        extra_args:
          enable-leader-migration: "true"
  7. 如果您正在升级集群的 Kubernetes 版本,请同时设置 Kubernetes 版本。

  8. 更新集群。cloud-controller-manager pod 现在应该正在运行。

    kubectl rollout status deployment -n kube-system cloud-controller-manager
    kubectl rollout status daemonset -n kube-system cloud-node-manager
  9. 云提供商负责设置节点的 ProviderID。验证所有节点是否已用 ProviderID 初始化:

    kubectl describe nodes | grep "ProviderID"
  10. (可选)您还可以在升级后禁用领导者迁移,因为在只有一个云控制器管理器的情况下不需要领导者迁移。 更新 cloud-controller-manager 部署以从容器参数中移除领导者迁移:

    - --enable-leader-migration=true