Azure Kubernetes Service (AKS) Edge Essentials は、コンテナー化されたアプリケーションの大規模な実行を自動化するAzure Kubernetes Service (AKS)のオンプレミス Kubernetes 実装です。 この記事では、次のタスクを実行する方法について説明します。
- Kubernetes サービス アカウントを作成し、Azureマネージド ID にバインドします。
- OIDC 発行者を信頼するために、マネージド ID にフェデレーション資格情報を作成します。
- アプリケーションをデプロイします。
- 例: クラスター内のポッドに、Azure キー コンテナー内のシークレットへのアクセス権を付与します。
ワークロード ID フェデレーションの概念の概要については、「Workload identity federation in Azure Arc enabled Kubernetes (preview)を参照してください。
重要
これらのプレビュー機能は、セルフサービスのオプトインベースで利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Service Edge Essentials プレビューは、ベスト エフォートベースでカスタマー サポートによって部分的にカバーされます。
注記
このパブリック プレビューでは、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 ポータルでは、Kubernetes クラスターの 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 資格情報の詳細については、「
# 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
注記
フェデレーション 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 Key Vault へのアクセス許可をアプリケーションに与える方法」を参照してください。
消去保護と 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)新しいkey vaultでシークレットを作成できるように、RBAC Key Vault シークレットオフィサー ロールを自分に割り当てます。 新しいロールの割り当てが認可サーバーに伝達されて更新されるまで、"最大で 5 分" かかることがあります。
az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipalキー コンテナーにシークレットを作成します。
az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"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キー コンテナー URL の環境変数を作成します。
$KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)サービス アカウントと 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 Identity クライアント ライブラリでワークロード ID を使用するように構成する準備ができました。