在 Azure Kubernetes Service (AKS) 叢集上部署和設定工作負載身分識別

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

  • 使用 Azure CLI 來部署 AKS 叢集,其中包括 OpenID Connect 簽發者和 Microsoft Entra 工作負載識別碼
  • 授與對 Azure Key Vault 的存取權
  • 建立 Microsoft Entra 工作負載識別碼和 Kubernetes 服務帳戶
  • 設定權杖同盟的受控識別。

本文假設您對 Kubernetes 概念有基本瞭解。 如需詳細資訊,請參閱 Azure Kubernetes Services (AKS) 的 Kubernetes 核心概念。 如果您不熟悉 Microsoft Entra 工作負載識別碼,則請參閱下列概觀文章。

  • 本文必須使用 Azure CLI 2.47.0 版或更新版本。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

  • 您用來建立叢集的身分識別擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項

  • 如果您有多個 Azure 訂用帳戶,則請使用 az account 命令來選取應該對資源計費的適當訂用帳戶識別碼。

注意

除了手動設定所有步驟,還有另一個稱為 Service 連線 or 的實作,可協助您自動設定某些步驟並達成相同的結果。 另請參閱:教學課程:使用 連線 工作負載身分識別,在 Azure Kubernetes Service (AKS) 中 連線 至 Azure 記憶體帳戶。

匯出環境變數

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

請執行下列命令來建立這些變數。 取代 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"

建立 AKS 叢集

使用 az aks create 命令建立 AKS 叢集,並搭配 --enable-oidc-issuer 參數來使用 OIDC 簽發者。 下列範例會建立名稱為 myAKSCluster 的叢集,其在 myResourceGroup 中包含一個節點:

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

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

注意

建立 AKS 叢集時,系統會自動建立第二個資源群組來儲存 AKS 資源。 如需詳細資訊,請參閱為何會使用 AKS 建立兩個資源群組?

更新現有的 AKS 叢集

您可以搭配使用 az aks update 命令與 --enable-oidc-issuer--enable-workload-identity 參數來更新 AKS 叢集以使用 OIDC 簽發者,並啟用工作負載身分識別。 下列範例會更新名為 myAKSCluster 的叢集:

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

擷取 OIDC 簽發者 URL

若要取得 OIDC 簽發者 URL 並將其儲存至環境變數,請執行下列命令。 取代引數 -n 的預設值,這是叢集名稱:

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

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

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

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

建立受控識別

使用 Azure CLI az account set 命令,將特定訂閱設定為目前使用中訂閱。 然後使用 az identity create 命令來建立受控識別。

az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"

接下來,請建立受控識別識別碼的變數。

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"

建立 Kubernetes 服務帳戶

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

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

在 Azure CLI 中複製並貼上下列多行輸入。

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}" --audience api://AzureADTokenExchange

注意

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

部署應用程式

當您部署應用程式 Pod 時,資訊清單應該參考建立 Kubernetes 服務帳戶步驟中所建立的服務帳戶。 下列資訊清單顯示如何參考帳戶,特別是 metadata\namespacespec\serviceAccountName 屬性:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

重要

請確定使用工作負載身分識別的應用程式 Pod 已將下列標籤 azure.workload.identity/use: "true" 新增至 Pod 規格,否則 Pod 會在其重新啟動後失敗。

選用 - 授與存取 Azure Key Vault 的權限

如果您需要從 Pod 存取在 Azure Key Vault 中掛接的秘密、金鑰和憑證,則需要此步驟。 執行下列步驟,以使用受控識別來設定存取權。 這些步驟假設您已在訂用帳戶中建立並設定 Azure Key Vault。 如果您沒有 Azure Key Vault,請參閱使用 Azure CLI 建立 Azure Key Vault

繼續之前,您需要下列資訊:

  • 金鑰保存庫的名稱
  • 保留金鑰保存庫的資源群組

您可使用 Azure CLI 命令來擷取此資訊:az keyvault list

  1. 執行下列命令,設定受控識別的存取原則,以存取您的金鑰保存庫中的秘密:

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. 將祕密儲存至 Key Vault 中:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. 匯出金鑰保存庫 URL:

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. 部署可參考上述服務帳戶和 Key Vault URL 的 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
    

若要檢查 Webhook 是否已正確插入所有屬性,請使用 kubectl describe 命令:

kubectl describe pod quick-start | grep "SECRET_NAME:"

如果成功,則輸出應該與下列輸出類似:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

若要確認 Pod 能夠取得權杖並存取資源,請使用 kubectl logs 命令:

kubectl logs quick-start

如果成功,則輸出應該與下列輸出類似:

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

停用工作負載身分識別

若要在已啟用並設定 Microsoft Entra 工作負載識別碼的 AKS 叢集上將其停用,您可以執行下列命令:

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

下一步

在本文中,您已部署 Kubernetes 叢集,並將其設定為使用工作負載身分識別來準備應用程式工作負載,以使用該認證進行驗證。 現在您已準備好部署應用程式,並將其設定為使用工作負載身分識別搭配最新版的 Azure 身分識別用戶端程式庫。 如果您無法將應用程式重寫為使用最新的用戶端程式庫版本,您可以設定應用程式 Pod,以使用受控識別搭配工作負載身分識別進行驗證,作為短期移轉解決方案。