跳至主要内容

設定 Azure 雲端提供者

重要:

在 Kubernetes 1.30 及更高版本中,你必須使用 out-of-tree Azure 雲端提供者。Azure 雲端提供者已被完全移除,在升級到 Kubernetes 1.30 後將無法運作。下面列出的步驟仍然需要設定 Azure 雲端提供者。你可以在完成 Azure 的先決條件後,設定 out-of-tree 雲端提供者。

你也可以在 Kubernetes 1.29 及更早版本上從 in-tree 遷移到 out-of-tree Azure 雲端提供者。所有現有叢集必須在升級到 v1.30 之前進行遷移,以保持功能正常。

從 Kubernetes 1.29 開始,in-tree 雲端提供者已被停用。你必須將 DisableCloudProviders 和 DisableKubeletCloudCredentialProviders 功能閘道設定為 false 才能使用 in-tree Azure 雲端提供者。你可以透過在進階叢集配置中為叢集的 Kubelet、Controller Manager 和 API Server 設定 feature-gates=DisableCloudProviders=false,DisableKubeletCloudCredentialProviders=false 作為額外參數來實現此操作。在 Kubelet、Controller Manager 和 API Server 參數中設定 DisableKubeletCloudCredentialProviders=false 可啟用 in-tree 功能,用於向 Azure 容器登錄進行身份驗證以取得映像拉取憑證。有關更多詳細資訊,請參閱 Kubernetes 1.29:Mandala 發布說明和此部落格文章。

從 Kubernetes 版本 1.26 開始,in-tree 持久磁碟區類型 kubernetes.io/azure-disk 和 kubernetes.io/azure-file 已被棄用,將不再受支援。對於新叢集,請安裝 CSI 驅動程式,或按照上游遷移文件遷移到相應的 CSI 驅動程式 disk.csi.azure.com 和 file.csi.azure.com。

當使用 Azure 雲端提供者時,你可以利用以下功能:

  • 負載平衡器: 在特定網路安全群組中啟動 Azure Load Balancer。

  • 持久磁碟區: 支援使用具有標準和進階儲存帳戶的 Azure Blob 磁碟和 Azure 受控磁碟。

  • 網路儲存: 透過 CIFS 掛載支援 Azure Files。

Azure 訂閱不支援以下帳戶類型:

  • 單一租戶帳戶(即沒有訂閱的帳戶)。
  • 多訂閱帳戶。

RKE 和 RKE2 的先決條件​

要為 RKE 和 RKE2 設定 Azure 雲端提供者,需要配置以下憑證:

  1. 設定 Azure Tenant ID
  2. 設定 Azure Client ID 和 Azure Client Secret
  3. 配置應用程式註冊權限
  4. 設定 Azure 網路安全群組名稱

1. 設定 Azure Tenant ID​

訪問 Azure portal,登入並前往 Azure Active Directory 並選擇 Properties。你的 Directory ID 就是你的 Tenant ID (tenantID)。

如果你想使用 Azure CLI,可以執行命令 az account show 來取得資訊。

2. 設定 Azure Client ID 和 Azure Client Secret​

訪問 Azure portal,登入並按照以下步驟建立 App Registration 以及相應的 Azure Client ID (aadClientId) 和 Azure Client Secret (aadClientSecret)。

  1. 選擇 Azure Active Directory。
  2. 選擇 App registrations。
  3. 選擇 New application registration。
  4. 選擇一個 Name,選擇 Web app / API 作為 Application Type,以及一個 Sign-on URL(在這種情況下可以是任何內容)。
  5. 選擇 Create。

在 App registrations 檢視中,你應該看到你建立的 App registration。在 APPLICATION ID 欄位中顯示的值就是你需要用作 Azure Client ID 的值。

下一步是生成 Azure Client Secret:

  1. 開啟你建立的 App registration。
  2. 在 Settings 檢視中,開啟 Keys。
  3. 輸入 Key description,選擇過期時間並選擇 Save。
  4. 在 Value 欄位中顯示的生成值就是你需要用作 Azure Client Secret 的值。此值只會顯示一次。

3. 配置應用程式註冊權限​

最後你需要做的是為你的 App registration 指派適當的權限。

  1. 前往 More services,搜尋 Subscriptions 並開啟它。
  2. 開啟 Access control (IAM)。
  3. 選擇 Add。
  4. 對於 Role,選擇 Contributor。
  5. 對於 Select,選擇你建立的 App registration 名稱。
  6. 選擇 Save。

4. 設定 Azure 網路安全群組名稱​

需要自訂 Azure 網路安全群組(securityGroupName)以允許 Azure Load Balancers 工作。

如果你使用 Rancher Machine Azure 驅動程式佈建主機,則需要手動編輯它們以將它們指派給此網路安全群組。

你應該在佈建期間將自訂主機指派給此網路安全群組。

只有預期作為負載平衡器後端的主機需要在此群組中。

在 Rancher 中設定 RKE2 叢集​

重要:

本節僅適用於使用 in-tree 雲端提供者建立叢集。

  1. 在叢集配置部分的雲端提供者下拉式選單中選擇 "Azure"。

  2. 提供雲端提供者配置。請注意,Rancher 會自動建立新的網路安全群組、資源群組、可用性集、子網路和虛擬網路。如果你已經建立了部分或全部這些資源,則必須在建立叢集之前指定它們。

    • 點擊 Show Advanced 以檢視或編輯這些自動生成的名稱。你的雲端提供者配置必須與機器集區部分中的欄位相符。如果你有多個集區,它們都必須使用相同的資源群組、可用性集、子網路、虛擬網路和網路安全群組。
    • 以下提供一個範例。根據需要進行修改。
    雲端提供者配置範例
    {
    "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. 在 Cluster Configuration > Advanced 部分下,點擊 Additional Controller Manager Args 下的 Add 並新增此旗標:--configure-cloud-routes=false

  4. 點擊 Create 提交表單並建立叢集。

雲端提供者配置​

Rancher 會自動建立新的網路安全群組、資源群組、可用性集、子網路和虛擬網路。如果你已經建立了部分或全部這些資源,則需要在建立叢集之前指定它們。你可以檢查 RKE1 節點範本或 RKE2 機器集區以檢視或編輯這些自動生成的名稱。

請參閱上游文件中的完整配置選項清單。

備註
  1. useInstanceMetadata 必須設定為 true,以便雲端提供者正確配置 providerID。
  2. 如果你需要將標記為 node-role.kubernetes.io/master 的節點新增到 Azure Load Balancer (ALB) 的後端,則必須將 excludeMasterFromStandardLB 設定為 false。
  3. loadBalancerSku 可以設定為 basic 或 standard。Basic SKU 將於 2025 年 9 月棄用。有關更多資訊,請參閱 Azure 上游文件。

Azure 支援從 Kubernetes secrets 讀取雲端配置。secret 是 azure.json 檔案的序列化版本。當 secret 變更時,cloud controller manager 會重新建構自身而不重新啟動 pod。建議 Helm chart 從 secret 讀取雲端提供者配置。

請注意,chart 從 kube-system 命名空間中的給定 secret 名稱讀取雲端提供者配置。由於 Azure 讀取 Kubernetes secrets,因此還需要配置 RBAC。下面顯示雲端提供者配置的範例 secret。根據需要進行修改並建立 secret。

# 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,
}

使用 Out-of-Tree Azure 雲端提供者​

  1. 在叢集配置部分的雲端提供者下拉式選單中選擇 External。

  2. 在 Cluster Configuration > Advanced 下,點擊 Additional Controller Manager Args 下的 Add 並新增此旗標:--configure-cloud-routes=false。

  3. 準備雲端提供者配置以在下一步中設定它。請注意,Rancher 會自動建立新的網路安全群組、資源群組、可用性集、子網路和虛擬網路。如果你已經建立了部分或全部這些資源,則必須在建立叢集之前指定它們。

    點擊 Show Advanced 以檢視或編輯這些自動生成的名稱。你的雲端提供者配置必須與機器集區部分中的欄位相符。如果你有多個集區,它們都必須使用相同的資源群組、可用性集、子網路、虛擬網路和網路安全群組。

  4. 在 Cluster Configuration > Add-on Config 下,將下面顯示的 cloud controller manager 清單新增到 Additional Manifest 中。 請注意,此 chart 從 kube-system 命名空間中的 secret 讀取雲端提供者配置。下面顯示雲端提供者配置的範例 secret;根據需要進行修改。請參閱上游文件中的完整配置選項清單。

或者,你也可以使用 Helm CLI 安裝 cloud controller manager。

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,
}
  1. 點擊 Create 提交表單並建立叢集。

從 CLI 安裝 Helm Chart​

官方上游 Helm chart 安裝文件可以在 Github 上找到。

  1. 使用所需的雲端提供者配置建立 azure-cloud-config secret。
kubectl apply -f azure-cloud-config.yaml
  1. 新增 Helm 儲存庫:
helm repo add azure-cloud-controller-manager https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo
helm repo update
  1. 建立一個 values.yaml 檔案,內容如下以覆蓋預設的 values.yaml:
# 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'
  1. 安裝 Helm chart:
helm upgrade --install cloud-provider-azure azure-cloud-controller-manager/cloud-provider-azure -n kube-system --values values.yaml

驗證 Helm chart 是否成功安裝:

helm status cloud-provider-azure -n kube-system
  1. (選擇性) 驗證 cloud controller manager 更新是否成功:
kubectl rollout status deployment -n kube-system cloud-controller-manager
kubectl rollout status daemonset -n kube-system cloud-node-manager
  1. 雲端提供者負責設定節點的 ProviderID。檢查是否所有節點都已使用 ProviderID 初始化:
kubectl describe nodes | grep "ProviderID"

從 UI 安裝 Helm Chart​

  1. 點擊 ☰,然後從左側導覽選擇叢集名稱。

  2. 選擇 Apps > Repositories。

  3. 點擊 Create 按鈕。

  4. 在 Index URL 欄位中輸入 https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo。

  5. 從左側導覽選擇 Apps > Charts 並安裝 cloud-provider-azure chart。

  6. 選擇命名空間 kube-system,並啟用 Customize Helm options before install。

  7. 將 cloudConfig: /etc/kubernetes/azure.json 替換為從 Cloud Config Secret 讀取並啟用動態重新載入:

  cloudConfigSecretName: azure-cloud-config
enableDynamicReloading: 'true'
  1. 根據需要更新以下欄位:
  allocateNodeCidrs: 'false'
configureCloudRoutes: 'false'
clusterCIDR: null
  1. Rancher 佈建的 RKE2 節點將選擇器 node-role.kubernetes.io/control-plane 設定為 true。更新 nodeSelector:
nodeSelector:
node-role.kubernetes.io/control-plane: 'true'
  1. 安裝 chart 並確認 cloud controller 和 cloud node manager 成功部署:
kubectl rollout status deployment -n kube-system cloud-controller-manager
kubectl rollout status daemonset -n kube-system cloud-node-manager
  1. 雲端提供者負責設定節點的 ProviderID。檢查是否所有節點都已使用 ProviderID 初始化:
kubectl describe nodes | grep "ProviderID"

安裝 CSI 驅動程式​

安裝 Azure Disk CSI driver 或 Azure File CSI Driver 以分別存取 Azure Disk 或 Azure File 磁碟區。

以下顯示安裝 Azure Disk CSI driver 的步驟。你可以按照 helm 安裝文件以類似的方式安裝 Azure File CSI Driver。

::: note 重要:

叢集必須使用 Managed Disk 佈建才能使用 Azure Disk。你可以在建立 RKE1 節點範本或 RKE2 機器集區時配置此項。

:::

官方上游 Helm chart 安裝文件可以在 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
  1. 如下所示安裝 chart,根據需要更新 --version 參數。請參閱上游文件中最新 chart 配置的完整清單。
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
  1. (選擇性) 驗證 azuredisk-csi-driver 安裝是否成功:
kubectl --namespace=kube-system get pods --selector="app.kubernetes.io/name=azuredisk-csi-driver" --watch
  1. 佈建範例 Storage Class:
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

驗證 storage class 是否已佈建:

kubectl get storageclasses
  1. 建立 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
  1. 附加新的 Azure Disk:

你現在可以將 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