Share via


從 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 資源。

開始之前

必要條件

在 AKS 叢集上啟用 Microsoft Entra 工作負載識別碼

根據預設,AKS 上不會啟用 Microsoft Entra 工作負載識別碼和 OIDC 簽發者端點功能。 您必須先在 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 工作負載識別碼和 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 命令取得受控識別用戶端識別碼和物件識別碼。

    # 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 資源識別碼。

    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 工作負載識別碼

若要在 AKS 上使用 Microsoft Entra 工作負載識別碼,您必須對 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 工作負載識別碼

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

測試應用程式

  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 環境變數。 輸出示範 Azure OpenAI API 金鑰已不存在於 Pod 的環境變數中。

    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. 開啟網頁瀏覽器並巡覽至第一步驟中的 IP 位址。

  6. 選取產品。 您應該能夠新增新產品,並使用 Azure OpenAI 取得其描述。

下一步

在本文中,您將瞭解如何使用 Microsoft Entra 工作負載識別碼,從 Azure Kubernetes Service (AKS) 保護對 Azure OpenAI 的存取。

如需 Microsoft Entra 工作負載識別碼的詳細資訊,請參閱 Microsoft Entra 工作負載識別碼