在 Azure Arc 叢集所啟用的 AKS 上部署和設定工作負載身分識別 (預覽)
適用於:Azure 本機版本 23H2
工作負載身分識別同盟可讓您在 Microsoft Entra 標識符中設定使用者指派的受控識別或應用程式註冊,以信任來自外部識別提供者 (IdP) 的令牌,例如 Kubernetes,讓您能夠存取由 Microsoft Entra 保護的資源,例如 Azure 金鑰保存庫 或 Azure Blob 記憶體。
Azure Arc 所啟用的 Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您輕鬆地部署已啟用工作負載識別的 Kubernetes 叢集。 本文說明如何執行下列工作:
- 建立已啟用工作負載身分識別的 AKS Arc 叢集(預覽)。
- 建立 Kubernetes 服務帳戶,並將其系結至 Azure 受控識別。
- 在受控識別上建立同盟認證,以信任 OIDC 簽發者。
- 部署您的應用程式。
- 範例:將叢集中的Pod存取權授與 Azure 金鑰保存庫中的秘密。
如需 Azure Arc 啟用的 Kubernetes(預覽)中工作負載身分識別同盟的概念概觀,請參閱 工作負載身分識別同盟。
重要
這些預覽功能會以自助式、選擇方式提供。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 Azure Arc 預覽所啟用的 Azure Kubernetes Service 會盡最大努力由客戶支援部分涵蓋。
注意
在公開預覽中,Azure 本地版 23H2 的 AKS 支援在 AKS 叢集建立期間啟用負載識別。 不過,目前不支援在叢集建立或停用叢集之後啟用工作負載身分識別。
必要條件
在部署已啟用 Azure Arc 的 Kubernetes 叢集之前,您必須具備下列必要條件:
- 如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶。
- 本文需要 1.4.23 版或更新版本的 Azure CLI。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
匯出環境變數
為了協助簡化設定所需身分識別的步驟,下列命令會定義本文範例中所參考的環境變數。 將下列值取代為您自己的值:
$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"
# To access key vault secrets from a pod in the cluster, include these variables:
$KVName = "KV-workload-id"
$KVSecretName= "KV-secret"
設定有效的訂用帳戶
首先,將您的訂用帳戶設定為目前的使用中訂用帳戶。 使用您的訂用帳戶識別碼執行 az account set 命令:
az login
az account set -s $AZSubscriptionID
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 建立資源群組時,系統會提示您指定位置。 此位置是資源群組中繼資料的儲存位置,如果未在資源建立期間指定另一個區域,此位置也會是您在 Azure 中執行資源的位置。
執行 az group create 命令以建立資源群組:
az group create --name $resource_group_name --location $Location
下列範例輸出顯示成功建立資源群組:
{
"id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
"location": "westeurope",
"managedBy": null,
"name": "$resource_group_name",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
步驟 1:建立已啟用工作負載身分識別的 AKS Arc 叢集
若要建立 AKS Arc 叢集,您需要 $customlocation_ID
和 $logicnet_Id
值。
-
$customlocation_ID
:自定義位置的 Azure Resource Manager 識別符。 自訂位置是在 Azure Local 版本號 23H2 叢集部署期間設定的。 基礎結構管理員應該提供自定義位置的 Resource Manager 識別符。 如果基礎結構管理員提供自定義位置名稱和資源組名,您也可以使用$customlocation_ID = $(az customlocation show --name "<your-custom-location-name>" --resource-group $resource_group_name --query "id" -o tsv)
取得 Resource Manager 識別符。 -
$logicnet_Id
:遵循下列步驟所建立之 Azure 本機邏輯網路的 Azure Resource Manager 標識符。 基礎結構管理員應該提供邏輯網路的 Resource Manager 識別符。 如果基礎結構管理員提供邏輯網路名稱和資源組名,您也可以使用$logicnet_Id = $(az stack-hci-vm network lnet show --name "<your-lnet-name>" --resource-group $resource_group_name --query "id" -o tsv)
取得 Resource Manager 識別符。
使用 參數執行 --enable-oidc-issuer --enable-workload-identity
命令。 提供您的 entra-admin-group-object-ids ,並確定您是 proxy 模式存取Microsoft Entra ID 管理員群組的成員:
az aksarc create
-n $aks_cluster_name -g $resource_group_name
--custom-location $customlocation_ID --vnet-ids $logicnet_Id
--aad-admin-group-object-ids <entra-admin-group-object-ids>
--generate-ssh-keys
--enable-oidc-issuer --enable-workload-identity
幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。
成功建立布建叢集之後,可能需要一些時間才能部署工作負載身分識別延伸模組。 使用下列命令來檢查工作負載身分識別擴充功能狀態:
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/"}
在 Azure 入口網站 中,您可以在 Kubernetes 叢集的 [屬性] 區段下檢視 wiextension 延伸模組。
重要
作為 AKS Arc 叢集安全性增強功能的一部分,工作負載身分識別啟用會觸發兩項變更。 首先,Kubernetes 服務帳戶簽署密鑰會每隔 45 天自動輪替一次,且有效期為 90 天。 其次, --service-account-extend-token-expiration
旗標已停用,將令牌有效性從一年減少到最多 24 小時。
將 OIDC 簽發者 URL 儲存至環境變數
成功建立 AKS 叢集之後,您可以取得 OIDC 簽發者 URL,並將其儲存至環境變數。 執行以下命令:
$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)
步驟 2:建立 Kubernetes 服務帳戶,並將其系結至 Azure 受控識別
首先,建立受控識別。 執行 az identity create 命令:
az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID
接下來,為受控識別的用戶端標識碼建立變數:
$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 服務帳戶,並使用在上一個步驟中建立的受控識別用戶端標識符來標註它:
az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name
開啟新的視窗。 複製並貼上下列 CLI 命令:
$yaml = @" apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MSIId name: $SERVICE_ACCOUNT_NAME namespace: $SERVICE_ACCOUNT_NAMESPACE "@ $yaml = $yaml -replace '\$MSIId', $MSIId ` -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE $yaml | kubectl apply -f -
下列輸出顯示成功建立服務帳戶:
serviceaccount/workload-identity-sa created
步驟 3:在受控識別上建立同盟認證,以信任 OIDC 簽發者
首先,建立同盟身分識別認證。 呼叫 az identity federated-credential create 命令,在受控識別、服務帳戶簽發者與主體之間建立同盟身分識別認證。 如需 Microsoft Entra 中同盟身分識別認證的詳細資訊,請參閱 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
注意
新增同盟身分識別認證之後,需要幾秒鐘的時間才能傳播。 在快取重新整理之前,立即提出的令牌要求可能會失敗。 若要避免此問題,請考慮在建立同盟身分識別認證之後新增短暫的延遲。
步驟 4:部署您的應用程式
當您部署應用程式 Pod 時,資訊清單應該參考建立 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 -
重要
請確定使用工作負載身分識別的應用程式Pod包含Pod規格中的標籤 azure.workload.identity/use: "true"
。否則Pod會在重新啟動後失敗。
範例:授與存取 Azure 金鑰保存庫 的許可權
此步驟中的指示說明如何從 Pod 存取 Azure 金鑰保存庫中的秘密、金鑰或憑證。 本節中的範例會設定工作負載身分識別金鑰保存庫中秘密的存取權,但您可以執行類似的步驟來設定金鑰或憑證的存取權。
下列範例會示範如何使用 Azure 角色型存取控制 (Azure RBAC) 權限模型,向 Pod 授與金鑰保存庫的存取權。 如需 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 金鑰保存庫 Secrets Officer 角色指派給自己,以便您可以在新的金鑰保存庫中建立秘密。 新的角色指派最多可能需要五分鐘才能傳播,並由授權伺服器更新。
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 秘密使用者角色。 此步驟會向受控識別提供從金鑰保存庫讀取秘密的權限:
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)
部署會參考服務帳戶和金鑰保存庫 URL 的 Pod:
$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 <path-to-aks-cluster-kubeconfig> apply -f -
刪除 AKS Arc 叢集
若要刪除 AKS Arc 叢集,請使用 az aksarc delete 命令
az aksarc delete -n $aks_cluster_name -g $resource_group_name
注意
刪除具有 PodDisruptionBudget (PDB) 資源的 AKS Arc 叢集時發生已知問題:刪除作業可能無法移除這些 PDB 資源。 Microsoft知道問題並正在處理修正。
PDB 預設會安裝在已啟用工作負載身分識別的 AKS Arc 叢集中。 若要刪除已啟用工作負載識別的 AKS Arc 叢集,請參閱 疑難解答指南。
下一步
在本文中,您已部署 Kubernetes 叢集,並將其設定為使用工作負載身分識別來準備應用程式工作負載,以使用該認證進行驗證。 現在您已準備好部署應用程式,並將其設定為使用工作負載身分識別搭配最新版的 Azure 身分識別用戶端程式庫。