在本文中,您將瞭解如何使用 Microsoft Entra 工作負載識別碼,從 Azure Kubernetes Service (AKS) 保護對 Azure OpenAI 的存取。 您將學習如何:
- 在 AKS 叢集上啟用工作負載身分識別。
- 建立 Azure 使用者指派的受控識別。
- 建立 Microsoft Entra ID 同盟認證。
- 在 Kubernetes Pod 上啟用工作負載身分識別。
注意
我們建議在 AKS 上使用 Microsoft Entra 工作負載識別碼和受控識別進行 Azure OpenAI 存取,因為它可啟用安全、無密碼的驗證流程來存取 Azure 資源。
開始之前
- 您需要具有有效訂用帳戶的 Azure 帳戶。 如果您沒有帳戶,可免費建立帳戶。
- 本文是以 部署在 AKS 上使用 OpenAI 的應用程式為基礎。 您應該先完成閱讀該文章,再開始此文章。
- 您需要在 Azure OpenAI 帳戶上啟用自訂網域名稱,才能用於 Microsoft Entra 授權。 如需詳細資訊,請參閱 Azure AI 服務的自訂子網域名稱。
必要條件
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱 使用 Azure CLI 向 Azure 進行驗證。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
在 AKS 叢集上啟用 Microsoft Entra 工作負載識別碼
根據預設,AKS 上不會啟用 Microsoft Entra 工作負載識別碼和 OIDC 簽發者端點功能。 您必須先在 AKS 叢集上啟用它們,才能使用它們。
設定資源群組名稱及 AKS 叢集資源群組變數。
# Set the resource group variable RG_NAME=myResourceGroup # Set the AKS cluster name based on the resource group variable AKS_NAME=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.ContainerService/managedClusters --query "[0].name" -o tsv)使用
az aks update命令,在您的現有 AKS 叢集上啟用 Microsoft Entra 工作負載識別碼和 OIDC 簽發者端點功能。az aks update \ --resource-group $RG_NAME \ --name $AKS_NAME \ --enable-workload-identity \ --enable-oidc-issuer使用
az aks show命令取得 AKS OIDC 簽發者端點 URL。AKS_OIDC_ISSUER=$(az aks show --resource-group $RG_NAME --name $AKS_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)
建立 Azure 使用者指派的受控識別
使用
az identity create命令建立 Azure 使用者指派的受控識別。# Set the managed identity name variable MANAGED_IDENTITY_NAME=myIdentity # Create the managed identity az identity create \ --resource-group $RG_NAME \ --name $MANAGED_IDENTITY_NAME使用
az identity show命令取得受控識別用戶端識別碼和物件識別碼。# Get the managed identity client ID MANAGED_IDENTITY_CLIENT_ID=$(az identity show --resource-group $RG_NAME --name $MANAGED_IDENTITY_NAME --query clientId -o tsv) # Get the managed identity object ID MANAGED_IDENTITY_OBJECT_ID=$(az identity show --resource-group $RG_NAME --name $MANAGED_IDENTITY_NAME --query principalId -o tsv)使用
az resource list命令取得 Azure OpenAI 資源識別碼。AOAI_RESOURCE_ID=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.CognitiveServices/accounts --query "[0].id" -o tsv)使用
az role assignment create命令,將受控識別存取權授與 Azure OpenAI 資源。az role assignment create \ --role "Cognitive Services OpenAI User" \ --assignee-object-id $MANAGED_IDENTITY_OBJECT_ID \ --assignee-principal-type ServicePrincipal \ --scope $AOAI_RESOURCE_ID
建立 Microsoft Entra ID 同盟認證
設定同盟認證、命名空間和服務帳戶變數。
# Set the federated credential name variable FEDERATED_CREDENTIAL_NAME=myFederatedCredential # Set the namespace variable SERVICE_ACCOUNT_NAMESPACE=default # Set the service account variable SERVICE_ACCOUNT_NAME=ai-service-account使用
az identity federated-credential create命令建立同盟認證。az identity federated-credential create \ --name ${FEDERATED_CREDENTIAL_NAME} \ --resource-group ${RG_NAME} \ --identity-name ${MANAGED_IDENTITY_NAME} \ --issuer ${AKS_OIDC_ISSUER} \ --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
在 AKS 上使用 Microsoft Entra 工作負載識別碼
若要在 AKS 上使用 Microsoft Entra 工作負載識別碼,您必須對 ai-service 部署資訊清單進行一些變更。
建立 ServiceAccount
使用
az aks get-credentials命令取得叢集的 kubeconfig。az aks get-credentials \ --resource-group $RG_NAME \ --name $AKS_NAME使用
kubectl apply命令建立 Kubernetes ServiceAccount。kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: ${MANAGED_IDENTITY_CLIENT_ID} name: ${SERVICE_ACCOUNT_NAME} namespace: ${SERVICE_ACCOUNT_NAMESPACE} EOF
在 Pod 叢集上啟用 Microsoft Entra 工作負載識別碼
設定 Azure OpenAI 資源名稱、端點和部署名稱變數。
# Get the Azure OpenAI resource name AOAI_NAME=$(az resource list \ --resource-group $RG_NAME \ --resource-type Microsoft.CognitiveServices/accounts \ --query "[0].name" -o tsv) # Get the Azure OpenAI endpoint AOAI_ENDPOINT=$(az cognitiveservices account show \ --resource-group $RG_NAME \ --name $AOAI_NAME \ --query properties.endpoint -o tsv) # Get the Azure OpenAI deployment name AOAI_DEPLOYMENT_NAME=$(az cognitiveservices account deployment list \ --resource-group $RG_NAME \ --name $AOAI_NAME \ --query "[0].name" -o tsv)使用 ServiceAccount 重新部署
ai-service,並使用azure.workload.identity/use命令將true註釋設定為kubectl apply。kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: ai-service spec: replicas: 1 selector: matchLabels: app: ai-service template: metadata: labels: app: ai-service azure.workload.identity/use: "true" spec: serviceAccountName: $SERVICE_ACCOUNT_NAME nodeSelector: "kubernetes.io/os": linux containers: - name: ai-service image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest ports: - containerPort: 5001 env: - name: USE_AZURE_OPENAI value: "True" - name: USE_AZURE_AD value: "True" - name: AZURE_OPENAI_DEPLOYMENT_NAME value: "${AOAI_DEPLOYMENT_NAME}" - name: AZURE_OPENAI_ENDPOINT value: "${AOAI_ENDPOINT}" resources: requests: cpu: 20m memory: 50Mi limits: cpu: 50m memory: 128Mi EOF
測試應用程式
使用
kubectl get pods命令,驗證新 Pod 為 執行中。kubectl get pods --selector app=ai-service使用
kubectl describe pod命令取得 Pod 環境變數。 輸出示範 Azure OpenAI API 金鑰已不存在於 Pod 的環境變數中。kubectl describe pod --selector app=ai-service開啟新的終端機,並使用下列
echo命令取得市集管理服務的 IP。echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"開啟網頁瀏覽器並巡覽至第一步驟中的 IP 位址。
選取產品。 您應該能夠新增新產品,並使用 Azure OpenAI 取得其描述。
下一步
在本文中,您將瞭解如何使用 Microsoft Entra 工作負載識別碼,從 Azure Kubernetes Service (AKS) 保護對 Azure OpenAI 的存取。
如需 Microsoft Entra 工作負載識別碼的詳細資訊,請參閱 Microsoft Entra 工作負載識別碼。