次の方法で共有


AKS Edge Essentials クラスターでワークロード ID を構成する (プレビュー)

Azure Kubernetes Service (AKS) Edge Essentials は、コンテナー化されたアプリケーションの大規模な実行を自動化する Azure Kubernetes Service (AKS) のオンプレミス Kubernetes 実装です。 この記事では、次のタスクを実行する方法について説明します。

  • Kubernetes サービス アカウントを作成し、Azure マネージド ID にバインドします。
  • OIDC 発行者を信頼するために、マネージド ID にフェデレーション資格情報を作成します。
  • アプリケーションをデプロイします。
  • 例: クラスター内のポッドに、Azure キー コンテナー内のシークレットへのアクセス権を付与します。

ワークロード ID フェデレーションの概念の概要については、「 Azure Arc 対応 Kubernetes (プレビュー)での ID フェデレーションの作成」を参照してください。

重要

これらのプレビュー機能は、セルフサービスのオプトインベースで利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Service Edge Essentials プレビューは、ベスト エフォートベースでカスタマー サポートによって部分的にカバーされます。

Note

このパブリック プレビューでは、AKS Edge Essentials を使用すると、Azure IoT Operations クイック スタート スクリプトの初期デプロイ時にワークロード ID を有効にすることができます。 この機能は、他の AKS Edge Essentials シナリオでは使用できません。

前提条件

AKS Edge Essentials クラスターにワークロード ID フェデレーションを使用する前に、「 Create」の説明に従って Azure IoT Operation クイック スタート スクリプトをデプロイし、Azure IoT Operations を実行できる AKS Edge Essentials クラスターを構成する必要があります。 このスクリプトにより、AKS Edge Essentials クラスターでワークロード ID フェデレーション機能が自動的に有効になります。

AKS Edge Essentials クラスターをデプロイした後、次のコマンドを使用して、ワークロード ID 拡張機能の状態を確認できます。

az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded" 
"agentPublicKeyCertificate": "", 
  "agentVersion": "1.21.10", 
  "arcAgentProfile": { 
    "agentAutoUpgrade": "Enabled", 
    "agentErrors": [], 
    "agentState": "Succeeded", 
    "desiredAgentVersion": "", 
    "systemComponents": null 

# oidcIssuerProfile "enabled": true and "issuerUrl" present 
"oidcIssuerProfile": { 
    "enabled": true, 
    "issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/", 

# workloadIdentity "enabled": true 
"securityProfile": { 
    "workloadIdentity": { 
      "enabled": true

Azure portal では、Kubernetes クラスターの Properties セクションでwiextension拡張機能を表示できます。

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

必要な ID を構成する手順を簡略化するために、次の手順では、この記事の例で参照されている環境変数を定義します。 ここで示される値は、ご利用の環境の値に置き換えてください。

$AZSubscriptionID = "00000000-0000-0000-0000-000000000000" 
$Location = "westeurope" 
$resource_group_name = "myResourceGroup" 

$aks_cluster_name = "myAKSCluster" 

$SERVICE_ACCOUNT_NAMESPACE = "default" 
$SERVICE_ACCOUNT_NAME = "workload-identity-sa" 

$FedIdCredentialName = "myFedIdentity" 
$MSIName = "myIdentity" 

# Include these variables to access key vault secrets from a pod in the cluster. 
$KVName = "KV-workload-id" 
$KVSecretName= "KV-secret"

OIDC 発行者 URL を環境変数に保存する

OIDC 発行者 URL を取得して環境変数に保存するには、次のコマンドを実行します。

$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)

手順 1: Kubernetes サービス アカウントを作成し、Azure マネージド ID にバインドする

まず、 az id create コマンドを呼び出して、マネージド ID を作成します。

az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID

次に、マネージド ID のクライアント ID の変数を作成します。

$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)  
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)

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

Kubernetes サービス アカウントを作成し、前の手順で作成したマネージド ID のクライアント ID で注釈を付けます。 次の Azure CLI コマンドをコピーして貼り付けます。

$yaml = @" 
apiVersion: v1 
kind: ServiceAccount 
metadata: 
  annotations: 
    azure.workload.identity/client-id: $MSIId 
  name: $SERVICE_ACCOUNT_NAME 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$MSIId', $MSIId ` 
              -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
              -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE 

# Apply the YAML content to Kubernetes 
$yaml | kubectl apply -f -

次の出力は、正常に作成されたワークロード ID を示しています。

serviceaccount/workload-identity-sa created

手順 2: OIDC 発行者を信頼するためのフェデレーション資格情報をマネージド ID に作成する

マネージド ID、サービス アカウント発行者、サブジェクトの間にフェデレーション ID 資格情報を作成するには、 az id federated-credential create コマンドを呼び出します。 Microsoft Entra のフェデレーション ID 資格情報の詳細については、Microsoft Entra ID でのフェデレーション ID 資格情報の概要に関する記事を参照してください。

# Create a federated credential 
az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" 

# Show the federated credential 
az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName

Note

フェデレーション ID 資格情報を追加した後、反映されるまでに数秒かかります。 その直後に行われたトークン要求は、キャッシュが更新されるまで失敗する可能性があります。 この問題を回避するには、フェデレーション ID 資格情報の作成後に少しの遅延を追加することを検討してください。

手順 3: アプリケーションをデプロイする

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

$image = "<image>"  # Replace <image> with the actual image name 
$containerName = "<containerName>"  # Replace <containerName> with the actual container name 

$yaml = @" 
apiVersion: v1 
kind: Pod 
metadata: 
  name: sample-quick-start 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
  labels: 
    azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity. 
spec: 
  serviceAccountName: $SERVICE_ACCOUNT_NAME 
  containers: 
    - image: $image 
      name: $containerName 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME 

# Apply the YAML configuration 
$yaml | kubectl apply -f - 

重要

ワークロード ID を使用するアプリケーション ポッドに、ポッド 仕様にラベル azure.workload.identity/use: "true" が含まれるようにします。それ以外の場合、ポッドは再起動後に失敗します。

例: Azure Key Vault にアクセスするためのアクセス許可を付与する

この手順の手順では、ポッドから Azure キー コンテナー内のシークレット、キー、または証明書にアクセスする方法について説明します。 このセクションの例では、ワークロード ID のキー コンテナー内のシークレットへのアクセスを構成しますが、同様の手順を実行してキーまたは証明書へのアクセスを構成できます。

次の例は、Azure ロールベースのアクセス制御 (Azure RBAC) アクセス許可モデルを使用して、ポッドにキー コンテナーへのアクセスを許可する方法を示しています。 Azure Key Vault の Azure RBAC アクセス許可モデルの詳細については、「Azure RBAC を使用して Azure キー コンテナーへのアクセス許可をアプリケーションに付与する」を参照してください。

  1. 消去保護と RBAC 承認が有効になっているキー コンテナーを作成します。 既存のキー コンテナーが消去保護と RBAC 承認の両方に対して構成されている場合は、それを使用することもできます。

    az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization
    
    # retrieve the key vault ID for role assignment
    $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
    
  2. RBAC Key Vault Secrets Officer ロールを自分に割り当てて、新しいキー コンテナーにシークレットを作成できるようにします。 新しいロールの割り当てが認可サーバーに伝達されて更新されるまで、"最大で 5 分" かかることがあります。

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. キー コンテナーにシークレットを作成します。

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. Key Vault Secrets User ロールを、前に作成したユーザー割り当てマネージド ID に割り当てます。 この手順では、キー コンテナーからシークレットを読み取るアクセス許可をマネージド ID に付与します。

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. キー コンテナー URL の環境変数を作成します。

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. サービス アカウントと Key Vault URL を参照するポッドをデプロイします。

    $yaml = @" 
    apiVersion: v1 
    kind: Pod
    metadata:
      name: sample-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: $KVUrl 
          - name: SECRET_NAME 
            value: $KVSecretName 
      nodeSelector:
        kubernetes.io/os: linux
    "@
    
    # Replace variables within the YAML content 
    $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                    -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
                    -replace '\$KVUrl', $KVUrl ` 
                    -replace '\$KVSecretName', $KVSecretName 
    
    # Apply the YAML configuration
    $yaml | kubectl --kubeconfig $aks_cluster_name apply -f -
    

次のステップ

この記事では、アプリケーション ワークロードがその資格情報で認証される準備としてワークロード ID を使用するように構成しました。 これで、アプリケーションをデプロイし、最新バージョンの Azure ID クライアント ライブラリでワークロード ID を使用するように構成する準備ができました。