教學課程:在 Azure Kubernetes Service (AKS) 上將應用程式設為使用工作負載身分識別

Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您快速部署及管理 Kubernetes 叢集。 在本教學課程中,您已:

  • 使用 Azure CLI 搭配 OpenID Connect (OIDC) 簽發者和受控識別來部署 AKS 叢集。
  • 建立 Azure Key Vault 和祕密。
  • 建立 Microsoft Entra 工作負載識別碼和 Kube 服務帳戶。
  • 設定權杖同盟的受控識別。
  • 部署工作負載,並使用工作負載身分識別驗證。

開始之前

必要條件

建立資源群組

Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 建立資源群組時,系統提示您指定位置。 此位置是資源群組中繼資料的儲存位置,如果您未在資源建立期間指定另一個區域,此位置也會是您在 Azure 中執行資源的位置。

下列範例會在 eastus 位置建立名為 myResourceGroup 的資源群組。

  • 使用 az group create 命令來建立資源群組。

    az group create --name myResourceGroup --location eastus
    

    下列輸出範例類似於成功建立資源群組:

    {
      "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
      "location": "eastus",
      "managedBy": null,
      "name": "myResourceGroup",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null
    }
    

匯出環境變數

為了協助簡化設定必要身分識別的步驟,下列步驟會定義環境變數以在叢集中參考。

  • 請使用下列命令建立這些變數。 取代 RESOURCE_GROUPLOCATIONSERVICE_ACCOUNT_NAMESUBSCRIPTIONUSER_ASSIGNED_IDENTITY_NAMEFEDERATED_IDENTITY_CREDENTIAL_NAME 的預設值。

    export RESOURCE_GROUP="myResourceGroup"
    export LOCATION="westcentralus"
    export SERVICE_ACCOUNT_NAMESPACE="default"
    export SERVICE_ACCOUNT_NAME="workload-identity-sa"
    export SUBSCRIPTION="$(az account show --query id --output tsv)"
    export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
    export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"
    export KEYVAULT_NAME="azwi-kv-tutorial"
    export KEYVAULT_SECRET_NAME="my-secret"
    

建立 AKS 叢集

  1. 使用 az aks create 命令建立 AKS 叢集,並搭配 --enable-oidc-issuer 參數來使用 OIDC 簽發者。

    az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
    

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

  2. 若要取得 OIDC 簽發者 URL 並將其儲存至環境變數,請使用下列命令。 取代引數 -n 的預設值,也就是叢集名稱。

    export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -otsv)"
    

    變數應該包含與下列範例類似的簽發者 URL:

    https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000/
    

    根據預設,簽發者會設定為使用基底 URL https://{region}.oic.prod-aks.azure.com,其中 {region} 的值符合 AKS 叢集部署所在的位置。

建立 Azure Key Vault 和祕密

  1. 請使用 az keyvault create 命令,在本教學課程建立的資源群組中建立 Azure Key Vault。

    az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --name "${KEYVAULT_NAME}" --enable-rbac-authorization false
    

    此命令的輸出顯示新建立金鑰保存庫的屬性。 請記下下列兩個屬性:

    • Name:您提供給 --name 參數的保存庫名稱。
    • vaultUri:在此範例中是 https://<your-unique-keyvault-name>.vault.azure.net/。 透過其 REST API 使用保存庫的應用程式必須使用此 URI。

    此時,您的 Azure 帳戶是唯一獲得授權在此新保存庫上執行任何作業的帳戶。

  2. 請使用 az keyvault secret set 命令將祕密新增至您的保存庫。 密碼是您為環境變數 KEYVAULT_SECRET_NAME 指定的值,並會將 Hello! 的值儲存在其中。

    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
    
  3. 請使用 az keyvault show 命令將 Key Vault URL 新增至環境變數 KEYVAULT_URL

    export KEYVAULT_URL="$(az keyvault show -g "${RESOURCE_GROUP}" -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    

建立受控識別,並授與存取祕密的權限

  1. 請使用 az account set 命令,將特定訂用帳戶設定為目前使用中的訂用帳戶。

    az account set --subscription "${SUBSCRIPTION}"
    
  2. 請使用 az identity create 命令來建立受控識別。

    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
    
  3. 請使用下列命令設定受控識別的存取原則,以存取 Key Vault 中的祕密。

    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    

建立 Kubernetes 服務帳戶

  1. 請建立 Kube 服務帳戶,並使用 az aks get-credentials 命令,以上一個步驟中建立的受控識別用戶端識別碼加以標註。 取代叢集名稱和資源群組名稱的預設值。

    az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
    
  2. 將下列多行輸入複製到終端,然後執行命令來建立服務帳戶。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: ${USER_ASSIGNED_CLIENT_ID}
      name: ${SERVICE_ACCOUNT_NAME}
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
    EOF
    

    下列輸出顯示成功建立身分識別:

    Serviceaccount/workload-identity-sa created
    

建立同盟身分識別認證

  • 使用 az identity federated-credential create 命令,在受控識別、服務帳戶簽發者與主體之間建立同盟身分識別認證。

    az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name ${USER_ASSIGNED_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --issuer ${AKS_OIDC_ISSUER} --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
    

    注意

    同盟身分識別認證一開始新增後,需要幾秒鐘的時間才能散佈。 若權杖要求在新增同盟身分識別認證後立即可用,可能會導致幾分鐘的失敗,因為快取會在目錄中填入舊資料。 若要避免此問題,您可以在新增同盟身分識別認證之後稍待片刻,再提出權杖要求。

部署工作負載

  1. 請使用下列命令,部署參考上個步驟所建立服務帳戶的 Pod。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: 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: ${KEYVAULT_URL}
          - name: SECRET_NAME
            value: ${KEYVAULT_SECRET_NAME}
      nodeSelector:
        kubernetes.io/os: linux
    EOF
    

    下列輸出顯示成功建立 Pod:

    pod/quick-start created
    
  2. 若要檢查 Webhook 是否已正確插入所有屬性,請使用 kubectl describe 命令。

    kubectl describe pod quick-start
    
  3. 請使用 kubectl logs 命令確認 Pod 能夠取得權杖並從 Key Vault 存取祕密。

    kubectl logs quick-start
    

    下列輸出顯示成功存取權杖:

    I1013 22:49:29.872708       1 main.go:30] "successfully got secret" secret="Hello!"
    

清除資源

您可能想要保留這些資源。 如果您不再需要這些資源,請使用下列命令刪除資源。

  1. 使用 kubectl delete pod 命令刪除 Pod。

    kubectl delete pod quick-start
    
  2. 使用 kubectl delete sa 命令刪除服務帳戶。

    kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    
  3. 使用 az group delete 命令刪除 Azure 資源群組及其所有資源。

    az group delete --name "${RESOURCE_GROUP}"
    

下一步

在本教學課程中,您已部署 Kube 叢集,然後部署簡單的容器應用程式,以測試使用 Microsoft Entra 工作負載識別碼。

本教學課程適用於簡介用途。 如需針對生產使用 AKS 建立完整解決方案的指引,請參閱 AKS 解決方案指引