Azure Kubernetes Service (AKS) でサービス プリンシパルを使用する

AKS クラスターでは、Azure Load Balancer や Azure Container Registry (ACR) などの他の Azure リソースを動的に作成および管理するために、Microsoft Entra サービス プリンシパルまたはマネージド ID のいずれかが必要です。

Note

Microsoft では Azure の他のリソースで認証を行うためにマネージド ID を使用することをお勧めします。これは、AKS クラスターの既定の認証方法です。 クラスターでのマネージド ID の使用の詳細については、「システム割り当てマネージド ID を使用する」を参照してください。

この記事では、AKS クラスター用のサービス プリンシパルを作成して使用する方法を示します。

開始する前に

Microsoft Entra サービス プリンシパルを作成するには、アプリケーションを Microsoft Entra テナントに登録し、サブスクリプション内のロールにアプリケーションを割り当てるためのアクセス許可が必要です。 必要なアクセス許可がない場合は、必要なアクセス許可を割り当てるように、AKS クラスターで使用するサービス プリンシパルを事前に作成するように、Microsoft Entra ID またはサブスクリプションの管理者に依頼する必要があります。

別の Microsoft Entra テナントのサービス プリンシパルを使用している場合は、クラスターのデプロイ時に使用できるアクセス許可について他の考慮事項があります。 ディレクトリ情報の読み取りと書き込みを行うために適切なアクセス許可がない可能性があります。 詳細については、「Microsoft Entra ID の既定のユーザー アクセス許可とは」を参照してください。

前提条件

  • Azure CLI を使用している場合、Azure CLI バージョン 2.0.59 以降が必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
  • Azure PowerShell を使用している場合は、Azure PowerShell バージョン 5.0.0 以降が必要です。 バージョンを確認するには、Get-InstalledModule -Name Az を実行します。 インストールまたはアップグレードする必要がある場合は、「Azure Az PowerShell モジュールをインストールする」を参照してください。

手動でサービス プリンシパルを作成する

  1. az ad sp create-for-rbac コマンドを使用してサービス プリンシパルを作成します。

    az ad sp create-for-rbac --name myAKSClusterServicePrincipal
    

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

    {
      "appId": "559513bd-0c19-4c1a-87cd-851a26afd5fc",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "e763725a-5eee-40e8-a466-dc88d980f415",
      "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
    }
    
  2. appIdpassword の値を出力からコピーします。 次のセクションで AKS クラスターを作成するときにこれらを使用します。

AKS クラスター用のサービス プリンシパルを指定する

  • az aks create コマンドを使用して新しい AKS クラスターの既存のサービス プリンシパルを使用し、--service-principal パラメーターと --client-secret パラメーターを使用して、前のセクションで受け取った出力の appIdpassword を指定します。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --service-principal <appId> \
        --client-secret <password>
    

    Note

    カスタマイズされたシークレットがある既存のサービス プリンシパルを使用する場合は、そのシークレットの長さが 190 バイトを超えていないことを確認してください。

他の Azure リソースへのアクセスを委任する

AKS クラスターのサービス プリンシパルを使用して他のリソースにアクセスできます。 たとえば、AKS クラスタを既存の Azure 仮想ネットワーク サブネットに展開したり、Azure Container Registry (ACR) に接続したりする場合、それらのリソースへのアクセスをサービス プリンシパルに委任する必要があります。 システム割り当てマネージド ID を使用しているクラスターに付与されたアクセス許可の入力には、最大で 60 分かかる場合があります。

  • az role assignment create コマンドを使用してロールの割り当てを作成します。 リソース グループ、仮想ネットワーク リソースなど、特定のスコープに appId を割り当てます。 ロールにより、サービス プリンシパルがリソースに対して持つアクセス許可が定義されます。

    Note

    リソースの --scope には、/subscriptions/<guid>/resourceGroups/myResourceGroup/subscriptions/<guid>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet など、完全なリソース ID を指定する必要があります。

    az role assignment create --assignee <appId> --scope <resourceScope> --role Contributor
    

以降の各セクションでは、割り当てる必要が生じることがある一般的な委任について詳しく取り上げます。

Azure Container Registry

Azure Container Registry (ACR) をコンテナーのイメージ ストアとして使用する場合、AKS クラスターがイメージを読み取ってプルするためのアクセス許可を、サービス プリンシパルに与える必要があります。 az aks create または az aks update コマンドを使用してレジストリと統合し、サービス プリンシパルに適切なロールを割り当てることをお勧めします。 詳細な手順については、「Azure Kubernetes Service から Azure Container Registry の認証を受ける」を参照してください。

ネットワーク

仮想ネットワークとサブネットまたはパブリック IP アドレスが別のリソース グループに存在する高度なネットワークを使用することも考えられます。 仮想ネットワーク内のサブネットにネットワーク共同作成者の組み込みロールを割り当てます。 または、そのリソース グループ内のネットワーク リソースにアクセスするためのアクセス許可を持つカスタム ロールを作成することもできます。 詳細については、「AKS サービスの権限」を参照してください。

ストレージ

別のリソース グループ内の既存のディスク リソースにアクセスする必要がある場合は、次のいずれかのロール アクセス許可のセットを割り当てます。

  • カスタム ロールを作成し、Microsoft.Compute/disks/read および Microsoft.Compute/disks/write ロールのアクセス許可を定義します。または
  • リソース グループに仮想マシン共同作成者の組み込みロールを割り当てます。

Azure Container Instances

Virtual Kubelet を使用して AKS と統合し、AKS クラスターとは別のリソース グループで Azure Container Instances (ACI) を実行する場合は、AKS クラスター サービス プリンシパルに ACI リソース グループに対する "共同作成者" 権限を与える必要があります。

その他の考慮事項

AKS と Microsoft Entra サービス プリンシパルを使用する場合は、次の点を考慮してください。

  • Kubernetes のサービス プリンシパルはクラスター構成の一部ですが、この ID を使用してクラスターをデプロイしないでください。
  • 既定では、このサービス プリンシパル資格情報は 1 年間有効です。 サービス プリンシパルの資格情報はいつでも更新または回転できます。
  • すべてのサービス プリンシパルは、Microsoft Entra アプリケーションに関連付けられています。 Kubernetes クラスターのサービス プリンシパルは、有効な任意の Microsoft Entra アプリケーション名 (たとえば https://www.contoso.org/example) に関連付けることができます。 アプリケーションの URL は、実際のエンドポイントである必要はありません。
  • サービス プリンシパルのクライアント ID を指定するときには、appId の値を使用します。
  • Kubernetes クラスター内のエージェント ノード VM では、サービス プリンシパルの資格情報が /etc/kubernetes/azure.json ファイルに格納されます。
  • az aks create コマンドを使用して作成された AKS クラスターを削除しても、作成されたサービス プリンシパルが自動的に削除されることはありません。
    • サービス プリンシパルを削除するには、クラスターの servicePrincipalProfile.ClientId のクエリを実行し、az ad sp delete コマンドを使用して削除します。 -g パラメーターの値をリソース グループ名に、-n パラメーターの値をクラスター名に置き換えます。

      az ad sp delete --id $(az aks show -g myResourceGroup -n myAKSCluster --query servicePrincipalProfile.clientId -o tsv)
      

トラブルシューティング

Azure CLI は、AKS クラスターのサービス プリンシパル資格情報をキャッシュします。 これらの資格情報の有効期限が切れると、AKS クラスターのデプロイ中にエラーが発生します。 az aks create コマンドを実行し、次のようなエラー メッセージが表示された場合は、キャッシュされたサービス プリンシパルの資格情報に問題があることを示している可能性があります。

Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
(Details: adal: Refresh request failed. Status Code = '401'.

"[].endDateTime" クエリで az ad app credential list コマンドを使用して、サービス プリンシパルの資格情報の有効期限を確認できます。

az ad app credential list --id <app-id> --query "[].endDateTime" -o tsv

サービス プリンシパルの資格情報の既定の有効期限は 1 年です。 資格情報が 1 年以上前のものである場合は、既存の資格情報をリセットするか、新しいサービス プリンシパルを作成できます。

一般的な Azure CLI のトラブルシューティング

Azure CLI は、いくつかのシェル環境で実行できますが、形式には若干の差異があります。 Azure CLI コマンドで予期しない結果が発生した場合は、「Azure CLI を正しく使用する方法」を参照してください。

次のステップ

Microsoft Entra サービス プリンシパルの詳細については、「アプリケーション オブジェクトとサービス プリンシパル オブジェクト」を参照してください。

資格情報の更新方法について詳しくは、「AKS でのサービス プリンシパルの資格情報の更新または回転」を参照してください。