使用K8S部署分布式qdrant向量召回服务
使用K8S部署Qdrant分布式服务。
·
使用K8S部署分布式qdrant向量召回服务里
Qdrant集群部署说明
从 v0.8.0 版本开始,Qdrant 支持分布式部署的实验模式。在这种模式下,多个 Qdrant 服务相互通信以在对等方之间分发数据,以扩展存储能力并提高稳定性。
要启用分布式部署 - 在配置中启用集群模式:
cluster:
consensus:
tick_period_ms: 100
enabled: true
p2p:
port: 6335
说明:在默认配置下,Qdrant 将使用端口6335进行内部通信。所有对等点都应该可以从集群内部访问此端口,但请确保将此端口与外部访问隔离,因为它可能用于执行写入操作。
此外,应该向集群的第一个对等节点提供其 URL,以便它可以告诉其他节点应该如何到达它。使用uriCLI 参数向对等方提供 URL:
./qdrant --uri 'http://qdrant_node_1:6335'
集群中的后续节点必须至少知道现有集群的一个节点,才能通过它与集群的其余部分进行同步。为此,需要为它们提供引导 URL:
./qdrant --bootstrap 'http://qdrant_node_1:6335'
使用K8S部署Qdrant分布式服务
通过上面的说明我们知道qdrant分布式服务需要指定bootstrap
和url
,qdrant服务我们通过有状态控制器来部署,可以使用脚本来判断当前服务副本数量,先定义一个configmap定义判断脚本和配置文件:
# https://qdrant.tech/documentation/distributed_deployment/
apiVersion: v1
kind: ConfigMap
metadata:
name: qdrant-config
data:
initialize.sh: |
#!/bin/sh
SET_INDEX=${HOSTNAME##*-}
echo "Starting initializing for pod $SET_INDEX"
if [ "$SET_INDEX" = "0" ]; then
./qdrant --uri 'http://qdrant-0.qdrant-headless:6335'
else
./qdrant --bootstrap 'http://qdrant-0.qdrant-headless:6335' --uri 'http://qdrant-'"$SET_INDEX"'.qdrant-headless:6335'
fi
production.yaml: |
cluster:
consensus:
tick_period_ms: 100
enabled: true
p2p:
port: 6335
具体的部署文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: qdrant
labels:
app: qdrant
app.kubernetes.io/name: qdrant
app.kubernetes.io/instance: qdrant
app.kubernetes.io/version: "0.9.1"
spec:
replicas: 3
selector:
matchLabels:
app: qdrant
app.kubernetes.io/name: qdrant
app.kubernetes.io/instance: qdrant
serviceName: qdrant-headless
template:
metadata:
labels:
app: qdrant
app.kubernetes.io/name: qdrant
app.kubernetes.io/instance: qdrant
spec:
containers:
- name: qdrant
image: "qdrant/qdrant:v0.9.1"
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c"]
args: ["./config/initialize.sh"]
ports:
- name: rest
containerPort: 6333
protocol: TCP
- name: grpc
containerPort: 6334
protocol: TCP
- name: p2p
containerPort: 6335
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 6333
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 6333
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
resources:
limits:
memory: 2048Mi
requests:
cpu: 100m
memory: 128Mi
volumeMounts:
- name: qdrant-storage
mountPath: /qdrant/storage
- name: qdrant-config
mountPath: /qdrant/config/initialize.sh
subPath: initialize.sh
- name: qdrant-config
mountPath: /qdrant/config/production.yaml
subPath: production.yaml
volumes:
- name: qdrant-config
configMap:
name: qdrant-config
defaultMode: 0755
volumeClaimTemplates:
- metadata:
name: qdrant-storage
labels:
app: qdrant
spec:
# 通过存储类来提供动态PV卷
storageClassName: ali-csi
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "20Gi"
定义一个无头服务文件,供集群访问
apiVersion: v1
kind: Service
metadata:
name: qdrant-headless
labels:
app: qdrant
app.kubernetes.io/name: qdrant
app.kubernetes.io/instance: qdrant
app.kubernetes.io/version: "0.9.1"
spec:
clusterIP: None
ports:
- name: rest
port: 6333
targetPort: 6333
protocol: TCP
- name: grpc
port: 6334
targetPort: 6334
protocol: TCP
- name: p2p
port: 6335
targetPort: 6335
protocol: TCP
selector:
app: qdrant
app.kubernetes.io/name: qdrant
app.kubernetes.io/instance: qdrant
更多推荐
已为社区贡献2条内容
所有评论(0)