在 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_GROUP
、LOCATION
、SERVICE_ACCOUNT_NAME
、SUBSCRIPTION
、USER_ASSIGNED_IDENTITY_NAME
和 FEDERATED_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\namespace 和 spec\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。
執行下列命令,設定受控識別的存取原則,以存取您的金鑰保存庫中的秘密:
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}"
將祕密儲存至 Key Vault 中:
export KEYVAULT_SECRET_NAME="my-secret" az keyvault secret set --vault-name "${KEYVAULT_NAME}" \ --name "${KEYVAULT_SECRET_NAME}" \ --value "Hello\!"
匯出金鑰保存庫 URL:
export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
部署可參考上述服務帳戶和 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,以使用受控識別搭配工作負載身分識別進行驗證,作為短期移轉解決方案。