使用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分布式服务需要指定bootstrapurl,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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐