教學課程:在 Azure Kubernetes Service (AKS) 上將應用程式設為使用工作負載身分識別
Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您快速部署及管理 Kubernetes 叢集。 在本教學課程中,您已:
- 使用 Azure CLI 搭配 OpenID Connect (OIDC) 簽發者和受控識別來部署 AKS 叢集。
- 建立 Azure Key Vault 和祕密。
- 建立 Microsoft Entra 工作負載識別碼和 Kube 服務帳戶。
- 設定權杖同盟的受控識別。
- 部署工作負載,並使用工作負載身分識別驗證。
開始之前
- 本教學課程假設您對 Kubernetes 概念有基本了解。 如需詳細資訊,請參閱 Azure Kubernetes Services (AKS) 的 Kubernetes 核心概念。
- 如果您不熟悉 Microsoft Entra 工作負載識別碼,請參閱 Microsoft Entra 工作負載識別碼概觀。
- 建立 AKS 叢集時,系統會自動建立第二個資源群組來儲存 AKS 資源。 如需詳細資訊,請參閱為何會使用 AKS 建立兩個資源群組?
必要條件
- 如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
- 本文必須使用 Azure CLI 2.47.0 版或更新版本。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。
- 您用來建立叢集的身分識別必須擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項。
- 如果您有多個 Azure 訂用帳戶,請使用 az account set 命令來選取應對資源計費的適當訂用帳戶識別碼。
建立資源群組
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_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" export KEYVAULT_NAME="azwi-kv-tutorial" export KEYVAULT_SECRET_NAME="my-secret"
建立 AKS 叢集
使用 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 格式資訊。
若要取得 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 和祕密
請使用 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 帳戶是唯一獲得授權在此新保存庫上執行任何作業的帳戶。
請使用 az keyvault secret set 命令將祕密新增至您的保存庫。 密碼是您為環境變數
KEYVAULT_SECRET_NAME
指定的值,並會將 Hello! 的值儲存在其中。az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
請使用 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)"
建立受控識別,並授與存取祕密的權限
請使用 az account set 命令,將特定訂用帳戶設定為目前使用中的訂用帳戶。
az account set --subscription "${SUBSCRIPTION}"
請使用 az identity create 命令來建立受控識別。
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
請使用下列命令設定受控識別的存取原則,以存取 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 服務帳戶
請建立 Kube 服務帳戶,並使用 az aks get-credentials 命令,以上一個步驟中建立的受控識別用戶端識別碼加以標註。 取代叢集名稱和資源群組名稱的預設值。
az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
將下列多行輸入複製到終端,然後執行命令來建立服務帳戶。
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}
注意
同盟身分識別認證一開始新增後,需要幾秒鐘的時間才能散佈。 若權杖要求在新增同盟身分識別認證後立即可用,可能會導致幾分鐘的失敗,因為快取會在目錄中填入舊資料。 若要避免此問題,您可以在新增同盟身分識別認證之後稍待片刻,再提出權杖要求。
部署工作負載
請使用下列命令,部署參考上個步驟所建立服務帳戶的 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
若要檢查 Webhook 是否已正確插入所有屬性,請使用 kubectl describe 命令。
kubectl describe pod quick-start
請使用 kubectl logs 命令確認 Pod 能夠取得權杖並從 Key Vault 存取祕密。
kubectl logs quick-start
下列輸出顯示成功存取權杖:
I1013 22:49:29.872708 1 main.go:30] "successfully got secret" secret="Hello!"
清除資源
您可能想要保留這些資源。 如果您不再需要這些資源,請使用下列命令刪除資源。
使用
kubectl delete pod
命令刪除 Pod。kubectl delete pod quick-start
使用
kubectl delete sa
命令刪除服務帳戶。kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
使用 az group delete 命令刪除 Azure 資源群組及其所有資源。
az group delete --name "${RESOURCE_GROUP}"
下一步
在本教學課程中,您已部署 Kube 叢集,然後部署簡單的容器應用程式,以測試使用 Microsoft Entra 工作負載識別碼。
本教學課程適用於簡介用途。 如需針對生產使用 AKS 建立完整解決方案的指引,請參閱 AKS 解決方案指引。