この記事では、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 バージョンの最小要件
- Azure CLI バージョン 2.23.0 以降がインストールされていることを確認します。 バージョンを確認するには、
az --versionを実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。 - 事前に作成された kubelet マネージド ID を使用するには、Azure CLI バージョン 2.26.0 以降がインストールされている必要があります。
- システム割り当てマネージド ID またはユーザー割り当てマネージド ID を使用するように既存のクラスターを更新するには、Azure CLI バージョン 2.49.0 以降がインストールされている必要があります。
制限事項
マネージド 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: aksの kube-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-keyskubelet マネージド 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 クラスターのノード プールがアップグレードされます。これを実行する前に、ワークロードの中断を回避したり、メンテナンス期間中にこれを実行したりするために、ポッド中断予算などの適切な可用性構成が構成されていることを確認します。
az aks showコマンドを使用して、AKS クラスターでユーザー割り当てマネージド ID が使用されていることを確認します。az aks show \ --resource-group <resource-group-name> \ --name <aks-cluster-name> \ --query "servicePrincipalProfile"クラスターがマネージド ID を使用している場合、出力には
clientIdが msi の値で表示されます。 サービス プリンシパルを使用するクラスターに、オブジェクト ID が表示されます。 次に例を示します。# The cluster is using a managed identity. { "clientId": "msi" }クラスターでマネージド 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>" },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"
次のステップ
- マネージド ID が有効になっているクラスターを作成するには、Azure Resource Manager テンプレートを使用します。
- AKS でサポートされているすべての Microsoft Entra 認証方法に kubelogin を使用する方法について説明します。
Azure Kubernetes Service