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 キー コンテナーへのアクセス許可をアプリケーションに付与する」を参照してください。
消去保護と 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)
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
キー コンテナーにシークレットを作成します。
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 ID クライアント ライブラリでワークロード ID を使用するように構成する準備ができました。