Kubernetes
了解如何在 Kubernetes 中部署您的 Haystack 流水线。
在 Kubernetes 等容器编排器中将 Haystack 作为工作负载运行的最佳方式是创建一个服务来暴露一个或多个 Hayhooks 实例。
使用 Hayhooks 创建 Haystack Kubernetes 服务
作为第一步,我们建议创建一个本地 KinD 或 Minikube Kubernetes 集群。您可以从 CLI 管理您的集群,但像 k9s 或 Lens 这样的工具可以简化此过程。
完成后,从一个运行单个 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 也暴露到*外部*世界,您需要一个NodePort
或Ingress
资源。作为替代方案,也可以使用 端口转发 来本地访问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。
更新于 3 个月前