跳到主要内容

用 KubeBlocks 管理 Milvus

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

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

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

开始之前

创建集群

步骤:

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

备注

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

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
terminationPolicy: Delete
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
tenancy: SharedNode
tolerations:
- key: kb-data
operator: Equal
value: 'true'
effect: NoSchedule
componentSpecs:
- name: proxy
componentDef: milvus-proxy-0.9.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
serviceRefs:
- cluster: etcdm-cluster
name: milvus-meta-storage
- cluster: pulsarm-cluster
name: milvus-log-storage
- name: milvus-object-storage
namespace: default
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
- name: mixcoord
componentDef: milvus-mixcoord-0.9.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
serviceRefs:
- cluster: etcdm-cluster
name: milvus-meta-storage
- cluster: pulsarm-cluster
name: milvus-log-storage
- name: milvus-object-storage
namespace: default
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
- name: datanode
componentDef: milvus-datanode-0.9.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
serviceRefs:
- cluster: etcdm-cluster
name: milvus-meta-storage
- cluster: pulsarm-cluster
name: milvus-log-storage
- name: milvus-object-storage
namespace: default
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
- name: indexnode
componentDef: milvus-indexnode-0.9.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
serviceRefs:
- cluster: etcdm-cluster
name: milvus-meta-storage
- cluster: pulsarm-cluster
name: milvus-log-storage
- name: milvus-object-storage
namespace: default
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
- name: querynode
componentDef: milvus-querynode-0.9.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
serviceRefs:
- cluster: etcdm-cluster
name: milvus-meta-storage
- cluster: pulsarm-cluster
name: milvus-log-storage
- name: milvus-object-storage
namespace: default
clusterServiceSelector:
cluster: miniom-cluster
service:
component: minio
service: headless
port: http
credential:
component: minio
name: admin
---
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: etcdm-cluster
namespace: demo
spec:
clusterDefinitionRef: etcd
clusterVersionRef: etcd-v3.5.6
terminationPolicy: WipeOut
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
tenancy: SharedNode
tolerations:
- key: kb-data
operator: Equal
value: 'true'
effect: NoSchedule
componentSpecs:
- name: etcd
componentDefRef: etcd
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
volumeClaimTemplates:
- name: data
spec:
storageClassName: null
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: pulsarm-cluster
namespace: demo
annotations:
"kubeblocks.io/extra-env": '{"KB_PULSAR_BROKER_NODEPORT": "false"}'
spec:
clusterDefinitionRef: pulsar
clusterVersionRef: pulsar-3.0.2
terminationPolicy: WipeOut
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
tenancy: SharedNode
tolerations:
- key: kb-data
operator: Equal
value: 'true'
effect: NoSchedule
componentSpecs:
- name: pulsar-broker
componentDefRef: pulsar-broker
disableExporter: true
replicas: 1
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
- name: bookies
componentDefRef: bookies
disableExporter: true
replicas: 3
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
volumeClaimTemplates:
- name: journal
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- name: ledgers
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- name: zookeeper
componentDefRef: zookeeper
disableExporter: true
replicas: 3
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
---
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: miniom-cluster
namespace: demo
spec:
terminationPolicy: WipeOut
componentSpecs:
- name: minio
componentDef: milvus-minio-0.9.0
replicas: 1
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.terminationPolicy集群的终止策略,默认值为 Delete,有效值为 DoNotTerminateHaltDeleteWipeOut。具体定义可参考 终止策略
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 milvus -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

执行以下命令,查看已创建的 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 禁止删除操作。
HaltHalt 删除集群资源(如 Pods、Services 等),但保留 PVC。停止其他运维操作的同时,保留了数据。但 Halt 策略在 v0.9.1 中已删除,设置为 Halt 的效果与 DoNotTerminate 相同。
DeleteDeleteHalt 的基础上,删除 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