Share via


Acceso seguro a Azure OpenAI desde Azure Kubernetes Service (AKS)

En este artículo, aprenderá a proteger el acceso a Azure OpenAI desde Azure Kubernetes Service (AKS) mediante Microsoft Entra Workload ID. Aprenderá a:

  • Habilite las identidades de carga de trabajo en un clúster de AKS.
  • Creación de una identidad administrada de Azure asignada por el usuario.
  • Cree una credencial federada de Microsoft Entra ID.
  • Habilite la identidad de carga de trabajo en un pod de Kubernetes.

Nota:

Se recomienda usar Microsoft Entra Workload ID e identidades administradas en AKS para el acceso a Azure OpenAI, ya que permite un proceso de autenticación seguro sin contraseña para acceder a los recursos de Azure.

Antes de empezar

Requisitos previos

Habilitación de Microsoft Entra Workload ID en un clúster de AKS

Las características Microsoft Entra Workload ID y punto de conexión del emisor de OIDC no están habilitadas en AKS de forma predeterminada. Debe habilitarlas en el clúster de AKS para poder usarlas.

  1. Establezca el nombre del grupo de recursos y las variables de nombre del grupo de recursos del clúster de 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. Habilite las características de Microsoft Entra Workload ID y punto de conexión del emisor de OIDC en el clúster de AKS existente mediante el comando az aks update.

    az aks update \
        --resource-group $RG_NAME \
        --name $AKS_NAME \
        --enable-workload-identity \
        --enable-oidc-issuer
    
  3. Obtenga la dirección URL del punto de conexión del emisor OIDC de AKS mediante el comando az aks show.

    AKS_OIDC_ISSUER=$(az aks show --resource-group $RG_NAME --name $AKS_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)
    

Creación de una identidad administrada de Azure asignada por el usuario

  1. Cree una identidad administrada asignada por el usuario de Azure mediante el comando az identity create.

    # 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. Obtenga el id. de cliente de identidad administrada y el identificador de objeto mediante el comando 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. Obtenga el id. de recurso de Azure OpenAI mediante el comando az resource list.

    AOAI_RESOURCE_ID=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.CognitiveServices/accounts --query "[0].id" -o tsv)
    
  4. Conceda a la identidad administrada acceso al recurso de Azure OpenAI mediante el comando az role assignment create.

    az role assignment create \
        --role "Cognitive Services OpenAI User" \
        --assignee-object-id $MANAGED_IDENTITY_OBJECT_ID \
        --assignee-principal-type ServicePrincipal \
        --scope $AOAI_RESOURCE_ID
    

Creación de una credencial federada de Microsoft Entra ID

  1. Configure las variables de credencial federada, espacio de nombres y cuenta de servicio.

    # 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. Cree la credencial federada mediante el comando 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}
    

Uso de Microsoft Entra Workload ID en AKS

Para usar Microsoft Entra Workload ID en AKS, debe realizar algunos cambios en el manifiesto de implementación de ai-service.

Creación de una cuenta de servicio

  1. Obtenga kubeconfig para el clúster mediante el comando az aks get-credentials.

    az aks get-credentials \
        --resource-group $RG_NAME \
        --name $AKS_NAME
    
  2. Cree una instancia de Kubernetes ServiceAccount mediante el comando kubectl apply.

    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
    

Habilitación de Microsoft Entra Workload ID en el pod

  1. Configure las variables de nombre de recurso, punto de conexión y nombre de implementación de 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. Vuelva a implementar ai-service con ServiceAccount y la anotación azure.workload.identity/use establecida en true mediante el comando kubectl apply.

    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
    

Prueba de la aplicación

  1. Compruebe que el pod está en ejecución mediante el comando kubectl get pods.

    kubectl get pods --selector app=ai-service -w
    
  2. Obtenga los registros del pod mediante el comando kubectl logs. El pod puede tardar unos minutos en inicializarse.

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

    En la salida de ejemplo siguiente se muestra que la aplicación se ha inicializado y está lista para aceptar solicitudes. La primera línea sugiere que faltan variables de configuración en el código. Sin embargo, el SDK de Identidad de Azure controla este proceso y configura las variables AZURE_CLIENT_ID y 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)
    
  3. Obtenga las variables de entorno de pod mediante el comando kubectl describe pod. La salida muestra que la clave de API de Azure OpenAI ya no existe en las variables de entorno del pod.

    kubectl describe pod --selector app=ai-service
    
  4. Abra un nuevo terminal y obtenga la dirección IP del servicio de administración de la tienda mediante el siguiente comando echo.

    echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    
  5. Abra un explorador y vaya a la dirección IP desde el paso anterior.

  6. Seleccione Productos. Debería poder agregar un nuevo producto y obtener una descripción para él mediante Azure OpenAI.

Pasos siguientes

En este artículo, ha aprendido a proteger el acceso a Azure OpenAI desde Azure Kubernetes Service (AKS) mediante Microsoft Entra Workload ID.

Para obtener más información sobre Microsoft Entra Workload ID, consulte Microsoft Entra Workload ID.