你当前正在访问 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 资源。

开始之前

先决条件

在 AKS 群集上启用 Microsoft Entra 工作负载 ID

默认情况下,Microsoft Entra 工作负载 ID 和 OIDC 颁发者终结点功能在 AKS 上处于未启用状态。 必须先在 AKS 群集上启用它们,然后才能使用它们。

  1. 设置资源组名称和 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)
    
  2. 使用 az aks update 命令在现有 AKS 群集上启用 Microsoft Entra 工作负载 ID 和 OIDC 颁发者终结点功能。

    az aks update \
        --resource-group $RG_NAME \
        --name $AKS_NAME \
        --enable-workload-identity \
        --enable-oidc-issuer
    
  3. 使用 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 用户分配的托管标识

  1. 使用 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
    
  2. 使用 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)
    
  3. 使用 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)
    
  4. 使用 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 联合凭据

  1. 设置联合凭据、命名空间和服务帐户变量。

    # 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
    
  2. 使用 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

  1. 使用 az aks get-credentials 命令获取群集的 kubeconfig。

    az aks get-credentials \
        --resource-group $RG_NAME \
        --name $AKS_NAME
    
  2. 使用 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

  1. 设置 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)
    
  2. 使用 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
    

测试应用程序

  1. 使用 kubectl get pods 命令验证新 Pod 是否正在运行。

    kubectl get pods --selector app=ai-service -w
    
  2. 使用 kubectl logs 命令获取 Pod 日志。 可能需要几分钟时间才能初始化 Pod。

    kubectl logs --selector app=ai-service -f
    

    以下示例输出显示应用已初始化并已准备好接受请求。 第一行表明代码缺少配置变量。 但是,Azure Identity SDK 处理此过程,并设置 AZURE_CLIENT_IDAZURE_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)
    
  3. 使用 kubectl describe pod 命令获取 Pod 环境变量。 输出表明 Pod 的环境变量中不再存在 Azure OpenAI API 密钥。

    kubectl describe pod --selector app=ai-service
    
  4. 使用以下 echo 命令打开新终端并获取应用商店管理服务的 IP。

    echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    
  5. 打开 Web 浏览器并导航到上一步中的 IP 地址。

  6. 选择“产品”。 应能够使用 Azure OpenAI 添加新产品并获取其说明。

后续步骤

在本文中,你了解了如何使用 Microsoft Entra 工作负载 ID 从 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问。

有关 Microsoft Entra 工作负载 ID 的详细信息,请参阅《Microsoft Entra 工作负载 ID》。