共用方式為


在 AKS Edge Essentials 叢集上設定工作負載身分識別 (預覽)

Azure Kubernetes Service (AKS) Edge Essentials 是 Azure Kubernetes Service (AKS) 的內部部署 Kubernetes 實作,可大規模自動化執行容器化應用程式。 本文說明如何執行下列工作:

  • 建立 Kubernetes 服務帳戶,並將其系結至 Azure 受控識別。
  • 在受控識別上建立同盟認證,以信任 OIDC 簽發者。
  • 部署您的應用程式。
  • 範例:將叢集中的Pod存取權授與 Azure 金鑰保存庫中的秘密。

如需工作負載身分識別同盟的概念概觀,請參閱已啟用 Azure Arc 的 Kubernetes 中的工作負載身分識別同盟(預覽版)。

重要

這些預覽功能會以自助式、選擇方式提供。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 Azure Kubernetes Service Edge Essentials 預覽部分由客戶支援盡最大努力涵蓋。

注意

在此公開預覽中,AKS Edge Essentials 可讓您在 Azure IoT 作業快速入門腳本的初始部署期間啟用工作負載身分識別。 此功能不適用於其他 AKS Edge Essentials 案例。

必要條件

使用 AKS Edge Essentials 叢集的工作負載身分識別同盟之前,您必須先部署 Azure IoT 作業快速入門腳本,如建立及設定可執行 Azure IoT 作業的 AKS Edge Essentials 叢集中所述。 腳本會自動啟用 AKS Edge Essentials 叢集上的工作負載身分識別同盟功能。

部署 AKS Edge Essentials 叢集之後,您可以使用下列命令來檢查工作負載身分識別延伸模組的狀態:

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延伸模組。

匯出環境變數

為了協助簡化設定必要身分識別的步驟,下列步驟會定義本文範例中所參考的環境變數。 請記得將顯示的值取代為您自己的值:

$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 受控識別

首先,呼叫 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 服務帳戶,並使用您在上一個步驟中建立之受控識別的用戶端標識符來標註它。 複製並貼上下列 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 -

下列輸出顯示已成功建立的工作負載身分識別:

serviceaccount/workload-identity-sa created

步驟 2:在受控識別上建立同盟認證,以信任 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

注意

新增同盟身分識別認證之後,需要幾秒鐘的時間才能傳播。 在快取重新整理之前,立即提出的令牌要求可能會失敗。 若要避免此問題,請考慮在建立同盟身分識別認證之後新增短暫的延遲。

步驟 3:部署您的應用程式

當您部署應用程式 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 $aks_cluster_name apply -f -
    

下一步

在本文中,您已將它設定為使用工作負載身分識別,以準備應用程式工作負載以使用該認證進行驗證。 現在您已準備好部署應用程式,並將其設定為使用工作負載身分識別搭配最新版的 Azure 身分識別用戶端程式庫。