跳到主要内容

用 KubeBlocks 管理 Milvus

生成式人工智能的爆火引发了人们对向量数据库的关注。目前,KubeBlocks 支持 Milvus 的管理和运维。本文档展示如何使用 KubeBlocks 管理 Milvus。

Milvus 是高度灵活、可靠且速度极快的云原生开源矢量数据库。它为 embedding 相似性搜索和 AI 应用程序提供支持,并努力使每个组织都可以访问矢量数据库。 Milvus 可以存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的十亿级别以上的 embedding 向量。

本文档展示了如何通过 kbcli、kubectl 或 YAML 文件等当时创建和管理 Milvus 集群。您可以在 GitHub 仓库查看 YAML 示例。

开始之前

创建集群

步骤:

KubeBlocks 通过 Cluster 定义集群。以下是创建 Milvus 集群的示例。Pod 默认分布在不同节点。如果您只有一个节点可用于部署多副本集群,可设置 spec.schedulingPolicyspec.componentSpecs.schedulingPolicy,具体可参考 API 文档。但生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
namespace: demo
name: mycluster
spec:
terminationPolicy: Delete
clusterDef: milvus
topology: cluster
componentSpecs:
- name: proxy
replicas: 1
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
serviceRefs:
- name: milvus-meta-storage
namespace: demo
clusterServiceSelector:
cluster: etcdm-cluster
service:
component: etcd
service: headless
port: client
- name: milvus-log-storage
namespace: demo
clusterServiceSelector:
cluster: pulsarm-cluster
service:
component: broker
service: headless
port: pulsar
- name: milvus-object-storage
namespace: demo
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
disableExporter: true
- name: mixcoord
replicas: 1
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
serviceRefs:
- name: milvus-meta-storage
namespace: demo
clusterServiceSelector:
cluster: etcdm-cluster
service:
component: etcd
service: headless
port: client

- name: milvus-log-storage
namespace: demo
clusterServiceSelector:
cluster: pulsarm-cluster
service:
component: broker
service: headless
port: pulsar

- name: milvus-object-storage
namespace: demo
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin

disableExporter: true
- name: datanode
replicas: 1
disableExporter: true
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
serviceRefs:
- name: milvus-meta-storage
namespace: demo
clusterServiceSelector:
cluster: etcdm-cluster
service:
component: etcd
service: headless
port: client

- name: milvus-log-storage
namespace: demo
clusterServiceSelector:
cluster: pulsarm-cluster
service:
component: broker
service: headless
port: pulsar

- name: milvus-object-storage
namespace: demo
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin

disableExporter: true
- name: indexnode
replicas: 1
disableExporter: true
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
serviceRefs:
- name: milvus-meta-storage
namespace: demo
clusterServiceSelector:
cluster: etcdm-cluster
service:
component: etcd
service: headless
port: client

- name: milvus-log-storage
namespace: demo
clusterServiceSelector:
cluster: pulsarm-cluster
service:
component: broker
service: headless
port: pulsar

- name: milvus-object-storage
namespace: demo
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin

disableExporter: true
- name: querynode
replicas: 1
disableExporter: true
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
serviceRefs:
- name: milvus-meta-storage
namespace: demo
clusterServiceSelector:
cluster: etcdm-cluster
service:
component: etcd
service: headless
port: client

- name: milvus-log-storage
namespace: demo
clusterServiceSelector:
cluster: pulsarm-cluster
service:
component: broker
service: headless
port: pulsar

- name: milvus-object-storage
namespace: demo
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin

disableExporter: true
EOF
字段定义
spec.terminationPolicy集群终止策略,有效值为 DoNotTerminateDeleteWipeOut。具体定义可参考 终止策略
spec.clusterDef指定了创建集群时要使用的 ClusterDefinition 的名称。注意请勿更新此字段。创建 Milvus 集群时,该值必须为 milvus
spec.topology指定了在创建集群时要使用的 ClusterTopology 的名称。可选值为[standalone, cluster]。
spec.componentSpecs集群 component 列表,定义了集群 components。该字段支持自定义配置集群中每个 component。
spec.componentSpecs.serviceRefs定义了 component 的 ServiceRef 列表。
spec.componentSpecs.serviceRefs.name指定了服务引用声明的标识符,该标识符在 componentDefinition.spec.serviceRefDeclarations[*].name 中定义。
spec.componentSpecs.serviceRefs.clusterServiceSelector引用了另一个 KubeBlocks 集群提供的服务。
spec.componentSpecs.serviceRefs.clusterServiceSelector.cluster定义了集群名称,您可以按需修改。
spec.componentSpecs.serviceRefs.clusterServiceSelector.service.component定义了组件名称。
spec.componentSpecs.serviceRefs.clusterServiceSelector.service.service引用了默认的无头服务(headless Service)。
spec.componentSpecs.serviceRefs.clusterServiceSelector.service.port引用了端口名称。
spec.componentSpecs.serviceRefs.clusterServiceSelector.credential指定了用于验证并与被引用集群建立连接的系统账号(SystemAccount)。
spec.componentSpecs.serviceRefs.clusterServiceSelector.credential.name指定了要引用的凭证(SystemAccount)名称,本例中使用 'admin' 账号。
spec.componentSpecs.disableExporter定义了是否在 component 无头服务(headless service)上标注指标 exporter 信息,是否开启监控 exporter。有效值为 [true, false]。
spec.componentSpecs.replicas定义了 component 中 replicas 的数量。
spec.componentSpecs.resources定义了 component 的资源要求。

您可参考 API 文档,查看更多 API 字段及说明。

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

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

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

kubectl get cluster mycluster -n demo -o yaml

扩缩容

当前,KubeBlocks 支持垂直扩缩容 Milvus 集群。

开始之前

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

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

步骤

  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: milvus
    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. 当 OpsRequest 状态为 Succeed 或集群状态再次回到 Running 后,查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo

磁盘扩容

开始之前

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

kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster milvus-2.3.2 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: milvus
    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. 当 OpsRequest 状态为 Succeed 或集群状态再次回到 Running 后,查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo

重启

  1. 执行以下命令,重启集群。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-restart
    namespace: demo
    spec:
    clusterName: mycluster
    type: Restart
    restart:
    - componentName: milvus
    EOF
  2. 查看 pod 和运维操作状态,验证重启操作是否成功。

    kubectl get pod -n demo

    kubectl get ops ops-restart -n demo

    重启过程中,Pod 有如下两种状态:

    • STATUS=Terminating:表示集群正在重启。
    • STATUS=Running:表示集群已重启。

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

停止/启动集群

您可以停止/启动集群以释放计算资源。停止集群后,其计算资源将被释放,也就是说 Kubernetes 的 Pod 将被释放,但其存储资源仍将被保留。您也可以重新启动该集群,使其恢复到停止集群前的状态。

停止集群

  1. 配置集群名称,并执行以下命令来停止该集群。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-stop
    namespace: demo
    spec:
    clusterName: mycluster
    type: Stop
    EOF
  2. 查看集群状态,确认集群是否已停止。

    kubectl get cluster mycluster -n demo

启动集群

  1. 配置集群名称,并执行以下命令来启动该集群。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-start
    namespace: demo
    spec:
    clusterName: mycluster
    type: Start
    EOF
  2. 查看集群状态,确认集群是否已再次运行。

    kubectl get cluster mycluster -n demo

删除集群

终止策略

备注

终止策略决定了删除集群的方式。

终止策略删除操作
DoNotTerminateDoNotTerminate 禁止删除操作。
DeleteDelete 删除 Pod、服务、PVC 等集群资源,删除所有持久数据。
WipeOutWipeOut 删除所有集群资源,包括外部存储中的卷快照和备份。使用该策略将会删除全部数据,特别是在非生产环境,该策略将会带来不可逆的数据丢失。请谨慎使用。

执行以下命令查看终止策略。

kubectl -n demo get cluster mycluster
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster milvus-2.3.2 Delete Running 29m

步骤

执行以下命令,删除集群。

kubectl delete cluster mycluster -n demo

如果想删除集群和所有相关资源,可以将终止策略修改为 WipeOut,然后再删除该集群。

kubectl patch -n demo cluster mycluster -p '{"spec":{"terminationPolicy":"WipeOut"}}' --type="merge"

kubectl delete -n demo cluster mycluster