從 Azure Kubernetes Service (AKS) 保護對 Azure OpenAI 的存取
在本文中,您將瞭解如何使用 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 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 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 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
,並使用kubectl apply
命令將azure.workload.identity/use
註釋設定為true
。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 -w
使用
kubectl logs
命令來取得 Pod 記錄。 可能需要幾分鐘的時間來初始化 Pod。kubectl logs --selector app=ai-service -f
下列範例輸出顯示應用程式已初始化,且已準備好接受要求。 第一行建議程式碼遺漏組態變數。 不過,Azure Identity SDK 會處理此程式,並設定
AZURE_CLIENT_ID
和AZURE_TENANT_ID
變數。Incomplete environment configuration. These variables are set: AZURE_CLIENT_ID, AZURE_TENANT_ID INFO: Started server process [1] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:5001 (Press CTRL+C to quit)
使用
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 工作負載識別碼。