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 サービスに対してそれ自体を認証できるようにするために推奨される方法です。
開始する前に
Azure CLI バージョン 2.23.0 以降がインストールされていることを確認します。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。事前に作成された kubelet マネージド ID を使用するには、Azure CLI バージョン 2.26.0 以降がインストールされている必要があります。
既存のクラスターでマネージド ID を更新するには、Azure CLI バージョン 2.49.0 以降がインストールされている必要があります。
制限事項
- マネージド 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
で除外してください。- 詳細については、特定のポッドまたはアプリケーションの Microsoft Entra ID ポッド ID を無効にする方法に関する記事を参照してください。
- 例外を構成するには、mic-exception YAML をインストールします。
- 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 に切り替わります。 このプロセスには数時間かかる場合があります。
az group create
コマンドを使用して、Azure リソース グループを作成します。az group create --name myResourceGroup --location westus2
az aks create
コマンドを使用して、AKS クラスターを作成します。az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity
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 を取得する
az aks show
コマンドを使用して、AKS クラスターでユーザー割り当てマネージド ID が使用されていることを確認します。az aks show -g <RGName> -n <ClusterName> --query "servicePrincipalProfile"
クラスターがマネージド ID を使用している場合、出力には
clientId
が msi の値で表示されます。 サービス プリンシパルを使用するクラスターに、オブジェクト ID が表示されます。 次に例を示します。{ "clientId": "msi" }
クラスターでマネージド 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 を使用してクラスターを更新する
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" }
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] 方法について説明します。