共用方式為


在 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\namespacespec\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 金鑰保存庫的權限

  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 金鑰保存庫 Secrets Officer 角色指派給自己,以便您可以在新的金鑰保存庫中建立秘密。 新的角色指派最多可能需要五分鐘才能傳播,並由授權伺服器更新。

    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 秘密使用者角色。 此步驟會向受控識別提供從金鑰保存庫讀取秘密的權限:

    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. 部署會參考服務帳戶和金鑰保存庫 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 身分識別用戶端程式庫。