你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

部署使用 Azure Kubernetes 服务 (AKS) 上的 OpenAI 的应用程序

本文介绍如何部署使用 Azure OpenAI 或 AKS 上的 OpenAI 的应用程序。 借助 OpenAI,你可以轻松根据具体的任务需求调整不同的 AI 模型,例如内容生成、摘要、语义搜索,以及自然语言到代码生成。 首先,在 Azure 订阅中部署 AKS 群集。 然后,部署 OpenAI 服务和示例应用程序。

示例云原生应用程序代表实际的实现。 多容器应用程序由使用多种语言和框架的应用程序组成,其中包括:

  • Golang 与 Gin
  • Rust 与 Actix-Web
  • JavaScript 与 Vue.js 和 Fastify
  • Python 与 FastAPI

这些应用程序为客户和门店管理员提供前端,REST API 用于将数据发送到 RabbitMQ 消息队列和 MongoDB 数据库,控制台应用则用于模拟流量。

注意

不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 MongoDB 和 Rabbit MQ)。 为简单起见,我们在此使用它们,但建议使用托管服务,例如 Azure CosmosDB 或 Azure 服务总线。

若要访问示例应用程序的 GitHub 代码库,请参阅 AKS 门店演示

开始之前

  • 需要一个具有活动订阅的 Azure 帐户。 如果你没有帐户,请免费创建一个
  • 在本演示中,可以使用 Azure OpenAI 服务或 OpenAI 服务。

先决条件

创建资源组

Azure 资源组是在其中部署和管理 Azure 资源的逻辑组。 创建资源组时,系统会提示你指定一个位置。 此位置是资源组元数据的存储位置,也是资源在 Azure 中运行的位置(如果你在创建资源期间未指定其他区域)。

以下示例在“eastus”位置创建名为“myResourceGroup”的资源组。

  • 使用 az group create 命令创建资源组。

    az group create --name myResourceGroup --location eastus
    

    以下示例输出显示已成功创建资源组:

    {
      "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
      "location": "eastus",
      "managedBy": null,
      "name": "myResourceGroup",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null,
      "type": "Microsoft.Resources/resourceGroups"
    }
    

创建 AKS 群集

以下示例在 myResourceGroup 中创建名为 myAKSCluster 的群集。

  • 使用 az aks create 命令创建 AKS 群集。

    az aks create --resource-group myResourceGroup --name myAKSCluster --generate-ssh-keys
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

连接到群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 如果使用的是 Azure Cloud Shell,则 kubectl 已安装。

  1. 使用 az aks install-cli 命令在本地安装 kubectl

    az aks install-cli
    

    注意

    如果基于 Linux 的系统需要提升的权限,可以使用 sudo az aks install-cli 命令。

  2. 使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。

    此命令执行以下操作:

    • 下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。
    • 使用 ~/.kube/config,即 Kubernetes 配置文件的默认位置。 使用 --file 参数指定 Kubernetes 配置文件的其他位置。
    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. 使用 kubectl get 命令验证与群集之间的连接。 此命令将返回群集节点的列表。

    kubectl get nodes
    

    以下示例输出显示在上一步骤中创建的节点。 确保节点状态为“就绪”。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31469198-vmss000000   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000001   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000002   Ready    agent   3h29m   v1.25.6
    

注意

对于专用群集,如果你尝试通过公共 IP 地址连接到节点,则可能无法访问这些节点。 若要解决此问题,需要在源群集所在的同一 VNET 中创建一个终结点。 按照说明创建专用 AKS 群集,然后与它建立连接。

部署应用程序

AKS AI 演示的体系结构图。

AKS 门店应用程序清单包含以下 Kubernetes 部署和服务:

  • 产品服务:显示产品信息。
  • 订单服务:下单。
  • Makeline 服务:处理队列中的订单并完成订单。
  • 门店:Web 应用程序,供客户查看产品和下单。
  • 门店管理员:Web 应用程序,供门店员工查看队列中的订单并管理产品信息。
  • 虚拟客户:模拟按日程安排创建订单。
  • 虚拟辅助角色:模拟按日程安排完成订单。
  • Mongo DB:用于处理持久数据的 NoSQL 实例。
  • Rabbit MQ:订单队列的消息队列。

注意

不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 MongoDB 和 Rabbit MQ)。 为简单起见,我们在此使用它们,但建议使用托管服务,例如 Azure CosmosDB 或 Azure 服务总线。

  1. 查看应用程序的 YAML 清单

  2. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称。

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-all-in-one.yaml
    

    以下示例输出显示已成功创建了部署和服务:

    deployment.apps/mongodb created
    service/mongodb created
    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/makeline-service created
    service/makeline-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    deployment.apps/store-admin created
    service/store-admin created
    deployment.apps/virtual-customer created
    deployment.apps/virtual-worker created
    

部署 OpenAI

可以使用 Azure OpenAI 或 OpenAI,并在 AKS 上运行应用程序。

  1. 填写 Azure OpenAI 服务访问申请表,在 Azure 订阅上启用 Azure OpenAI。
  2. 在 Azure 门户中创建一个 Azure OpenAI 实例。
  3. 选择创建的 Azure OpenAI 实例。
  4. 选择“密钥和终结点”生成密钥。
  5. 选择“模型部署”>“托管部署”,打开“Azure OpenAI 工作室”。
  6. 使用“gpt-35-turbo”模型创建新的部署。

如需详细了解如何在 Azure OpenAI 中创建部署,请参阅使用 Azure OpenAI 服务生成文本入门知识

部署 AI 服务

应用程序已经部署完成,现在可以部署使用 Python 编写的微服务,它使用 OpenAI 自动生成添加到门店目录的新产品介绍。

  1. 创建名为 ai-service.yaml 的文件,并将以下清单复制到其中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ai-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ai-service
      template:
        metadata:
          labels:
            app: ai-service
        spec:
          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: AZURE_OPENAI_DEPLOYMENT_NAME 
              value: ""
            - name: AZURE_OPENAI_ENDPOINT 
              value: ""
            - name: OPENAI_API_KEY 
              value: ""
            resources:
              requests:
                cpu: 20m
                memory: 50Mi
              limits:
                cpu: 50m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ai-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 5001
        targetPort: 5001
      selector:
        app: ai-service
    
  2. USE_AZURE_OPENAI 环境变量设置为 "True"

  3. Azure OpenAI 工作室获取 Azure OpenAI 部署名称,并填写 AZURE_OPENAI_DEPLOYMENT_NAME 值。

  4. 选择资源左侧边栏选项卡中的“密钥和终结点”,从 Azure 门户获取 Azure OpenAI 终结点和 Azure OpenAI API 密钥。 相应地更新 YAML 中的 AZURE_OPENAI_ENDPOINTOPENAI_API_KEY

  5. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称。

    kubectl apply -f ai-service.yaml
    

    以下示例输出显示已成功创建了部署和服务:

      deployment.apps/ai-service created
      service/ai-service created
    

注意

直接将 API 密钥等敏感信息添加到 Kubernetes 清单文件这种做法并不安全,可能会意外地提交到代码存储库。 为了简单起见,在此处已经添加了敏感信息。 如果是生产工作负荷,请改为使用托管标识对 Azure OpenAI 服务进行身份验证,或将密钥存储在 Azure 密钥保管库中。

测试应用程序

  1. 使用 kubectl get pods 命令查看已部署的 Pod 的状态。

    kubectl get pods
    

    在继续进行下一步操作之前,请确保所有 Pod 都在运行

    NAME                                READY   STATUS    RESTARTS   AGE
    makeline-service-7db94dc7d4-8g28l   1/1     Running   0          99s
    mongodb-78f6d95f8-nptbz             1/1     Running   0          99s
    order-service-55cbd784bb-6bmfb      1/1     Running   0          99s
    product-service-6bf4d65f74-7cbvk    1/1     Running   0          99s
    rabbitmq-9855984f9-94nlm            1/1     Running   0          99s
    store-admin-7f7d768c48-9hn8l        1/1     Running   0          99s
    store-front-6786c64d97-xq5s9        1/1     Running   0          99s
    virtual-customer-79498f8667-xzsb7   1/1     Running   0          99s
    virtual-worker-6d77fff4b5-7g7rj     1/1     Running   0          99s
    
  2. 若要获取门店管理员 Web 应用程序和门店 Web 应用程序的 IP,请使用 kubectl get service 命令。

    kubectl get service store-admin
    

    应用程序通过 Kubernetes 服务预配的公共负载均衡器向 Internet 公开应用门店管理员站点。 此过程可能需要几分钟才能完成。 EXTERNAL IP 最初显示为“待处理”,直到服务启动并显示 IP 地址。

    NAME          TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    store-admin   LoadBalancer   10.0.142.228   40.64.86.161    80:32494/TCP   50m    
    

    对名为 `store-front`` 的服务重复相同步骤。

  3. 打开 Web 浏览器,浏览到服务的外部 IP 地址。 在此处显示的示例中,打开 40.64.86.161,在浏览器中查看应用门店管理员。 为“门店”重复相同步骤。

  4. 在门店管理员中,选择产品选项卡,然后选择“添加产品”。

  5. 当 `ai-service`` 成功运行后,应该会在介绍字段旁边看到“询问 OpenAI”按钮。 填写名称、价格和关键字,然后通过选择“询问 OpenAI”>“保存产品”生成产品介绍。

    如何使用 OpenAI 生成产品介绍的屏幕截图。

  6. 现在,可以在卖家使用的“门店管理员”上看到创建的新产品。 在图片中,可以看到添加了“丛林小猴子咀嚼玩具”。

    在“门店管理员”页面查看新产品的屏幕截图。

  7. 还可以在买家使用的“门店”上查看你创建的新产品。 在图片中,可以看到添加了“丛林小猴子咀嚼玩具”。 记得使用 kubectl get service 命令获取门店的 IP 地址。

    在“门店”页面查看新产品的屏幕截图。

后续步骤

现已将 OpenAI 功能添加到 AKS 应用程序,接下来可以通过 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问

若要详细了解生成式 AI 用例,请参阅以下资源: