Azureクラウドプロバイダーの設定

重要:

Kubernetes 1.30以降では、アウトオブツリーのAzureクラウドプロバイダーを使用する必要があります。Azureクラウドプロバイダーは 完全に削除されました。Kubernetes 1.30にアップグレード後は機能しません。以下に示す手順は、Azureクラウドプロバイダーを設定するために依然として必要です。Azureの前提条件を完了した後に、アウトオブツリーのクラウドプロバイダーを設定できます。

Kubernetes 1.29以前では、インツリーからアウトオブツリーのAzureクラウドプロバイダーに移行することもできます。すべての既存のクラスターは、機能を維持するためにv1.30にアップグレードする前に移行する必要があります。

Kubernetes 1.29以降、インツリーのクラウドプロバイダーは無効化されています。インツリーのAzureクラウドプロバイダーを使用するには、`DisableCloudProviders`と`DisableKubeletCloudCredentialProviders`のフィーチャーゲートを`false`に設定する必要があります。これは、クラスターのKubelet、コントローラーマネージャー、およびAPIサーバーの高度なクラスター設定で`feature-gates=DisableCloudProviders=false,DisableKubeletCloudCredentialProviders=false`を追加の引数として設定することで実行できます。Kubelet、コントローラーマネージャー、およびAPIサーバーの引数に`DisableKubeletCloudCredentialProviders=false`を設定すると、Azureコンテナレジストリへの認証のためのインツリー機能が有効になります。詳細については、 Kubernetes 1.29: Mandalaリリースノートおよびこの ブログ投稿を参照してください。

Kubernetesバージョン1.26以降、インツリーの永続ボリュームタイプ`kubernetes.io/azure-disk`と`kubernetes.io/azure-file`は廃止され、もはやサポートされません。新しいクラスターの場合、CSIドライバーをインストールするか、`disk.csi.azure.com`および`file.csi.azure.com`に対応するCSIドライバーに移行するには、 アップストリーム移行ドキュメントに従ってください。

`Azure`クラウドプロバイダーを使用する場合、次の機能を活用できます:

  • *ロードバランサー:*特定のネットワークセキュリティグループ内にAzureロードバランサーを起動します。

  • *永続ボリューム:*標準およびプレミアムストレージアカウントでAzure BlobディスクおよびAzureマネージドディスクの使用をサポートします。

  • *ネットワークストレージ:*CIFSマウントを介してAzure Filesをサポートします。

次のアカウントタイプは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. *作成*を選択します。

アプリ登録*のビューで、作成したアプリ登録が表示されるはずです。列 *APPLICATION ID に表示されている値は、Azure Client ID として使用する必要があります。

次のステップは、Azure Client Secret を生成することです。

  1. 作成したアプリ登録を開いてください。

  2. 設定 ビューで、キー を開いてください。

  3. キーの説明 を入力し、期限を選択して、保存 を選択してください。

  4. 列 値 に表示される生成された値は、Azure Client Secret として使用する必要があります。この値は一度だけ表示されます。

3.アプリ登録の権限を設定する

最後に行う必要があるのは、アプリ登録に適切な権限を割り当てることです。

  1. その他のサービス に移動し、サブスクリプション を検索して開いてください。

  2. *アクセス制御 (IAM)*を開いてください。

  3. *追加*を選択します。

  4. *役割*には、Contributor を選択してください。

  5. *選択*には、作成したアプリ登録の名前を選択してください。

  6. *保存*を選択します。

4.Azureネットワークセキュリティグループ名を設定する

Azureロードバランサーが機能するためには、カスタムAzureネットワークセキュリティグループ (securityGroupName) が必要です。

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`は、Azureロードバランサー(ALB)のバックエンドに`false`というラベルが付けられたノードを追加する必要がある場合、`node-role.kubernetes.io/master`に設定する必要があります。

  3. `loadBalancerSku`は`basic`または`standard`に設定できます。基本SKUは2025年9月に廃止されます。詳細については、 Azureのアップストリームドキュメントを参照してください。

AzureはKubernetesシークレットからクラウド設定を読み取ることをサポートしています。シークレットはazure.jsonファイルのシリアライズされたバージョンです。シークレットが変更されると、クラウドコントローラーマネージャーはポッドを再起動せずに自らを再構築します。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. [Create]ボタンをクリックします。

  4. *インデックスURL*フィールドに`https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo`を入力します。

  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を更新する:

    nodeSelector:
      node-role.kubernetes.io/control-plane: 'true'
  1. RancherがプロビジョニングしたRKEノードは、`node-role.kubernetes.io/controlplane`でテイントされています。トレランスとnodeSelectorを更新する:

    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ドライバーまたは Azure File CSIドライバーをインストールして、それぞれ Azure Diskまたは Azure Fileボリュームにアクセスします。

Azure Disk CSIドライバーをインストールする手順は以下の通りです。Azure File CSIドライバーも同様の方法で、 helmインストールドキュメントに従ってインストールできます。

重要

Azure Diskを使用するには、クラスタを`Managed 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にマウントできます。ディスクは、Deployment、DaemonSet、またはStatefulSetを含む任意のKubernetesオブジェクトタイプによって使用できます。ただし、以下の例では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