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

### Kubernetes部署分布式 MinIO #### 使用 MinIO Operator 部署 对于 Kubernetes 版本大于等于 1.21.0 的环境,推荐使用 MinIO Operator 来管理 MinIO 实例的生命周期。Operator 提供了一种简便的方法来创建、配置和管理多个 MinIO 租户。 首先,需下载适合当前 Kubernetes 版本的 MinIO Operator 安装包[^2]: ```bash kubectl apply -f https://github.com/minio/operator/releases/download/v5.07/minio-operator.yaml ``` 接着,在集群内安装并初始化 MinIO Operator 后,可以通过自定义资源 (CRD) 创建新的 MinIO 租户实例。 #### 利用 Helm Chart 进行部署 另一种常见的方法是通过 Helm Chart 方式快速部署 MinIO。此过程涉及添加官方 Bitnami 或其他可信源作为 Helm 仓库,并执行相应的命令完成安装操作[^3]。 向本地 Helm 添加 MinIO Chart 库: ```bash helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update ``` 随后可以选择启用 TLS 加密通信的安全模式或是简化设置的标准模式来进行实际部署工作。例如,要启动带有自动生成证书功能的服务端点,则可以运行如下指令: ```bash helm install my-minio bitnami/minio \ --namespace minio-system \ --create-namespace \ --set persistence.size=10Gi \ --set rootUser=admin \ --set rootPassword=password \ --set defaultBucketPolicy=readWrite \ --set mode=distributed \ --set replicaCount=4 \ --set resources.requests.memory="512Mi" \ --set resources.requests.cpu="500m" ``` 上述命令设置了持久化卷大小为 10GB,指定了管理员账户信息,默认桶权限策略以及副本数量等参数,确保了高可用性和性能优化。 为了使外部能够访问到 MinIO 控制台和服务接口,还需要额外配置 `NodePort` 类型的服务对象[^4]: ```yaml apiVersion: v1 kind: Service metadata: name: minio-nodeport spec: selector: app.kubernetes.io/name: minio ports: - protocol: TCP port: 9000 targetPort: 9000 nodePort: 30000 # 可选字段,指定暴露给用户的端口号 name: http - protocol: TCP port: 9001 targetPort: 9001 nodePort: 30001 # 可选字段,指定暴露给用户的控制台端口号 name: console type: NodePort ``` 以上 YAML 文件定义了一个服务实体,它会监听两个不同的端口分别用于 HTTP 请求处理和 Web UI 访问目的。请注意调整 `selector` 字段中的标签匹配规则以便正确关联目标 Pod 资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值