Azure Kubernetes Service (AKS) でシステム割り当てマネージド ID を使用する

この記事では、新規または既存の AKS クラスターでシステム割り当てマネージド ID を有効にし、システム割り当てマネージド ID のプリンシパル ID を取得し、システム割り当てマネージド ID のロール割り当てを追加する方法について説明します。

前提条件

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

  • az account set コマンドを使用して、サブスクリプションを現在アクティブなサブスクリプションとして設定します。

    az account set --subscription <subscription-id>
    
  • 既存の Azure リソース グループ。 お持ちでない場合は、 az group create コマンドを使用して作成できます。

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI バージョン 2.23.0 以降がインストールされています。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。
  • システム割り当てマネージド ID を使用するように既存のクラスターを更新するには、Azure CLI バージョン 2.49.0 以降がインストールされている必要があります。
  • Terraform がローカルにインストールされている。 インストール手順については、「 Terraform のインストール」を参照してください。

制限事項

  • マネージド ID を使用してクラスターを作成した後は、サービス プリンシパルの使用に戻すことはできません。
  • マネージド ID が有効になっているクラスターの別のテナントへの移動または移行はサポートされていません。
  • クラスターで Microsoft Entra ポッドマネージド ID (aad-pod-identity) が有効化されている場合、ノード管理ID (NMI) ポッドはノードの iptables を変更して、Azure インスタンス メタデータサービス (IMDS) エンドポイントへの呼び出しをインターセプトします。 この構成は、特定のポッドが aad-pod-identity を使用しない場合でも、IMDS エンドポイントに対して行われた要求はすべて NMI によってインターセプトされることを意味します。
    • AzurePodIdentityException カスタム リソース定義 (CRD) を構成して、CRD で定義されたポッド照合ラベルから送信された IMDS エンドポイントへの要求を、NMI で処理せずにプロキシ処理するように指定できます。 AzurePodIdentityException CRD を構成して、kubernetes.azure.com/managedby: akskube-system 名前空間にある aad-pod-identity ラベルを持つシステム ポッドを除外します。 詳細については、「 Azure Kubernetes Service (AKS) での Microsoft Entra ポッドマネージド ID の使用」を参照してください。
    • 例外を構成するには、mic-exception YAML をインストールします。
  • AKS では、カスタム プライベート DNS ゾーンを使用する場合、システム割り当てマネージド ID の使用はサポートされていません。

クラスターの更新に関する考慮事項

クラスターを更新するときは、次の情報を考慮してください。

  • 更新プログラムは、使用する VHD 更新プログラムがある場合にのみ機能します。 最新の VHD を実行している場合は、更新を実行するために、次の VHD が使用可能になるまで待つ必要があります。
  • Azure CLI を使用すると、移行後にアドオンのアクセス許可が正しく設定されます。 移行操作を実行するために Azure CLI を使用していない場合は、アドオン ID のアクセス許可を自分で処理する必要があります。 Azure Resource Manager (ARM) テンプレートの使用例については、「ASsign Azure roles using ARM templatesを参照してください。
  • クラスターで --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 が既定で有効になります。

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

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

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

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 がマネージド ID の使用をすぐに開始できるように、クラスター内のすべてのノードが再イメージ化されます。 この再イメージ化操作により、ノード プール内のノードが切断、ドレイン、再イメージ化されるため、AKS クラスターのダウンタイムが発生します。 ノードの再イメージ化を必要とする操作が Azure Kubernetes Service (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 にロールを追加する

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

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

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

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

Terraform 構成ファイルを作成する

Terraform 構成ファイルは、Terraform が作成および管理するインフラストラクチャを定義します。

  1. main.tfという名前のファイルを作成し、次のコードを追加して Terraform バージョンを定義し、Azure プロバイダーを指定します。

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. main.tfに次のコードを追加して、Azure リソース グループを作成します。 必要に応じて、リソース グループの名前と場所を自由に変更してください。

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

Terraform を使用してシステム割り当てマネージド ID を持つ AKS クラスターを作成する

次のコードを main.tf に追加して、システム割り当てマネージド ID を持つ AKS クラスターを作成します。

resource "azurerm_kubernetes_cluster" "system_assigned" {
 name                = "aks-system"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "akssystem"
 identity {
   type = "SystemAssigned"
 }
 default_node_pool {
   name       = "system"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
}

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

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

resource "azurerm_role_assignment" "system_assigned_network_contributor" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "Network Contributor"
 principal_id         = azurerm_kubernetes_cluster.system_assigned.identity[0].principal_id
}

Terraform を初期化する

main.tf コマンドを使用して、terraform init ファイルを含むディレクトリで Terraform を初期化します。 このコマンドは、Terraform を使用して Azure リソースを管理するために必要な Azure プロバイダーをダウンロードします。

terraform init

Terraform実行計画を作成する

terraform plan コマンドを使用して Terraform 実行プランを作成します。 このコマンドは、Terraform が Azure サブスクリプションで作成または変更するリソースを示します。

terraform plan

Terraform 構成を適用する

実行プランを確認して確認した後、 terraform apply コマンドを使用して Terraform 構成を適用します。 このコマンドは、Azure サブスクリプションの main.tf ファイルで定義されているリソースを作成または変更します。

terraform apply

Terraform デプロイを確認する

Terraform 構成を適用した後、 az aks show コマンドと --query パラメーターを使用してデプロイを確認し、出力をフィルター処理し、ID 情報を表示できます。 例えば次が挙げられます。

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

AKS のマネージド ID の詳細については、次の記事を参照してください。