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

设置 Azure 云提供商

重要说明:

在 Kubernetes 1.30 及更高版本中,您必须使用外部 Azure 云提供商。Azure 云提供商已被 完全移除,在升级到 Kubernetes 1.30 后将无法使用。下面列出的步骤仍然需要设置 Azure 云提供商。在完成 Azure 的先决条件后,您可以设置外部云提供商

您还可以在 Kubernetes 1.29 及更早版本上从内部迁移到外部 Azure 云提供商。所有现有集群必须在升级到 v1.30 之前进行迁移,以保持功能正常。

从 Kubernetes 1.29 开始,内部云提供商已被禁用。您必须将 DisableCloudProvidersDisableKubeletCloudCredentialProviders 功能开关设置为 false 才能使用内部 Azure 云提供商。您可以通过在高级集群配置中将 feature-gates=DisableCloudProviders=false,DisableKubeletCloudCredentialProviders=false 设置为集群的 Kubelet、控制器管理器和 API 服务器的附加参数来实现。在 Kubelet、控制器管理器和 API 服务器参数中设置 DisableKubeletCloudCredentialProviders=false 可启用内部功能,以便对 Azure 容器注册表进行身份验证以获取镜像拉取凭据。有关更多详细信息,请参见 Kubernetes 1.29: Mandala 发布说明 和此 博客文章

从 Kubernetes 版本 1.26 开始,内部持久卷类型 kubernetes.io/azure-diskkubernetes.io/azure-file 已被弃用,将不再受支持。对于新集群,安装 CSI 驱动程序,或通过遵循 上游迁移文档 迁移到相应的 CSI 驱动程序 disk.csi.azure.comfile.csi.azure.com

使用 Azure 云提供商时,您可以利用以下功能:

  • *负载均衡器:*在特定的网络安全组内启动 Azure 负载均衡器。

  • *持久卷:*支持使用 Azure Blob 磁盘和 Azure 托管磁盘与标准和高级存储帐户。

  • *网络存储:*通过 CIFS 挂载支持 Azure 文件。

以下账户类型不支持 Azure 订阅:

  • 单租户账户(即没有订阅的账户)。

  • 多订阅账户。

RKE 和 SUSE® Rancher Prime: RKE2 的前提条件

要为 RKE 和 RKE2 设置 Azure 云提供商,需要配置以下凭据:

1.设置 Azure 租户 ID

访问 Azure 门户,登录并转到 Azure Active Directory,然后选择 属性。您的 目录 ID 是您的 租户 ID(tenantID)。

如果您想使用 Azure CLI,可以运行命令 az account show 来获取信息。

2.设置 Azure 客户端 ID 和 Azure 客户端密钥

访问 Azure 门户,登录并按照以下步骤创建 应用注册 及相应的 Azure 客户端 ID(aadClientId)和 Azure 客户端密钥(aadClientSecret)。

  1. 选择 Azure Active Directory

  2. 选择 应用注册

  3. 选择 新建应用注册

  4. 选择一个*名称*,选择`Web app / API`作为*应用类型*,并选择一个*登录 URL*,在这种情况下可以是任何内容。

  5. 选择*创建*。

在*应用注册*视图中,您应该能看到您创建的应用注册。在*应用程序 ID*列中显示的值是您需要用作*Azure 客户端 ID*的内容。

下一步是生成*Azure 客户端密钥*:

  1. 打开您创建的应用注册。

  2. 在*设置*视图中,打开*密钥*。

  3. 输入一个*密钥描述*,选择一个过期时间,然后选择*保存*。

  4. 在*值*列中显示的生成值是您需要用作*Azure 客户端密钥*的内容。此值只会显示一次。

3.配置应用注册权限

您需要做的最后一件事是为您的应用注册分配适当的权限。

  1. 转到*更多服务*,搜索*订阅*并打开它。

  2. 打开*访问控制 (IAM)*。

  3. 选择*添加*。

  4. 对于*角色*,选择`Contributor`。

  5. 对于*选择*,选择您创建的应用注册名称。

  6. 选择 保存

4.设置 Azure 网络安全组名称

需要一个自定义的 Azure 网络安全组(securityGroupName)以允许 Azure 负载均衡器工作。

如果您使用 Rancher Machine Azure 驱动程序配置主机,您需要手动编辑它们以将其分配到此网络安全组。

在配置期间,您应该已经将自定义主机分配到此网络安全组。

只有预期作为负载均衡器后端的主机需要在此组中。

SUSE® Rancher Prime: RKE2 在 Rancher 中的集群设置

重要说明:

本节仅适用于使用内部云提供商创建集群。

  1. 在集群配置部分的云提供商下拉菜单中选择 "Azure"。

  2. 提供云提供商配置。请注意,Rancher 会自动创建一个新的网络安全组、资源组、可用性集、子网和虚拟网络。如果您已经创建了其中一些或全部,您必须在创建集群之前指定它们。

    • 点击 显示高级 以查看或编辑这些自动生成的名称。您的云提供商配置 必须机器池 部分中的字段匹配。如果您有多个池,它们必须都使用相同的资源组、可用性集、子网、虚拟网络和网络安全组。

    • 下面提供了一个示例。根据需要进行修改。

    示例配置

    +

     {
         "cloud":"AzurePublicCloud",
         "tenantId": "YOUR TENANTID HERE",
         "aadClientId": "YOUR AADCLIENTID HERE",
         "aadClientSecret": "YOUR AADCLIENTSECRET HERE",
         "subscriptionId": "YOUR SUBSCRIPTIONID HERE",
         "resourceGroup": "docker-machine",
         "location": "westus",
         "subnetName": "docker-machine",
         "securityGroupName": "rancher-managed-KA4jV9V2",
         "securityGroupResourceGroup": "docker-machine",
         "vnetName": "docker-machine-vnet",
         "vnetResourceGroup": "docker-machine",
         "primaryAvailabilitySetName": "docker-machine",
         "routeTableResourceGroup": "docker-machine",
         "cloudProviderBackoff": false,
         "useManagedIdentityExtension": false,
         "useInstanceMetadata": true
     }

    +

  3. 在 menu:集群配置[高级] 部分下,点击 添加附加控制器管理器参数 下并添加此标志:--configure-cloud-routes=false

  4. 点击 创建 提交表单并创建集群。

云提供商配置

Rancher 会自动创建一个新的网络安全组、资源组、可用性集、子网和虚拟网络。如果您已经创建了其中一些或全部,您需要在创建集群之前指定它们。您可以查看 RKE1 节点模板RKE2 机器池 以查看或编辑这些自动生成的名称。

请参阅 上游文档 中的完整配置选项列表。

  1. useInstanceMetadata 必须设置为 true,以便云提供商正确配置 providerID

  2. excludeMasterFromStandardLB 必须设置为 false,如果您需要将标记为 node-role.kubernetes.io/master 的节点添加到 Azure 负载均衡器 (ALB) 的后端。

  3. loadBalancerSku 可以设置为 basicstandard。基本 SKU 将于 2025 年 9 月弃用。有关更多信息,请参阅 Azure 上游文档

Azure 支持从 Kubernetes 秘密中读取云配置。该秘密是 azure.json 文件的序列化版本。当秘密被更改时,云控制器管理器会在不重启 pod 的情况下重建自身。建议 Helm 图表从秘密中读取云提供商配置。

请注意,图表从 kube-system 名称空间中的给定秘密名称读取云提供商配置。由于 Azure 读取 Kubernetes 秘密,因此还需要配置 RBAC。下面显示了云提供商配置的示例秘密。根据需要修改并创建该秘密。

# azure-cloud-config.yaml
apiVersion: v1
kind: Secret
metadata:
  name: azure-cloud-config
  namespace: kube-system
type: Opaque
stringData:
  cloud-config: |-
    {
      "cloud": "AzurePublicCloud",
      "tenantId": "<tenant-id>",
      "subscriptionId": "<subscription-id>",
      "aadClientId": "<client-id>",
      "aadClientSecret": "<client-secret>",
      "resourceGroup": "docker-machine",
      "location": "westus",
      "subnetName": "docker-machine",
      "securityGroupName": "rancher-managed-kqmtsjgJ",
      "securityGroupResourceGroup": "docker-machine",
      "vnetName": "docker-machine-vnet",
      "vnetResourceGroup": "docker-machine",
      "primaryAvailabilitySetName": "docker-machine",
      "routeTableResourceGroup": "docker-machine",
      "cloudProviderBackoff": false,
      "useManagedIdentityExtension": false,
      "useInstanceMetadata": true,
      "loadBalancerSku": "standard",
      "excludeMasterFromStandardLB": false,
    }

使用外部 Azure 云提供商。

  • RKE2

  • RKE1

  1. 集群配置 部分的 云提供商 下拉菜单中选择 外部

  2. 在 menu:集群配置[高级] 下,点击 添加附加控制器管理器参数 下,并添加此标志:--configure-cloud-routes=false

  3. 准备云提供商配置,以便在下一步中设置。请注意,Rancher 会自动创建一个新的网络安全组、资源组、可用性集、子网和虚拟网络。如果您已经创建了其中一些或全部,您必须在创建集群之前指定它们。

    点击 显示高级 以查看或编辑这些自动生成的名称。您的云提供商配置 必须机器池 部分中的字段匹配。如果您有多个池,它们必须都使用相同的资源组、可用性集、子网、虚拟网络和网络安全组。

  4. 集群配置 > 附加配置 下,将下面显示的云控制器管理器清单添加到 附加清单 中。

    请注意,此图表从 kube-system 名称空间中的密钥读取云提供商配置。下面显示了云提供商配置的示例密钥;根据需要修改。请参阅 上游文档 中的完整配置选项列表。

    或者,您也可以使用 Helm CLI 安装云控制器管理器。

    apiVersion: helm.cattle.io/v1
    kind: HelmChart
    metadata:
      name: azure-cloud-controller-manager
      namespace: kube-system
    spec:
      chart: cloud-provider-azure
      repo: https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo
      targetNamespace: kube-system
      bootstrap: true
      valuesContent: |-
        infra:
          clusterName: <cluster-name>
        cloudControllerManager:
          cloudConfigSecretName: azure-cloud-config
          cloudConfig: null
          clusterCIDR: null
          enableDynamicReloading: 'true'
          nodeSelector:
            node-role.kubernetes.io/control-plane: 'true'
          allocateNodeCidrs: 'false'
          hostNetworking: true
          caCertDir: /etc/ssl
          configureCloudRoutes: 'false'
          enabled: true
          tolerations:
            - effect: NoSchedule
              key: node-role.kubernetes.io/master
            - effect: NoSchedule
              key: node-role.kubernetes.io/control-plane
              value: 'true'
            - effect: NoSchedule
              key: node.cloudprovider.kubernetes.io/uninitialized
              value: 'true'
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: azure-cloud-config
      namespace: kube-system
    type: Opaque
    stringData:
      cloud-config: |-
        {
          "cloud": "AzurePublicCloud",
          "tenantId": "<tenant-id>",
          "subscriptionId": "<subscription-id>",
          "aadClientId": "<client-id>",
          "aadClientSecret": "<client-secret>",
          "resourceGroup": "docker-machine",
          "location": "westus",
          "subnetName": "docker-machine",
          "securityGroupName": "rancher-managed-kqmtsjgJ",
          "securityGroupResourceGroup": "docker-machine",
          "vnetName": "docker-machine-vnet",
          "vnetResourceGroup": "docker-machine",
          "primaryAvailabilitySetName": "docker-machine",
          "routeTableResourceGroup": "docker-machine",
          "cloudProviderBackoff": false,
          "useManagedIdentityExtension": false,
          "useInstanceMetadata": true,
          "loadBalancerSku": "standard",
          "excludeMasterFromStandardLB": false,
        }
  5. 点击 创建 提交表单并创建集群。

  1. 集群选项 部分的下拉菜单中选择 外部 作为 云提供商。这为 Kubernetes 组件设置了 --cloud-provider=external

  2. 在集群完成配置后安装 cloud-provider-azure 图表。请注意,集群尚未成功配置,节点仍处于 uninitialized 状态,直到您部署云控制器管理器。这可以通过 手动使用 CLI 或通过 UI 中的 Helm 图表 完成。

有关部署云控制器管理器的更多详细信息,请参阅 官方 Azure 上游文档

通过 CLI 安装 Helm 图表

关于 Helm 图表安装 的官方上游文档可以在 Github 上找到。

  1. 创建一个 `azure-cloud-config`包含所需 云提供商配置 的密钥。

    kubectl apply -f azure-cloud-config.yaml
  2. 添加 Helm 储存库:

    helm repo add azure-cloud-controller-manager https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo
    helm repo update
  3. 创建一个包含以下内容的 values.yaml 文件以覆盖默认 values.yaml

    • RKE2

    • RKE

    # values.yaml
    infra:
      clusterName: <cluster-name>
    cloudControllerManager:
      cloudConfigSecretName: azure-cloud-config
      cloudConfig: null
      clusterCIDR: null
      enableDynamicReloading: 'true'
      configureCloudRoutes: 'false'
      allocateNodeCidrs: 'false'
      caCertDir: /etc/ssl
      enabled: true
      replicas: 1
      hostNetworking: true
      nodeSelector:
        node-role.kubernetes.io/control-plane: 'true'
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
          value: 'true'
        - effect: NoSchedule
          key: node.cloudprovider.kubernetes.io/uninitialized
          value: 'true'
    # values.yaml
    cloudControllerManager:
      cloudConfigSecretName: azure-cloud-config
      cloudConfig: null
      clusterCIDR: null
      enableDynamicReloading: 'true'
      configureCloudRoutes: 'false'
      allocateNodeCidrs: 'false'
      caCertDir: /etc/ssl
      enabled: true
      replicas: 1
      hostNetworking: true
      nodeSelector:
        node-role.kubernetes.io/controlplane: 'true'
        node-role.kubernetes.io/control-plane: null
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/controlplane
          value: 'true'
        - effect: NoSchedule
          key: node.cloudprovider.kubernetes.io/uninitialized
          value: 'true'
    infra:
      clusterName: <cluster-name>
  4. 安装 Helm 图表:

    helm upgrade --install cloud-provider-azure azure-cloud-controller-manager/cloud-provider-azure -n kube-system --values values.yaml

    验证 Helm 图表是否成功安装:

    helm status cloud-provider-azure -n kube-system
  5. (可选)验证云控制器管理器更新是否成功:

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

    kubectl describe nodes | grep "ProviderID"

通过 UI 安装 Helm 图表

  1. 点击 ,然后从左侧导航中选择集群的名称。

  2. 选择 应用 > 储存库

  3. 点击 创建 按钮。

  4. https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo 索引 URL 字段中输入。

  5. 从左侧导航中选择 应用 > 图表 并安装 cloud-provider-azure 图表。

  6. 选择名称空间 kube-system, 并启用 安装前自定义 Helm 选项

  7. cloudConfig: /etc/kubernetes/azure.json 替换为从 Cloud Config Secret 读取并启用动态重载:

      cloudConfigSecretName: azure-cloud-config
      enableDynamicReloading: 'true'
  8. 根据需要更新以下字段:

      allocateNodeCidrs: 'false'
      configureCloudRoutes: 'false'
      clusterCIDR: null
  • RKE2

  • RKE

  1. Rancher 提供的 RKE2 节点的选择器 node-role.kubernetes.io/control-plane 设置为 true。更新节点选择器:

    nodeSelector:
      node-role.kubernetes.io/control-plane: 'true'
  1. Rancher 提供的 RKE 节点被标记为 node-role.kubernetes.io/controlplane。更新容忍度和节点选择器:

    tolerations:
      - effect: NoSchedule
        key: node.cloudprovider.kubernetes.io/uninitialized
        value: 'true'
      - effect: NoSchedule
        value: 'true'
        key: node-role.kubernetes.io/controlplane
    nodeSelector:
      node-role.kubernetes.io/controlplane: 'true'
  1. 安装图表并确认云控制器和云节点管理器成功部署:

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

    kubectl describe nodes | grep "ProviderID"

安装 CSI 驱动程序

安装 Azure Disk CSI 驱动程序的步骤如下。您可以通过遵循 helm 安装文档 以类似方式安装 Azure File CSI 驱动程序。

重要说明

集群必须使用 Managed Disk 进行配置才能使用 Azure Disk。您可以在创建 RKE1 节点模板*RKE2 机器池 时进行配置。

关于 Helm 图表安装 的官方上游文档可以在 Github 上找到。

  1. 添加并更新 helm 储存库:

    helm repo add azuredisk-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/charts
    helm repo update azuredisk-csi-driver
  2. 按照下面所示安装图表,根据需要更新 — 版本参数。请参阅 上游文档 中的最新图表配置完整列表。

    helm install azuredisk-csi-driver azuredisk-csi-driver/azuredisk-csi-driver --namespace kube-system --version v1.30.1 --set controller.cloudConfigSecretName=azure-cloud-config --set controller.cloudConfigSecretNamespace=kube-system --set controller.runOnControlPlane=true
  3. (可选)验证 azuredisk-csi-driver 安装是否成功:

    kubectl --namespace=kube-system get pods --selector="app.kubernetes.io/name=azuredisk-csi-driver" --watch
  4. 配置一个示例存储类:

    cat <<EOF | kubectl create -f -
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: standard
    provisioner: kubernetes.io/azure-disk
    parameters:
      storageaccounttype: Standard_LRS
      kind: Managed
    EOF

    验证存储类是否已配置:

    kubectl get storageclasses
  5. 创建一个 PersistentVolumeClaim:

    cat <<EOF | kubectl create -f -
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: azure-disk-pvc
    spec:
      storageClassName: standard
      accessModes:
     ** ReadWriteOnce
      resources:
     requests:
    storage: 5Gi
    EOF

    验证 PersistentVolumeClaim 和 PersistentVolume 是否已创建:

    kubectl get persistentvolumeclaim
    kubectl get persistentvolume
  6. 附加新的 Azure 磁盘:

    您现在可以将 Kubernetes PersistentVolume 挂载到 Kubernetes Pod 中。该磁盘可以被任何 Kubernetes 对象类型使用,包括 Deployment、DaemonSet 或 StatefulSet。但是,以下示例仅将 PersistentVolume 挂载到一个独立的 Pod 中。

    cat <<EOF | kubectl create -f -
    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod-dynamic-azuredisk
    spec:
      containers:
        - name: mypod
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/usr/share/nginx/html"
              name: storage
      volumes:
        - name: storage
          persistentVolumeClaim:
            claimName: azure-disk-pvc
    EOF