文档API 参考📓 教程🧑‍🍳 菜谱🤝 集成💜 Discord🎨 Studio
文档

Kubernetes

了解如何在 Kubernetes 中部署您的 Haystack 流水线。

在 Kubernetes 等容器编排器中将 Haystack 作为工作负载运行的最佳方式是创建一个服务来暴露一个或多个 Hayhooks 实例。

使用 Hayhooks 创建 Haystack Kubernetes 服务

作为第一步,我们建议创建一个本地 KinDMinikube Kubernetes 集群。您可以从 CLI 管理您的集群,但像 k9sLens 这样的工具可以简化此过程。

完成后,从一个运行单个 Hayhooks Pod 的非常简单的 Kubernetes 服务开始。

kind: Pod
apiVersion: v1
metadata:
  name: hayhooks
  labels:
    app: haystack
spec:
  containers:
    - image: deepset/hayhooks:v0.6.0
      name: hayhooks
      imagePullPolicy: IfNotPresent
      resources:
        limits:
          memory: "512Mi"
          cpu: "500m"
        requests:
          memory: "256Mi"
          cpu: "250m"

---

kind: Service
apiVersion: v1
metadata:
  name: haystack-service
spec:
  selector:
    app: haystack
  type: ClusterIP
  ports:
    # Default port used by the Hayhooks Docker image
    - port: 1416

将上述内容应用到现有 Kubernetes 集群后,一个hayhooks Pod 将显示为一个名为haystack-service.

请注意,上面定义的Service 类型为ClusterIP。这意味着它只在 Kubernetes 集群*内部*暴露。要将 Hayhooks API 也暴露到*外部*世界,您需要一个NodePortIngress 资源。作为替代方案,也可以使用 端口转发 来本地访问Service

为此,请将端口30080 添加到我们的 KinD 集群的主机到节点映射中。换句话说,确保集群是使用类似于以下内容的节点配置创建的

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    # ...
    extraPortMappings:
      - containerPort: 30080
        hostPort: 30080
        protocol: TCP

然后,创建一个简单的NodePort 来测试 Hayhooks Pod 是否正常运行

apiVersion: v1
kind: Service
metadata:
  name: haystack-nodeport
spec:
  selector:
    app: haystack
  type: NodePort
  ports:
  - port: 1416
    targetPort: 1416
    nodePort: 30080
    name: http

应用此配置后,hayhooks Pod 将可以通过localhost:30080.

从此,您应该能够管理流水线。请记住,可以在单个 Hayhooks 实例上部署多个不同的流水线。有关更多详细信息,请查看 Hayhooks 文档

在 Pod 启动时自动运行流水线

Hayhooks 可以在启动时加载 Haystack 流水线,使它们在服务器启动时立即可用。您可以利用此机制让您的 Pod 在启动时立即提供一个或多个流水线。

在启动时,它将查找在HAYHOOKS_PIPELINES_DIR 中指定的路径上部署的流水线,然后加载它们。

部署的流水线 本质上是一个目录,其中必须包含一个pipeline_wrapper.py 文件以及可能存在的其他文件。要预加载一个 示例流水线,您需要将本地文件夹挂载到集群节点内部,然后使其在 Hayhooks Pod 上也可用。

首先,确保本地文件夹已正确挂载到 KinD 集群节点上的/data:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    # ...
    extraMounts:
      - hostPath: /path/to/local/pipelines/folder
        containerPath: /data

接下来,将/data 作为卷提供,并将其挂载到 Hayhooks Pod 上。为此,请将您之前的 Pod 配置更新为以下内容

kind: Pod
apiVersion: v1
metadata:
  name: hayhooks
  labels:
    app: haystack
spec:
  containers:
    - image: deepset/hayhooks:v0.6.0
      name: hayhooks
      imagePullPolicy: IfNotPresent
      command: ["/bin/sh", "-c"]
      args:
        - |
          pip install trafilatura && \
          hayhooks run --host 0.0.0.0
      volumeMounts:
        - name: local-data
          mountPath: /mnt/data
      env:
        - name: HAYHOOKS_PIPELINES_DIR
          value: /mnt/data
        - name: OPENAI_API_KEY
          valueFrom:
            secretKeyRef:
              name: openai-secret
              key: api-key
      resources:
        limits:
          memory: "512Mi"
          cpu: "500m"
        requests:
          memory: "256Mi"
          cpu: "250m"
  volumes:
    - name: local-data
      hostPath:
        path: /data
        type: Directory

请注意,

  • 我们更改了 Hayhooks 容器的command,以便在启动前安装trafilaura 依赖项,因为我们的 chat_with_website 示例流水线需要它。对于真实的生产环境,我们建议创建自定义 Hayhooks 镜像,如此处所述。
  • 我们让 Hayhooks 容器从 Kubernetes Secret 读取OPENAI_API_KEY

在应用此新配置之前,创建openai-secret:

apiVersion: v1
kind: Secret
metadata:
  name: openai-secret
type: Opaque
data:
  # Replace the placeholder below with the base64 encoded value of your API key
  # Generate it using: echo -n $OPENAI_API_KEY | base64
  api-key: YOUR_BASE64_ENCODED_API_KEY_HERE

应用此配置后,检查您的 Hayhooks Pod 日志,您将看到chat_with_website 流水线已经部署。

推出多个 Pod

Haystack 流水线通常是无状态的,这非常适合将请求分发到运行相同流水线的多个 Pod。让我们将单 Pod 配置转换为实际的 Kubernetes部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: haystack-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: haystack
  template:
    metadata:
      labels:
        app: haystack
    spec:
      initContainers:
        - name: install-dependencies
          image: python:3.12-slim
          workingDir: /mnt/data
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "Installing dependencies..."
              pip install trafilatura
              echo "Dependencies installed successfully!"
              touch /mnt/data/init-complete
          volumeMounts:
            - name: local-data
              mountPath: /mnt/data
          resources:
            requests:
              memory: "64Mi"
              cpu: "100m"
            limits:
              memory: "128Mi"
              cpu: "250m"
      containers:
        - image: deepset/hayhooks:v0.6.0
          name: hayhooks
          imagePullPolicy: IfNotPresent
          command: ["/bin/sh", "-c"]
          args:
            - |
              pip install trafilatura && \
              hayhooks run --host 0.0.0.0
          ports:
            - containerPort: 1416
              name: http
          volumeMounts:
            - name: local-data
              mountPath: /mnt/data
          env:
            - name: HAYHOOKS_PIPELINES_DIR
              value: /mnt/data
            - name: OPENAI_API_KEY
              valueFrom:
                secretKeyRef:
                  name: openai-secret
                  key: api-key
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"
      volumes:
        - name: local-data
          hostPath:
            path: /data
            type: Directory

实施上述配置将创建三个 Pod。每个 Pod 都将运行一个不同的 Hayhooks 实例,所有实例都提供前面示例中通过挂载卷提供的相同示例流水线。

请注意,上面定义的您之前创建的NodePort现在将充当负载均衡器,并将传入请求分发到三个 Hayhooks Pod。