你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
通过 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问
在本文中,你将了解如何使用 Microsoft Entra 工作负载 ID 从 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问。 学习如何:
- 在 AKS 群集上启用工作负载标识。
- 创建 Azure 用户分配的托管标识。
- 创建 Microsoft Entra ID 联合凭据。
- 在 Kubernetes Pod 上启用工作负载标识。
注意
我们建议在 AKS 上使用 Microsoft Entra 工作负载 ID 和托管标识进行 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 工作负载 ID
默认情况下,Microsoft Entra 工作负载 ID 和 OIDC 颁发者终结点功能在 AKS 上处于未启用状态。 必须先在 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 工作负载 ID 和 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
命令获取托管标识客户端 ID 和对象 ID。# 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 资源 ID。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 工作负载 ID
要在 AKS 上使用 Microsoft Entra 工作负载 ID,需要对 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 工作负载 ID
设置 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)
使用
kubectl apply
命令通过 ServiceAccount 重新部署ai-service
,将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 环境变量。 输出表明 Pod 的环境变量中不再存在 Azure OpenAI API 密钥。kubectl describe pod --selector app=ai-service
使用以下
echo
命令打开新终端并获取应用商店管理服务的 IP。echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
打开 Web 浏览器并导航到上一步中的 IP 地址。
选择“产品”。 应能够使用 Azure OpenAI 添加新产品并获取其说明。
后续步骤
在本文中,你了解了如何使用 Microsoft Entra 工作负载 ID 从 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问。
有关 Microsoft Entra 工作负载 ID 的详细信息,请参阅《Microsoft Entra 工作负载 ID》。