跳到主要内容

用 KubeBlocks 管理 Qdrant

生成式人工智能的爆火引发了人们对向量数据库的关注。目前,KubeBlocks 支持 Qdrant 的管理和运维。

本教程演示了如何通过 kubectl 或 YAML 文件创建并管理 Qdrant 集群。您可在 GitHub 仓库查看相应的 YAML 示例和指南。

开始之前

  • 安装 KubeBlocks

  • 查看可用于创建集群的数据库类型和版本。

    确保 qdrant cluster definition 已安装。如果该 cluster definition 不可用,可参考相关文档启用。

    kubectl get clusterdefinition qdrant
    >
    NAME TOPOLOGIES SERVICEREFS STATUS AGE
    qdrant Available 30m

    查看可用于创建集群的引擎版本。

    kubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=qdrant
  • 为保证资源隔离,本教程将创建一个名为 demo 的独立命名空间。

    kubectl create namespace demo

创建集群

KubeBlocks 通过 Cluster 定义集群。以下是创建 Qdrant 集群的示例。Pod 默认分布在不同节点。但如果您只有一个节点可用于部署集群,可将 spec.affinity.topologyKeys 设置为 null

备注

生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
clusterDefinitionRef: qdrant
clusterVersionRef: qdrant-1.8.1
terminationPolicy: Delete
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
tolerations:
- key: kb-data
operator: Equal
value: 'true'
effect: NoSchedule
componentSpecs:
- name: qdrant
componentDefRef: qdrant
disableExporter: true
serviceAccountName: kb-mycluster
replicas: 2
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
字段定义
spec.clusterDefinitionRef集群定义 CRD 的名称,用来定义集群组件。
spec.clusterVersionRef集群版本 CRD 的名称,用来定义集群版本。
spec.terminationPolicy集群的终止策略,默认值为 Delete,有效值为 DoNotTerminateHaltDeleteWipeOut

- DoNotTerminate 会阻止删除操作。

- Halt 会删除工作负载资源,如 statefulset 和 deployment 等,但是保留了 PVC 。

- DeleteHalt 的基础上进一步删除了 PVC。

- WipeOutDelete 的基础上从备份存储的位置完全删除所有卷快照和快照数据。

spec.affinity为集群的 Pods 定义了一组节点亲和性调度规则。该字段可控制 Pods 在集群中节点上的分布。
spec.affinity.podAntiAffinity定义了不在同一 component 中的 Pods 的反亲和性水平。该字段决定了 Pods 以何种方式跨节点分布,以提升可用性和性能。
spec.affinity.topologyKeys用于定义 Pod 反亲和性和 Pod 分布约束的拓扑域的节点标签值。
spec.tolerations该字段为数组,用于定义集群中 Pods 的容忍,确保 Pod 可被调度到具有匹配污点的节点上。
spec.componentSpecs集群 components 列表,定义了集群 components。该字段允许对集群中的每个 component 进行自定义配置。
spec.componentSpecs.componentDefRef表示 cluster definition 中定义的 component definition 的名称,可通过执行 kubectl get clusterdefinition qdrant -o json \| jq '.spec.componentDefs[].name' 命令获取 component definition 名称。
spec.componentSpecs.name定义了 component 的名称。
spec.componentSpecs.disableExporter定义了是否开启监控功能。
spec.componentSpecs.replicas定义了 component 中 replicas 的数量。
spec.componentSpecs.resources定义了 component 的资源要求。

KubeBlocks operator 监控 Cluster CRD 并创建集群和全部依赖资源。您可执行以下命令获取集群创建的所有资源信息。

kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo

执行以下命令,查看已创建的 Qdrant 集群:

kubectl get cluster mycluster -n demo -o yaml

连接集群

Qdrant 通过 6333 和 6334 端口提供 HTTP 和 gRPC 协议供客户端访问,您可以通过本地主机访问集群。

  1. 通过端口转发服务。

    kubectl port-forward svc/mycluster-qdrant 6333:6333 -n demo
  2. 在新的终端窗口中执行以下命令,连接到数据库。

    curl http://127.0.0.1:6333/collections

    可参考 Qdrant 官方文档 执行集群运维操作。

集群扩缩容

水平扩缩容

水平扩展改变 Pod 的数量。例如,您可以将副本从三个扩展到五个。

从 v0.9.0 开始,除了支持副本(replica)的扩缩容外,KubeBlocks 还支持了实例(instance)的扩缩容。可通过 水平扩缩容 文档了解更多细节和示例。

开始之前

确保集群处于 Running 状态,否则以下操作可能会失败。

kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster qdrant qdrant-1.8.1 Delete Running 47m

步骤

可通过以下两种方式实现水平扩缩容。

  1. 对指定的集群应用 OpsRequest,可根据您的需求配置参数。

    以下示例演示了增加 2 个副本。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-horizontal-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: HorizontalScaling
    horizontalScaling:
    - componentName: qdrant
    scaleOut:
    replicaChanges: 2
    EOF

    如果您想要缩容,可将 scaleOut 替换为 scaleIn

    以下示例演示了删除 2 个副本。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-horizontal-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: HorizontalScaling
    horizontalScaling:
    - componentName: qdrant
    scaleIn:
    replicaChanges: 2
    EOF
  2. 查看运维操作状态,验证水平扩缩容是否成功。

    kubectl get ops -n demo
    >
    NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
    demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m

    如果有报错,可执行 kubectl describe ops -n demo 命令查看该运维操作的相关事件,协助排障。

  3. 查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo

处理快照异常

如果在水平扩容过程中出现 STATUS=ConditionsError,你可以从 cluster.status.condition.message 中找到原因并进行故障排除。如下所示,该例子中发生了快照异常。

Status:
conditions:
- lastTransitionTime: "2024-04-25T17:40:26Z"
message: VolumeSnapshot/mycluster-qdrant-scaling-dbqgp: Failed to set default snapshot
class with error cannot find default snapshot class
reason: ApplyResourcesFailed
status: "False"
type: ApplyResources

原因

此异常发生的原因是未配置 VolumeSnapshotClass。可以通过配置 VolumeSnapshotClass 解决问题。

但此时,水平扩容仍然无法继续运行。这是因为错误的备份(volumesnapshot 由备份生成)和之前生成的 volumesnapshot 仍然存在。需删除这两个错误的资源,KubeBlocks 才能重新生成新的资源。

步骤:

  1. 配置 VolumeSnapshotClass。

    kubectl create -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
    name: csi-aws-vsc
    annotations:
    snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: ebs.csi.aws.com
    deletionPolicy: Delete
    EOF
  2. 删除错误的备份和 volumesnapshot 资源。

    kubectl delete backup -l app.kubernetes.io/instance=mycluster

    kubectl delete volumesnapshot -l app.kubernetes.io/instance=mycluster

结果

删除备份和 volumesnapshot 后,水平扩容继续进行,集群恢复到 Running 状态。

垂直扩缩容

您可以通过更改资源需求和限制(例如 CPU 和存储)来实现集群垂直扩缩容。例如,您可以通过垂直扩缩容将资源类别从 1C2G 更改为 2C4G。

开始之前

检查集群状态是否为 Running。否则,后续操作可能会失败。

kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster qdrant qdrant-1.8.1 Delete Running 47m

步骤

可通过以下两种方式实现垂直扩缩容。

  1. 对指定的集群应用 OpsRequest,可根据您的需求配置参数。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-vertical-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: VerticalScaling
    verticalScaling:
    - componentName: qdrant
    requests:
    memory: "2Gi"
    cpu: "1"
    limits:
    memory: "4Gi"
    cpu: "2"
    EOF
  2. 查看运维任务状态,验证垂直扩缩容操作是否成功。

    kubectl get ops -n demo
    >
    NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
    demo ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m

    如果有报错,可执行 kubectl describe ops -n demo 命令查看该运维操作的相关事件,协助排障。

  3. 查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo

磁盘扩容

开始之前

确保集群处于 Running 状态,否则后续操作可能会失败。

kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster qdrant qdrant-1.8.1 Delete Running 4m29s

步骤

当前支持通过以下两种方式扩容磁盘。

  1. 应用 OpsRequest。根据需求更改 storage 的值,并执行以下命令来更改集群的存储容量。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-volume-expansion
    namespace: demo
    spec:
    clusterName: mycluster
    type: VolumeExpansion
    volumeExpansion:
    - componentName: qdrant
    volumeClaimTemplates:
    - name: data
    storage: "40Gi"
    EOF
  2. 验证磁盘扩容操作是否成功。

    kubectl get ops -n demo
    >
    NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
    demo ops-volume-expansion VolumeExpansion mycluster Succeed 3/3 6m

    如果操作过程中出现报错,可通过 kubectl describe ops -n demo 查看该操作的事件,协助排障。

  3. 查看对应的集群资源是否变更。

    kubectl describe cluster mycluster -n demo

停止/启动集群

您可以停止/启动集群以释放计算资源。当集群停止时,其计算资源将被释放,也就是说 Kubernetes 的 Pod 将被释放,但其存储资源仍将被保留。如果你想恢复集群资源,可通过快照重新启动集群。

停止集群

您可通过创建 OpsRequest 或修改集群 YAML 文件来停止集群。

执行以下命令,停止集群。

kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-stop
namespace: demo
spec:
clusterName: mycluster
type: Stop
EOF

启动集群

您可通过创建 OpsRequest 或修改集群 YAML 文件来启动集群。

执行以下命令,启动集群。

kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-start
namespace: demo
spec:
clusterName: mycluster
type: Start
EOF

备份恢复

Qdrant 的备份恢复功能与其他集群相同,可参考备份恢复文档查看具体操作。