你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在本文中,你将了解如何使用 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。
如需在本地运行 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 工作负载 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
命令重新部署ai-service
,并设置 ServiceAccount,同时将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》。