Безопасный доступ к Azure OpenAI из Служба Azure Kubernetes (AKS)

В этой статье вы узнаете, как защитить доступ к Azure OpenAI из Служба Azure Kubernetes (AKS) с помощью Идентификация рабочей нагрузки Microsoft Entra. Узнайте следующие темы:

  • Включите удостоверения рабочей нагрузки в кластере AKS.
  • Создайте управляемое удостоверение, назначаемое пользователем.
  • Создайте федеративные учетные данные идентификатора Microsoft Entra.
  • Включите удостоверение рабочей нагрузки в модуле Pod Kubernetes.

Примечание.

Мы рекомендуем использовать Идентификация рабочей нагрузки Microsoft Entra и управляемые удостоверения в AKS для Azure OpenAI access, так как это обеспечивает безопасный процесс проверки подлинности без пароля для доступа к ресурсам Azure.

Подготовка к работе

Необходимые компоненты

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Включение Идентификация рабочей нагрузки Microsoft Entra в кластере AKS

Функции конечной точки издателя OIDC и Идентификация рабочей нагрузки Microsoft Entra по умолчанию не включены в 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. Включите функции конечной точки издателя Идентификация рабочей нагрузки Microsoft Entra и OIDC в существующем кластере az aks update AKS с помощью команды.

    az aks update \
        --resource-group $RG_NAME \
        --name $AKS_NAME \
        --enable-workload-identity \
        --enable-oidc-issuer
    
  3. Получите URL-адрес конечной точки издателя AKS OIDC с помощью az aks show команды.

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

Создание управляемого удостоверения, назначаемое пользователем Azure

  1. Создайте управляемое удостоверение, назначаемое пользователем Azure, с помощью 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. Получите идентификатор клиента управляемого удостоверения и идентификатор объекта с помощью 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. Получите идентификатор ресурса Azure OpenAI с помощью az resource list команды.

    AOAI_RESOURCE_ID=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.CognitiveServices/accounts --query "[0].id" -o tsv)
    
  4. Предоставьте управляемому удостоверению доступ к ресурсу Azure OpenAI с помощью 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
    

Создание федеративных учетных данных идентификатора Microsoft Entra

  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}
    

Использование Идентификация рабочей нагрузки Microsoft Entra в AKS

Чтобы использовать Идентификация рабочей нагрузки Microsoft Entra в AKS, необходимо внести несколько изменений в ai-service манифест развертывания.

Создание ServiceAccount

  1. Получите kubeconfig для кластера с помощью az aks get-credentials команды.

    az aks get-credentials \
        --resource-group $RG_NAME \
        --name $AKS_NAME
    
  2. Создайте Kubernetes ServiceAccount с помощью 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
    

Включение Идентификация рабочей нагрузки Microsoft Entra в pod

  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. ai-service Повторно разверните приложение ServiceAccount и azure.workload.identity/use заметок, заданные kubectl applytrue для использования команды.

    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. Убедитесь, что новый модуль pod выполняется с помощью kubectl get pods команды.

    kubectl get pods --selector app=ai-service -w
    
  2. Получите журналы pod с помощью kubectl logs команды. Для инициализации модуля pod может потребоваться несколько минут.

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

    В следующем примере выходных данных показано, что приложение инициализировано и готово к приему запросов. Первая строка предполагает, что код отсутствует переменные конфигурации. Однако пакет SDK для удостоверений Azure обрабатывает этот процесс и задает 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)
    
  3. Получение переменных среды pod с помощью kubectl describe pod команды. В выходных данных показано, что ключ API Azure OpenAI больше не существует в переменных среды Pod.

    kubectl describe pod --selector app=ai-service
    
  4. Откройте новый терминал и получите IP-адрес службы администрирования магазина с помощью следующей echo команды.

    echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    
  5. Откройте веб-браузер и перейдите к IP-адресу из предыдущего шага.

  6. Выберите Продукты. Вы должны иметь возможность добавить новый продукт и получить описание для него с помощью Azure OpenAI.

Следующие шаги

В этой статье вы узнали, как защитить доступ к Azure OpenAI из Служба Azure Kubernetes (AKS) с помощью Идентификация рабочей нагрузки Microsoft Entra.

Дополнительные сведения о Идентификация рабочей нагрузки Microsoft Entra см. в Идентификация рабочей нагрузки Microsoft Entra.