次の方法で共有


Azure Kubernetes Service (AKS) でマネージド ID を使用する

この記事では、Azure Kubernetes Service (AKS) でシステム割り当て、ユーザー割り当て、または事前に作成された kubelet マネージド ID を有効にして使用する手順について説明します。

AKS マネージド ID の前提条件

  • Azure Kubernetes Service (AKS) のマネージド ID の概要を参照して、AKS で使用できるさまざまな種類のマネージド ID と、それらを使用して Azure リソースに安全にアクセスする方法を理解してください。

  • この記事の例を実行する前に、 az account set コマンドを使用して、サブスクリプションを現在のアクティブなサブスクリプションとして設定します。

    az account set --subscription <subscription-id>
    
  • az group create コマンドを呼び出して、まだ Azure リソース グループがない場合は作成します。

    az group create \
        --name <resource-group-name> \
        --___location <___location>
    

Azure CLI バージョンの最小要件

制限事項

  • マネージド ID が有効になっているクラスターの別のテナントへの移動または移行はサポートされていません。

  • クラスターで Microsoft Entra ポッドマネージド ID (aad-pod-identity) が有効になっている場合、Azure Instance Metadata (IMDS) エンドポイントの呼び出しをインターセプトするよう、Node Managed Identity (NMI) ポッドによりノードの iptables が変更されます。 この構成は、特定のポッドが aad-pod-identity を使用しない場合でも、IMDS エンドポイントに対して行われた要求はすべて NMI によってインターセプトされることを意味します。

    AzurePodIdentityException カスタム リソース定義 (CRD) を構成して、CRD で定義されたラベルに一致するポッドから発信された IMDS エンドポイントへの要求を、NMI で処理せずにプロキシするように指定できます。 AzurePodIdentityException CRD を構成して、kubernetes.azure.com/managedby: akskube-system 名前空間にある aad-pod-identity ラベルを持つシステム ポッドを除外します。 詳細については、「Azure Kubernetes Service で Microsoft Entra ポッド マネージド ID を使用する」を参照してください。

    例外を構成するには、mic-exception YAML をインストールします。

  • AKS では、カスタム プライベート DNS ゾーンを使用する場合、システム割り当てマネージド ID の使用はサポートされていません。

  • Azure US Government クラウドの USDOD Central、USDOD East、USGov アイオワ リージョンは、ユーザー割り当てマネージド ID を使用したクラスターの作成をサポートしていません。

  • 事前に作成された kubelet マネージド ID は、ユーザー割り当てマネージド ID である必要があります。
  • 21Vianet が運用する Microsoft Azure の中国東部および中国北部のリージョンはサポートされていません。

クラスターを更新する場合、次の情報に注意してください。

  • 更新プログラムは、使用する VHD 更新プログラムがある場合にのみ機能します。 最新の VHD を実行している場合は、更新を実行するために、次の VHD が使用可能になるまで待つ必要があります。

  • Azure CLI により、移行後にアドオンのアクセス許可が正しく設定されていることが確認されます。 移行操作の実行に Azure CLI を使用しない場合は、アドオン ID のアクセス許可を自分で処理する必要があります。 Azure Resource Manager (ARM) テンプレートの使用例については、「ARM テンプレートを使用して Azure でのロールを割り当てる」を参照してください。

  • クラスターで --attach-acr を使用して Azure Container Registry (ACR) からイメージをプルする場合は、クラスターを更新した後に az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> コマンドを実行して、マネージド ID に使用される新しく作成された kubelet が ACR からプルするアクセス許可を取得できるようにする必要があります。 そうしないと、更新の後に ACR からプルできなくなります。

AKS クラスターでシステム割り当てマネージド ID を有効にする

新しい AKS クラスターでシステム割り当てマネージド ID を有効にする

新しい AKS クラスターを作成すると、システム割り当てマネージド ID が既定で有効になります。

  • az aks create コマンドを使用して、AKS クラスターを作成します。

    az aks create \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --generate-ssh-keys
    

システム割り当てマネージド ID を使用するように既存の AKS クラスターを更新する

  • az aks update パラメーターを使用して、--enable-managed-identity コマンドを使用して、既存の AKS クラスターをサービス プリンシパルからシステム割り当てマネージド ID に更新します。

    az aks update \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --enable-managed-identity
    

    サービス プリンシパルではなくシステム割り当てマネージド ID を使用するようにクラスターを更新すると、コントロール プレーンとポッドは、Azure の他のサービスにアクセスするときに、認可のためにシステム割り当てマネージド ID を使用します。 Kubelet は、エージェント プールもアップグレードするまで、サービス プリンシパルの使用を続けます。 ノードで az aks nodepool upgrade --resource-group <resource-group-name> --cluster-name <aks-cluster-name> --name <node-pool-name> --node-image-only コマンドを使用して、マネージド ID に更新することができます。 ノード プールのアップグレードでは、ノード プール内のノードが切断、ドレイン、再イメージ化されるため、AKS クラスターのダウンタイムが発生します。

システム割り当てマネージド ID のプリンシパル ID を取得する

  • az aks show コマンドを使用して、クラスターのシステム割り当てマネージド ID のプリンシパル ID を取得します。

    CLIENT_ID=$(az aks show \
        --name <aks-cluster-name> \
        --resource-group <resource-group-name> \
        --query identity.principalId \
        --output tsv)
    

システム割り当てマネージド ID のロールの割り当てを追加する

  • az role assignment create コマンドを使用して、システム割り当てマネージド ID に Azure RBAC ロールを割り当てます。

    VNet、接続された Azure ディスク、静的 IP アドレス、既定のワーカー ノード リソース グループの外部にあるルート テーブルの場合は、カスタム リソース グループに Network Contributor ロールを割り当てる必要があります。

    次の例では、システム割り当てマネージド ID に ネットワーク共同作成者 ロールを割り当てます。 ロールの割り当てのスコープは、VNet を含むリソース グループです。

    az role assignment create \
        --assignee <client-id> \
        --role "Network Contributor" \
        --scope <custom-resource-group-id>
    

    クラスターのマネージド ID に付与されたアクセス許可が反映されるまでに、最大 60 分かかる場合があります。

ユーザー割り当てマネージド ID を作成する

  • ユーザー割り当てマネージド ID リソースがまだない場合は、az identity create コマンドを使用して作成します。

    az identity create \
        --name <identity-name> \
        --resource-group <resource-group-name>
    

    出力は、次の出力例のようになります。

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>",
      "___location": "<___location>",
      "name": "<identity-name>",
      "principalId": "<principal-id>",
      "resourceGroup": "<resource-group-name>",
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

ユーザー割り当てマネージド ID のプリンシパル ID を取得する

  • az identity show コマンドを使用して、ユーザー割り当てマネージド ID のプリンシパル ID を取得します。

    CLIENT_ID=$(az identity show \
        --name <identity-name> \
        --resource-group <resource-group-name> \
        --query principalId \
        --output tsv)
    

ユーザー割り当てマネージド ID のリソース ID を取得する

  • az identity show コマンドを使用して、ユーザー割り当てマネージド ID のリソース ID を取得します。

    RESOURCE_ID=$(az identity show \
        --name <identity-name> \
        --resource-group <resource-group-name> \
        --query id \
        --output tsv)
    

ユーザー割り当てマネージド ID に Azure RBAC の役割を割り当てる

  • az role assignment create コマンドを使用して、ユーザー割り当てマネージド ID のロールの割り当てを追加します。

    次の例では、ユーザー割り当てマネージド ID に Key Vault Secrets User ロールを割り当て、キー コンテナー内のシークレットにアクセスするためのアクセス許可を付与します。 ロールの割り当ての範囲はキー コンテナー リソースに限定されます。

    az role assignment create \
        --assignee <client-id> \
        --role "Key Vault Secrets User" \
        --scope "<keyvault-resource-id>"
    

    クラスターのマネージド ID に付与されたアクセス許可が反映されるまでに、最大 60 分かかる場合があります。

AKS クラスターでユーザー割り当てマネージド ID を有効にする

新しい AKS クラスターでユーザー割り当てマネージド ID を有効にする

  • az aks create コマンドを使用して、ユーザー割り当てマネージド ID を使用して AKS クラスターを作成します。 --assign-identity パラメーターを含めて、ユーザー割り当てマネージド ID のリソース ID を渡します。

    az aks create \
        --resource-group <resource-group-name> \
        --name <cluster-name> \
        --network-plugin azure \
        --vnet-subnet-id <vnet-subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --assign-identity $RESOURCE_ID \
        --generate-ssh-keys
    

ユーザー割り当てマネージド ID を使用するように既存のクラスターを更新する

  • az aks update コマンドを使用して、ユーザー割り当てマネージド ID を使用するように既存のクラスターを更新します。 --assign-identity パラメーターを含めて、ユーザー割り当てマネージド ID のリソース ID を渡します。

    az aks update \
        --resource-group <resource-group-name> \
        --name <cluster-name> \
        --enable-managed-identity \
        --assign-identity $RESOURCE_ID
    

    ユーザー割り当てマネージド ID を使用するようにクラスターを正常に更新した場合の出力は、次の出力例のようになります。

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
    

    コントロール プレーンのマネージド ID をシステム割り当てからユーザー割り当てに移行しても、コントロール プレーンとエージェント プールにダウンタイムは発生しません。 コントロール プレーン コンポーネントは、次のトークンが更新されるまで、最大数時間、古いシステム割り当て ID が引き続き使用されます。

クラスターが使用しているマネージド ID の種類を確認する

  • az aks show コマンドを使用して、クラスターが使用しているマネージド ID の種類を確認します。

    az aks show \
        --name <aks-cluster-name> \
        --resource-group <resource-group-name> \
        --query identity.type \
        --output tsv       
    

    クラスターがマネージド ID を使用している場合、type プロパティの値は SystemAssigned または UserAssigned のいずれかになります。

    クラスターがサービス プリンシパルを使用している場合、type プロパティの値は null になります。 マネージド ID を使用するようにクラスターをアップグレードすることを検討してください。

kubelet マネージド ID を作成する

  • kubelet マネージド ID を持っていない場合は、az identity create コマンドを使用して作成します。

    az identity create \
        --name <kubelet-identity-name> \
        --resource-group <resource-group-name>
    

    出力は、次の出力例のようになります。

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<kubelet-identity-name>",
      "___location": "<___location>",
      "name": "<kubelet-identity-name>",
      "principalId": "<principal-id>",
      "resourceGroup": "<resource-group-name>",
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

RBAC の役割を kubelet マネージド ID に割り当てる

  • acrpull コマンドを使用して、kubelet マネージド ID にaz role assignment create ロールを割り当てます。

    az role assignment create \
        --assignee <kubelet-client-id> \
        --role "acrpull" \
        --scope "<acr-registry-id>"
    

AKS クラスターで kubelet マネージド ID を有効にする

新しい AKS クラスターで kubelet マネージド ID を有効にする

  • az aks create コマンドを使用して、既存の ID で AKS クラスターを作成します。

    az aks create \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --network-plugin azure \
        --vnet-subnet-id <vnet-subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id> \
        --generate-ssh-keys
    

    kubelet マネージド ID を使用して AKS クラスターを正常に作成すると、次のような出力が得られます。

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<kubelet-identity-name>"
        }
      },
    

kubelet マネージド ID を使用するように既存のクラスターを更新する

kubelet マネージド ID を使用するように既存のクラスターを更新するには、まず AKS クラスターの現在のコントロール プレーンのマネージド ID を取得します。

警告

kubelet マネージド ID を更新すると、AKS クラスターのノード プールがアップグレードされます。これを実行する前に、ワークロードの中断を回避したり、メンテナンス期間中にこれを実行したりするために、ポッド中断予算などの適切な可用性構成が構成されていることを確認します。

  1. az aks show コマンドを使用して、AKS クラスターでユーザー割り当てマネージド ID が使用されていることを確認します。

    az aks show \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --query "servicePrincipalProfile"
    

    クラスターがマネージド ID を使用している場合、出力には clientIdmsi の値で表示されます。 サービス プリンシパルを使用するクラスターに、オブジェクト ID が表示されます。 次に例を示します。

    # The cluster is using a managed identity.
    {
      "clientId": "msi"
    }
    
  2. クラスターでマネージド ID が使用されていることを確認したら、az aks show コマンドを使用して、マネージド ID のリソース ID を見つけます。

    az aks show --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --query "identity"
    

    ユーザー割り当てマネージド ID の場合、出力は次の出力例のようになります。

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": <identity-resource-id>
          "clientId": "<client-id>",
          "principalId": "<principal-id>"
    },
    
  3. az aks update コマンドを使用して、既存の ID でクラスターを更新します。 assign-identity 引数には、コントロール プレーンのユーザー割り当てマネージド ID のリソース ID を指定します。 assign-kubelet-identity 引数に kubelet マネージド ID のリソース ID を指定します。

    az aks update \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    独自の kubelet マネージド ID を使用してクラスターを正常に更新した場合の出力は、次の出力例のようになります。

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<kubelet-identity-name>"
        }
      },
    

kubelet マネージド ID のプロパティを取得する

  • az aks show コマンドを使用して kubelet マネージド ID のプロパティを取得し、identityProfile.kubeletidentity プロパティに対してクエリを実行します。

    az aks show \
        --name <aks-cluster-name> \
        --resource-group <resource-group-name> \
        --query "identityProfile.kubeletidentity"
    

次のステップ