你当前正在访问 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 OpenAI 服务,则需使用 Azure OpenAI 服务访问申请表申请访问权限,以在 Azure 订阅上启用该服务。
- 如果计划使用 OpenAI,则请在 OpenAI 网站上进行注册。
先决条件
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
创建资源组
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
已安装。
使用
az aks install-cli
命令在本地安装kubectl
。az aks install-cli
注意
如果基于 Linux 的系统需要提升的权限,可以使用
sudo az aks install-cli
命令。使用
az aks get-credentials
命令将kubectl
配置为连接到你的 Kubernetes 群集。此命令执行以下操作:
- 下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。
- 使用
~/.kube/config
,即 Kubernetes 配置文件的默认位置。 使用 --file 参数指定 Kubernetes 配置文件的其他位置。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
使用
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 门店应用程序清单包含以下 Kubernetes 部署和服务:
- 产品服务:显示产品信息。
- 订单服务:下单。
- Makeline 服务:处理队列中的订单并完成订单。
- 门店:Web 应用程序,供客户查看产品和下单。
- 门店管理员:Web 应用程序,供门店员工查看队列中的订单并管理产品信息。
- 虚拟客户:模拟按日程安排创建订单。
- 虚拟辅助角色:模拟按日程安排完成订单。
- Mongo DB:用于处理持久数据的 NoSQL 实例。
- Rabbit MQ:订单队列的消息队列。
注意
不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 MongoDB 和 Rabbit MQ)。 为简单起见,我们在此使用它们,但建议使用托管服务,例如 Azure CosmosDB 或 Azure 服务总线。
查看应用程序的 YAML 清单。
使用
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 上运行应用程序。
- 填写 Azure OpenAI 服务访问申请表,在 Azure 订阅上启用 Azure OpenAI。
- 在 Azure 门户中创建一个 Azure OpenAI 实例。
- 选择创建的 Azure OpenAI 实例。
- 选择“密钥和终结点”生成密钥。
- 选择“模型部署”>“托管部署”,打开“Azure OpenAI 工作室”。
- 使用“gpt-35-turbo”模型创建新的部署。
如需详细了解如何在 Azure OpenAI 中创建部署,请参阅使用 Azure OpenAI 服务生成文本入门知识。
部署 AI 服务
应用程序已经部署完成,现在可以部署使用 Python 编写的微服务,它使用 OpenAI 自动生成添加到门店目录的新产品介绍。
创建名为
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
将
USE_AZURE_OPENAI
环境变量设置为"True"
。从 Azure OpenAI 工作室获取 Azure OpenAI 部署名称,并填写
AZURE_OPENAI_DEPLOYMENT_NAME
值。选择资源左侧边栏选项卡中的“密钥和终结点”,从 Azure 门户获取 Azure OpenAI 终结点和 Azure OpenAI API 密钥。 相应地更新 YAML 中的
AZURE_OPENAI_ENDPOINT
和OPENAI_API_KEY
。使用
kubectl apply
命令部署应用程序,并指定 YAML 清单的名称。kubectl apply -f ai-service.yaml
以下示例输出显示已成功创建了部署和服务:
deployment.apps/ai-service created service/ai-service created
注意
直接将 API 密钥等敏感信息添加到 Kubernetes 清单文件这种做法并不安全,可能会意外地提交到代码存储库。 为了简单起见,在此处已经添加了敏感信息。 如果是生产工作负荷,请改为使用托管标识对 Azure OpenAI 服务进行身份验证,或将密钥存储在 Azure 密钥保管库中。
测试应用程序
使用 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
若要获取门店管理员 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`` 的服务重复相同步骤。
打开 Web 浏览器,浏览到服务的外部 IP 地址。 在此处显示的示例中,打开 40.64.86.161,在浏览器中查看应用门店管理员。 为“门店”重复相同步骤。
在门店管理员中,选择产品选项卡,然后选择“添加产品”。
当 `ai-service`` 成功运行后,应该会在介绍字段旁边看到“询问 OpenAI”按钮。 填写名称、价格和关键字,然后通过选择“询问 OpenAI”>“保存产品”生成产品介绍。
现在,可以在卖家使用的“门店管理员”上看到创建的新产品。 在图片中,可以看到添加了“丛林小猴子咀嚼玩具”。
还可以在买家使用的“门店”上查看你创建的新产品。 在图片中,可以看到添加了“丛林小猴子咀嚼玩具”。 记得使用
kubectl get service
命令获取门店的 IP 地址。
后续步骤
现已将 OpenAI 功能添加到 AKS 应用程序,接下来可以通过 Azure Kubernetes 服务 (AKS) 保护对 Azure OpenAI 的访问。
若要详细了解生成式 AI 用例,请参阅以下资源: