Azure Kubernetes Service (AKS) クラスターでワークロード ID をデプロイして構成する

Azure Kubernetes Service (AKS) は、クラスターをすばやくデプロイおよび管理することができる、マネージド Kubernetes サービスです。 この記事では、次のことについて説明します。

  • OpenID Connect 発行者と Microsoft Entra ワークロード ID を含む Azure CLI を使用して AKS クラスターをデプロイする
  • Azure Key Vault にアクセス権を付与する
  • Microsoft Entra ワークロード ID と Kubernetes サービス アカウントを作成する
  • トークンのフェデレーション用にマネージド ID を構成する。

この記事では、Kubernetes の基本的な概念を理解していることを前提としています。 詳細については、「Azure Kubernetes Services (AKS) における Kubernetes の中心概念」を参照してください。 Microsoft Entra ワークロード ID に慣れていない場合は、次の「概要」の記事を参照してください。

  • この記事では、Azure CLI のバージョン 2.47.0 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

  • クラスターの作成に使用している ID には、適切な最小限のアクセス許可が与えられています。 AKS のアクセスと ID の情報については、「Azure Kubernetes Service (AKS) でのアクセスと ID オプション」を参照してください。

  • 複数の Azure サブスクリプションをお持ちの場合は、az account コマンドを使用して、リソースを課金する適切なサブスクリプション ID を選択してください。

Note

すべての手順を手動で構成する代わりに、Service Connector と呼ばれる別の実装があり、いくつかの手順を自動的に構成して同じ結果を実現できます。 「チュートリアル: ワークロード ID を使用して Service Connector で Azure Kubernetes Service (AKS) の Azure ストレージ アカウントに接続する」も参照してください。

環境変数をエクスポートする

必要な ID を構成するステップを簡略化するために、下のステップでは、クラスターで参照する環境変数を定義します。

以下のコマンドを実行してこれらの変数を作成します。 RESOURCE_GROUPLOCATIONSERVICE_ACCOUNT_NAMESUBSCRIPTIONUSER_ASSIGNED_IDENTITY_NAMEFEDERATED_IDENTITY_CREDENTIAL_NAME の既定値を置き換えます。

export RESOURCE_GROUP="myResourceGroup"
export LOCATION="westcentralus"
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"

AKS クラスターの作成

OIDC 発行者 を使うには、az aks create コマンドと --enable-oidc-issuer パラメーターを使って、AKS クラスターを作成します。 次の例では、myResourceGroup 内の 1 つのノードで myAKSCluster という名前のクラスターを作成します。

az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

Note

AKS クラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。

既存の AKS クラスターを更新する

OIDC Issuer を使用し、ワークロード ID を有効にするには、az aks update コマンドを --enable-oidc-issuer および --enable-workload-identity パラメーターと一緒に使って、AKS クラスターを更新します。 次の例では、myAKSCluster という名前のクラスターを更新します。

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

OIDC 発行者 URL を取得する

OIDC 発行者 URL を取得し、環境変数に保存するには、次のコマンドを実行します。 引数 -n の既定値 (クラスターの名前) を置き換えます。

export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"

変数には、次の例のような発行者 URL が含まれている必要があります。

https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/

既定では、発行者はベース URL の https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid} を使用するように設定されています。ここで {region} の値は、AKS クラスターがデプロイされている場所と一致します。 値 {uuid} は OIDC キーを表します。

マネージド ID の作成

Azure CLI [az アカウントセット] コマンドを使用して、特定のサブスクリプションを現在のアクティブなサブスクリプションに設定します。 次に、[az identity 作成] コマンドを使用してマネージド ID を作成します。

az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"

次に、マネージド ID の変数を作成してみましょう。

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"

Kubernetes サービス アカウントを作成する

Kubernetes サービス アカウントを作成し、前の手順で作成したマネージド ID のクライアント ID で注釈を付けます。 az aks バージョン変更資格情報 コマンドを使用してクラスター名とリソース グループ名の既定値を置き換えます。

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

次の複数行入力をコピーして Azure CLI に貼り付けます。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}"
  name: "${SERVICE_ACCOUNT_NAME}"
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
EOF

IDが正常に作成された場合の出力の例は、次のようになります:

serviceaccount/workload-identity-sa created

フェデレーション ID 資格情報を確立する

az ID federated-credential作成 コマンドを使用して、マネージド ID、サービス アカウント発行者、サブジェクトの間にフェデレーション ID 資格情報を作成します。

az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --issuer "${AKS_OIDC_ISSUER}" --subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" --audience api://AzureADTokenExchange

Note

フェデレーション ID 資格情報が最初に追加された後に反映されるまでに数秒かかります。 フェデレーション ID 資格情報を追加した直後にトークン要求が行われると、古いデータがあるディレクトリにキャッシュが設定されるため、数分失敗する可能性があります。 このイシューを回避するには、フェデレーション ID 資格情報を追加した後に若干の遅延を追加できます。

アプリケーションをデプロイする

アプリケーション ポッドをデプロイする場合、マニフェストは、「Kubernetes サービス アカウントの作成」の手順で作成されたサービス アカウントを参照する必要があります。 次のマニフェストは、アカウント、具体的には metadata\namespace プロパティと spec\serviceAccountName プロパティを参照する方法を示しています。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

重要

ワークロードIDを使用しているアプリケーションポッドがポッド仕様に次のラベル azure.workload.identity/use: "true" を追加していることを確認します。追加していない場合、ポッドは再起動後に失敗します。

省略可能 - Azure Key Vault にアクセスするための権限を付与する

この手順は、ポッドから Azure Key Vault にマウントされているシークレット、キー、証明書にアクセスする必要がある場合に必要です。 マネージド ID を使用してアクセスを構成するには、次の手順を実行します。 これらの手順では、サブスクリプションで Azure Key Vault が既に作成および構成されていることを前提としています。 お持ちでない場合は、Azure CLI を使用した Azure Key Vault の作成に関する記事を参照してください。

続行する前に、次の情報が必要です。

  • Key Vault の名前
  • Key Vault を保持しているリソース グループ

この情報は、Azure CLI コマンド az keyvault list を使用して取得できます。

  1. 次のコマンドを実行して、マネージド ID で Key Vault 内のシークレットにアクセスするためのアクセス ポリシーを設定します。

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. Key Vault でシークレットを作成します。

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. Key Vault URL をエクスポートします。

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. 上記のサービス アカウントと Key Vault URL を参照するポッドをデプロイします。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: quick-start
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
      labels:
        azure.workload.identity/use: "true"
    spec:
      serviceAccountName: ${SERVICE_ACCOUNT_NAME}
      containers:
        - image: ghcr.io/azure/azure-workload-identity/msal-go
          name: oidc
          env:
          - name: KEYVAULT_URL
            value: ${KEYVAULT_URL}
          - name: SECRET_NAME
            value: ${KEYVAULT_SECRET_NAME}
      nodeSelector:
        kubernetes.io/os: linux
    EOF
    

すべてのプロパティが webhook によって正しく挿入されているかどうかを確認するには、 kubectl describe コマンドを使用します:

kubectl describe pod quick-start | grep "SECRET_NAME:"

成功すると、出力は次のようになります。

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

ポッドがトークンを取得し、リソースにアクセスできることを確認するには、kubectl ログ コマンドを使用します。

kubectl logs quick-start

成功すると、出力は次のようになります。

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

ワークロード ID を無効にする

AKS クラスターで有効にされ、構成されている Microsoft Entra ワークロード ID を無効にするには、次のコマンドを実行します:

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

次のステップ

この記事では、Kubernetes クラスターをデプロイし、アプリケーション ワークロードでその資格情報による認証を行うための準備としてワークロード ID を使用するように構成しました。 これで、アプリケーションをデプロイし、最新バージョンの Azure ID クライアント ライブラリでワークロード ID を使用するように構成する準備ができました。 最新のクライアント ライブラリ バージョンを使用するようにアプリケーションを書き換えることができない場合は、ワークロード ID を短期的な移行ソリューションとして使ってマネージド ID を使用して認証するように、アプリケーション ポッドを設定できます。