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

Azure Kubernetes Service (AKS) クラスターでは、ロード バランサーやマネージド ディスクなどの Azure リソースにアクセスするための ID が必要です。 ID は、"マネージド ID" または "サービス プリンシパル" とすることができます。

この記事では、新規または既存の AKS クラスターで次のマネージド ID の種類を有効にする方法について詳しく説明します。

  • システム割り当てマネージド ID
  • 独自のユーザー割り当てマネージド ID を使用する
  • 事前に作成された Kubelet マネージド ID を使用する

概要

AKS クラスターをデプロイすると、システム割り当てマネージド ID が自動的に作成され、Azure プラットフォームによって管理されるため、シークレットをプロビジョニングまたはローテーションする必要はありません。 詳細については、「Azure リソース用マネージド ID」を参照してください。

AKS ではサービス プリンシパルが自動的に作成されないため、サービス プリンシパルを作成する必要があります。 サービス プリンシパルを使用するクラスターは最終的に有効期限が切れるので、ID によるクラスター認証への影響を避けるためにサービス プリンシパルを更新する必要があります。 サービス プリンシパルを管理する場合、複雑さが増すため、代わりにマネージド ID を使用した方が簡単です。 アクセス許可の要件は、サービス プリンシパルにおいてもマネージド ID においても同じです。 マネージド ID には、証明書ベースの認証が使用されます。 各マネージド ID の資格情報は有効期限が "90 日"で、"45 日後" にローテーションされます。

AKS では、システム割り当て、およびユーザー割り当てマネージド ID の両方の種類が使用され、これらの ID は不変です。 これらの ID の種類は、ポッドで実行されているアプリケーションで使用することを目的とした Microsoft Entra ワークロード ID と混同しないでください。

重要

Azure Kubernetes Service のオープン ソースの Microsoft Entra ポッドマネージド ID (プレビュー) は、2022 年 10 月 24 日に非推奨となり、プロジェクトは 2023 年 9 月にアーカイブされました。 詳細については、非推奨に関する通知を参照してください。 AKS マネージド アドオンは、2024 年 9 月に非推奨となります。

最初に Microsoft Entra ワークロード ID の概要を確認することをお勧めします。 Entra ワークロード ID 認証は、Microsoft Entra ポッドマネージド ID (プレビュー) に代わるものであり、ポッドで実行されているアプリケーションで、それをサポートする他の Azure サービスに対してそれ自体を認証できるようにするために推奨される方法です。

開始する前に

制限事項

  • マネージド ID が有効になっているクラスターのテナントの移動または移行はサポートされていません。
  • クラスターで Microsoft Entra ポッドマネージド ID (aad-pod-identity) が有効になっている場合、Azure Instance Metadata (IMDS) エンドポイントの呼び出しをインターセプトするよう、Node Managed Identity (NMI) ポッドによりノードの iptables が変更されます。 この構成の場合、Metadata エンドポイントに要求が行われると、ポッドで aad-pod-identity が使用されていない場合でも NMI により要求がインターセプトされます。 CRD に定義されているラベルに一致するポッドから Metadata エンドポイントに要求が行われた場合、NMI で何も処理することなく、その要求をプロキシ処理することを aad-pod-identity に通知するよう、AzurePodIdentityException CRD を構成できます。 kubernetes.azure.com/managedby: aks 名前空間の kubernetes.azure.com/managedby: aks ラベルを持つシステム ポッドは、AzurePodIdentityException CRD を構成することで、aad-pod-identity で除外してください。
  • AKS では、カスタム プライベート DNS ゾーンを使用する場合、システム割り当てマネージド ID の使用はサポートされていません。

マネージド ID の概要

AKS では、組み込みのサービスとアドオンに対して複数のマネージド ID が使用されます。

ID 名前 使用事例 既定のアクセス許可 独自の ID を使用する
コントロール プレーン AKS クラスター名 イングレス ロード バランサーと AKS マネージド パブリック IP、クラスター オートスケーラー、Azure ディスク、ファイル、BLOB CSI ドライバーなど、クラスター リソースを管理する目的で、AKS コントロール プレーン コンポーネントによって使用されます。 ノード リソース グループの共同作成者ロール サポートされています
kubelet AKS クラスター名 - agentpool Azure Container Registry (ACR) を使用した認証。 N/A (kubernetes v1.15+ 用) サポートされています
アドオン AzureNPM ID は必要ありません。 該当なし いいえ
アドオン AzureCNI ネットワーク監視 ID は必要ありません。 該当なし いいえ
アドオン azure-policy (ゲートキーパー) ID は必要ありません。 該当なし いいえ
アドオン azure-policy ID は必要ありません。 該当なし いいえ
アドオン Calico ID は必要ありません。 該当なし いいえ
アドオン ダッシュボード ID は必要ありません。 該当なし いいえ
アドオン アプリケーション ルーティング Azure DNS と Azure Key Vault の証明書を管理する Key Vault シークレット Key Vault のユーザー ロール、DNS ゾーンの DNZ ゾーン共同作成者ロール、プライベート DNS ゾーンのプライベート DNS ゾーン共同作成者ロール いいえ
アドオン HTTPApplicationRouting 必要なネットワーク リソースを管理します。 ノード リソース グループの閲覧者ロール、DNS ゾーンの共同作成者ロール いいえ
アドオン イングレス アプリケーション ゲートウェイ 必要なネットワーク リソースを管理します。 ノード リソース グループの共同作成者ロール いいえ
アドオン omsagent AKS メトリックを Azure Monitor に送信するために使用されます。 監視メトリック パブリッシャー ロール いいえ
アドオン 仮想ノード (ACIConnector) Azure Container Instances (ACI) のために必要なネットワーク リソースを管理します。 ノード リソース グループの共同作成者ロール いいえ
アドオン コスト分析 コストの割り当てデータを収集するために使用されます
ワークロード ID Microsoft Entra ワークロード ID Microsoft Entra ワークロード ID を使って、アプリケーションからクラウド リソースに安全にアクセスできるようにします。 該当なし いいえ

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

Note

独自の kubelet マネージド ID を指定しない場合、AKS によってノード リソース グループにユーザー割り当て kubelet ID が作成されます。

Note

クラスターで既にマネージド ID が使用されており、その ID が変更された場合 (たとえば、クラスター ID の種類をシステム割り当てからユーザー割り当てに更新した場合)、コントロール プレーン コンポーネントが新しい ID に切り替えられるまでには遅延が生じます。 コントロール プレーン コンポーネントは、そのトークンの有効期限が切れるまでは古い ID を使用し続けます。 トークンが更新されると、新しい ID に切り替わります。 このプロセスには数時間かかる場合があります。

  1. az group create コマンドを使用して、Azure リソース グループを作成します。

    az group create --name myResourceGroup --location westus2
    
  2. az aks create コマンドを使用して、AKS クラスターを作成します。

    az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity
    
  3. az aks get-credentials コマンドを使用して、クラスターにアクセスするための資格情報を取得します。

    az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    

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

サービス プリンシパルを使用している既存の AKS クラスターを、システム割り当てマネージド ID が使用されるように更新するには、az aks update コマンドを実行します。

az aks update -g myResourceGroup -n myManagedCluster --enable-managed-identity

クラスターを更新した後、コントロール プレーンとポッドではマネージド ID を使用します。 agentpool をアップグレードするまで、kubelet ではサービス プリンシパルを使用し続けます。 ノードで az aks nodepool upgrade --resource-group myResourceGroup --cluster-name myAKSCluster --name mynodepool --node-image-only コマンドを使用して、マネージド ID に更新することができます。 ノードプールをアップグレードすると、AKS クラスターのダウンタイムが発生します。これは、ノードプール内のノードが切断/ドレインされ、再イメージ化されるためです。

Note

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

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

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

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

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

独自の VNet、アタッチされた Azure ディスク、静的 IP アドレス、ルート テーブル、またはリソースがワーカー ノード リソース グループの外部にあるユーザー割り当て kubelet ID を作成して使用する場合、Azure CLI によってロールの割り当てが自動的に追加されます。 ARM テンプレートまたは別の方法を使用している場合は、クラスターのマネージド ID のプリンシパル ID を使用して、ロールの割り当てを実行する必要があります。

Azure CLI を使用せず、独自の VNet、アタッチした Azure ディスク、静的 IP アドレス、ルート テーブル、またはワーカー ノード リソース グループの外部にあるユーザー割り当て kubelet ID を使用している場合は、コントロール プレーンにユーザー割り当てマネージド ID を使用することをお勧めします。 コントロール プレーンでシステム割り当てマネージド ID を使用する場合、クラスターを作成する前に ID を取得することはできないため、ロールの割り当てが有効になるまでに延期期間が発生します。

マネージド ID のプリンシパル ID を取得する

  • az identity show コマンドを使用して、既存の ID のプリンシパル ID を取得します。

    az identity show --ids <identity-resource-id>
    

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

    {
      "clientId": "<client-id>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity",
      "location": "eastus",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

ロールの割り当ての追加

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

  • az role assignment create コマンドを使用して、カスタム リソース グループに Contributor ロールを割り当てます。

    az role assignment create --assignee <control-plane-identity-principal-id> --role "Contributor" --scope "<custom-resource-group-resource-id>"
    

既定のワーカー ノード リソース グループの外部にあるユーザー割り当て kubelet ID の場合は、コントロール プレーン マネージド ID の kubelet ID にマネージド ID オペレーター ロールを割り当てる必要があります。

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

    az role assignment create --assignee  <control-plane-identity-principal-id> --role "Managed Identity Operator" --scope "<kubelet-identity-resource-id>"
    

Note

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

独自の マネージド ID を使用する

ユーザー割り当てマネージド ID を使用してクラスターを作成する

コントロール プレーンにカスタム ユーザー割り当てマネージド ID を使用すると、クラスターの作成前に、既存の ID にアクセスできます。 この機能により、カスタム VNet や outboundType UDR を、事前作成されたマネージド ID と一緒に使用するなどのシナリオが可能になります。

Note

Azure US Government クラウドの US DoD 中部、US DoD 東部、US Gov アイオワ州リージョンはサポートされていません。

独自の kubelet マネージド ID を指定しない場合、AKS によってノード リソース グループにユーザー割り当て kubelet ID が作成されます。

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

    az identity create --name myIdentity --resource-group myResourceGroup
    

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

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

Note

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

  • クラスターを作成する前に、az role assignment create コマンドを使用してマネージド ID のロールの割り当てを追加します。

  • ユーザー割り当てマネージド ID を使用してクラスターを作成します。

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id>
    

既存のクラスターでマネージド ID を更新する

注意

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

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

    az identity create --name myIdentity --resource-group myResourceGroup
    

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

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  • コントロール プレーンのカスタム ユーザー割り当てマネージド ID を作成した後、az role assignment create コマンドを使用してマネージド ID のロールの割り当てを追加します。

  • az aks update コマンドを使用して、既存の ID でクラスターを更新します。 assign-identity 引数を含めて、コントロール プレーンのマネージド ID のリソース ID を指定してください。

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> 
    

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

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

事前に作成された kubelet マネージド ID を使用する

kubelet ID を使用すると、クラスターの作成前に、既存の ID にアクセスできます。 この機能により、事前に作成されたマネージド ID を使用した ACR への接続などのシナリオが可能になります。

事前作成された kubelet ID の制限事項

  • ユーザー割り当てのマネージド クラスターでのみ機能します。
  • 21Vianet が運用する Microsoft Azure の中国東部および中国北部のリージョンはサポートされていません。

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

コントロール プレーン マネージド ID

  • コントロール プレーンのマネージド ID がない場合は、az identity create を使用して作成します。

    az identity create --name myIdentity --resource-group myResourceGroup
    

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

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

kubelet マネージド ID

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

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

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

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity", 
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

ユーザー割り当ての kubelet ID を使用してクラスターを作成する

これで、既存の ID で AKS クラスターを作成できるようになりました。 assign-identity 引数を含めて、コントロール プレーンのマネージド ID のリソース ID を指定し、assign-kubelet-identity 引数を使用して、kubelet マネージド ID を指定してください。

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

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

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

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

kubelet ID を使用して既存のクラスターを更新する

警告

kubelet マネージド ID を更新すると、ノード プールがアップグレードされ、AKS クラスターのダウンタイムが発生します。これは、ノード プール内のノードが切断またはドレインされ、再イメージ化されるためです。

Note

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

AKS クラスターの現在のコントロール プレーン マネージド ID を取得する

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

    az aks show -g <RGName> -n <ClusterName> --query "servicePrincipalProfile"
    

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

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

    az aks show -g <RGName> -n <ClusterName> --query "identity"
    

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

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": <identity-resource-id>
          "clientId": "<client-id>",
          "principalId": "<principal-id>"
    },
    

kubelet ID を使用してクラスターを更新する

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

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

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

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity",
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  2. az aks update コマンドを使用して、既存の ID でクラスターを更新します。 assign-identity 引数を含めて、コントロール プレーンのマネージド ID のリソース ID を指定し、assign-kubelet-identity 引数で kubelet マネージド ID を指定してください。

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --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/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

次の手順

  • マネージド ID が有効になっているクラスターを作成するには、Azure Resource Manager テンプレートを使用します。
  • AKS でサポートされているすべての Microsoft Entra 認証方法に対して [kubelogin を使用する][kubelogin-authentication] 方法について説明します。