使用Kubernetes部署流程#

使用Kubernetes部署流程有四个步骤:

  1. 将流程构建为docker格式。

  2. 构建docker镜像。

  3. 创建Kubernetes部署yaml。

  4. 应用部署。

构建一个以docker格式的流程#

请注意,所有依赖的连接必须在构建为docker之前创建。

# create connection if not created before
pf connection create --file ../../../examples/connections/azure_openai.yml --set api_key=<your_api_key> api_base=<your_api_base> --name open_ai_connection

使用以下命令以docker格式构建流程:

pf flow build --source <path-to-your-flow-folder> --output <your-output-dir> --format docker

点击下面的按钮以构建一个docker格式的流程: img

请注意,所有依赖的连接必须在导出为docker之前创建。

Docker 格式文件夹结构#

导出的Dockerfile及其依赖项位于同一文件夹中。结构如下:

  • flow: 该文件夹包含所有的流程文件

  • connections: 该文件夹包含用于创建所有相关连接的yaml文件

  • Dockerfile: 用于构建镜像的dockerfile

  • start.sh: 用于DockerfileCMD的脚本,用于启动服务

  • runit: 该文件夹包含所有的runit脚本

  • settings.json: 一个用于存储docker镜像设置的json文件

  • README.md: 文件的简单介绍

使用Kubernetes部署#

我们将使用web-classification作为示例来展示如何使用Kubernetes进行部署。

请确保您已经创建了流程所需的连接,如果没有,您可以参考为网络分类设置连接

此外,请确保您已安装所有必需的依赖项。您可以参考web-classification的README中的“先决条件”部分,以获取完整的先决条件列表和安装说明。

构建Docker镜像#

与其他Dockerfile一样,您需要先构建镜像。您可以使用任何您想要的名称来标记镜像。在这个例子中,我们使用web-classification-serve

然后运行以下命令:

cd <your-output-dir>
docker build . -t web-classification-serve

创建Kubernetes部署yaml。#

Kubernetes 部署 yaml 文件作为在 Kubernetes pod 中管理您的 docker 容器的指南。它明确指定了重要信息,如容器镜像、端口配置、环境变量和各种设置。下面,您将找到一个简单的部署模板,您可以轻松自定义以满足您的需求。

注意: 你需要首先使用base64对密钥进行编码,并在部署配置中将作为‘open-ai-connection-api-key’输入。例如,你可以在Linux中运行以下命令:

encoded_secret=$(echo -n <your_api_key> | base64)
---
kind: Namespace
apiVersion: v1
metadata:
  name: <your-namespace>
---
apiVersion: v1
kind: Secret
metadata:
  name: open-ai-connection-api-key
  namespace: <your-namespace>
type: Opaque
data:
  open-ai-connection-api-key: <encoded_secret>
---
apiVersion: v1
kind: Service
metadata:
  name: web-classification-service
  namespace: <your-namespace>
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    nodePort: 30123
  selector:
    app: web-classification-serve-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-classification-serve-app
  namespace: <your-namespace>
spec:
  selector:
    matchLabels:
      app: web-classification-serve-app
  template:
    metadata:
      labels:
        app: web-classification-serve-app
    spec:
      containers:
      - name: web-classification-serve-container
        image: <your-docker-image>
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
        env:
        - name: OPEN_AI_CONNECTION_API_KEY
          valueFrom:
            secretKeyRef:
              name: open-ai-connection-api-key
              key: open-ai-connection-api-key

应用部署。#

在部署应用程序之前,请确保您已经设置了一个Kubernetes集群,并且如果尚未安装,请安装kubectl。在本文档中,我们将以Minikube为例。要启动集群,请执行以下命令:

minikube start

一旦您的Kubernetes集群启动并运行,您可以使用以下命令继续部署您的应用程序:

kubectl apply -f deployment.yaml

此命令将创建必要的pod以在集群中运行您的应用程序。

注意: 你需要将下面的替换为你的具体pod_name。你可以通过运行kubectl get pods -n web-classification来获取它。

检索容器的流服务日志#

kubectl logs 命令用于检索在 pod 中运行的容器的日志,这对于调试、监控和排查部署在 Kubernetes 集群中的应用程序非常有用。

kubectl -n <your-namespace> logs <pod-name>

连接#

如果服务涉及连接,所有相关连接将作为yaml文件导出并在容器中重新创建。 连接中的秘密不会直接导出。相反,我们将它们导出为对环境变量的引用:

$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.json
type: open_ai
name: open_ai_connection
module: promptflow.connections
api_key: ${env:OPEN_AI_CONNECTION_API_KEY} # env reference

您需要在容器中设置环境变量以使连接正常工作。

测试端点#

  • 选项1:

    一旦你启动了服务,你可以在本地端口和pod上的端口之间建立连接。这允许你方便地从本地终端测试端点。 要实现这一点,请执行以下命令:

    kubectl port-forward  : -n 
    

    设置好端口转发后,你可以使用curl命令启动端点测试:

    curl http://localhost:/score --data '{"url":"https://play.google.com/store/apps/details?id=com.twitter.android"}' -X POST  -H "Content-Type: application/json"
    
  • 选项2:

    minikube service web-classification-service --url -n 作为一个进程运行,创建一个到集群的隧道。该命令直接将服务暴露给在主机操作系统上运行的任何程序。

    上述命令将检索在Minikube Kubernetes集群内运行的服务的URL(例如 http://:),您可以点击该URL在您的网络浏览器中与流程服务进行交互。或者,您可以使用以下命令测试端点:

    注意: Minikube将使用其自己的外部端口而不是nodePort来监听服务。因此,请将替换为上面获得的端口。

    curl http://localhost:/score --data '{"url":"https://play.google.com/store/apps/details?id=com.twitter.android"}' -X POST  -H "Content-Type: application/json"
    

下一步#