Skip to main content
NetApp artificial intelligence solutions
简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

在本地使用 Kubernetes 设置 Milvus 集群

本节讨论针对NetApp矢量数据库解决方案的 milvus 集群设置。

在本地使用 Kubernetes 设置 Milvus 集群

客户面临的挑战是在存储和计算上独立扩展、有效的基础设施管理和数据管理,Kubernetes 和矢量数据库共同构成了管理大数据操作的强大、可扩展的解决方案。 Kubernetes 优化资源并管理容器,而矢量数据库则高效处理高维数据和相似性搜索。这种组合能够快速处理大型数据集上的复杂查询,并随着数据量的增加而无缝扩展,使其成为大数据应用程序和人工智能工作负载的理想选择。

  1. 在本节中,我们详细介绍了在 Kubernetes 上安装 Milvus 集群的过程,并利用NetApp存储控制器存储集群数据和客户数据。

  2. 要安装 Milvus 集群,需要持久卷 (PV) 来存储来自各个 Milvus 集群组件的数据。这些组件包括 etcd(三个实例)、pulsar-bookie-journal(三个实例)、pulsar-bookie-ledgers(三个实例)和 pulsar-zookeeper-data(三个实例)。

    备注 在 milvus 集群中,我们可以使用 pulsar 或者 kafka 作为支撑 Milvus 集群可靠存储以及消息流发布/订阅的底层引擎。对于使用 NFS 的 Kafka, NetApp在ONTAP 9.12.1 及更高版本中做出了改进,这些增强功能以及 RHEL 8.7 或 9.1 及更高版本中包含的 NFSv4.1 和 Linux 更改解决了在 NFS 上运行 Kafka 时可能出现的“愚蠢重命名”问题。如果您对使用 NetApp NFS 解决方案运行 Kafka 主题的更多深入信息感兴趣,请查看 -"此链接"
  3. 我们从NetApp ONTAP创建了一个 NFS 卷,并建立了 12 个持久卷,每个卷具有 250GB 的存储空间。存储大小可能因集群大小而异;例如,我们有另一个集群,其中每个 PV 有 50GB。请参阅下面的 PV YAML 文件之一以了解更多详细信息;我们总共有 12 个这样的文件。在每个文件中,storageClassName 设置为“default”,并且存储和路径对于每个 PV 都是唯一的。

    root@node2:~# cat sai_nfs_to_default_pv1.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: karthik-pv1
    spec:
      capacity:
        storage: 250Gi
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: default
      local:
        path: /vectordbsc/milvus/milvus1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - node2
              - node3
              - node4
              - node5
              - node6
    root@node2:~#
  4. 对每个 PV YAML 文件执行“kubectl apply”命令来创建持久卷,然后使用“kubectl get pv”验证其创建

    root@node2:~# for i in $( seq 1 12 ); do kubectl apply -f sai_nfs_to_default_pv$i.yaml; done
    persistentvolume/karthik-pv1 created
    persistentvolume/karthik-pv2 created
    persistentvolume/karthik-pv3 created
    persistentvolume/karthik-pv4 created
    persistentvolume/karthik-pv5 created
    persistentvolume/karthik-pv6 created
    persistentvolume/karthik-pv7 created
    persistentvolume/karthik-pv8 created
    persistentvolume/karthik-pv9 created
    persistentvolume/karthik-pv10 created
    persistentvolume/karthik-pv11 created
    persistentvolume/karthik-pv12 created
    root@node2:~#
  5. 为了存储客户数据,Milvus 支持对象存储解决方案,例如 MinIO、Azure Blob 和 S3。在本指南中,我们使用 S3。以下步骤适用于ONTAP S3 和StorageGRID对象存储。我们使用 Helm 来部署 Milvus 集群。从 Milvus 下载位置下载配置文件 values.yaml。有关我们在本文档中使用的 values.yaml 文件,请参阅附录。

  6. 确保每个部分中的“storageClass”设置为“default”,包括日志、etcd、zookeeper 和 bookkeeper。

  7. 在 MinIO 部分,禁用 MinIO。

  8. 从ONTAP或StorageGRID对象存储创建 NAS 存储桶,并使用对象存储凭据将其包含在外部 S3 中。

    ###################################
    # External S3
    # - these configs are only used when `externalS3.enabled` is true
    ###################################
    externalS3:
      enabled: true
      host: "192.168.150.167"
      port: "80"
      accessKey: "24G4C1316APP2BIPDE5S"
      secretKey: "Zd28p43rgZaU44PX_ftT279z9nt4jBSro97j87Bx"
      useSSL: false
      bucketName: "milvusdbvol1"
      rootPath: ""
      useIAM: false
      cloudProvider: "aws"
      iamEndpoint: ""
      region: ""
      useVirtualHost: false
  9. 在创建 Milvus 集群之前,请确保 PersistentVolumeClaim(PVC)没有任何预先存在的资源。

    root@node2:~# kubectl get pvc
    No resources found in default namespace.
    root@node2:~#
  10. 利用 Helm 和 values.yaml 配置文件安装并启动 Milvus 集群。

    root@node2:~# helm upgrade --install my-release milvus/milvus --set global.storageClass=default  -f values.yaml
    Release "my-release" does not exist. Installing it now.
    NAME: my-release
    LAST DEPLOYED: Thu Mar 14 15:00:07 2024
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    root@node2:~#
  11. 验证 PersistentVolumeClaims (PVC) 的状态。

    root@node2:~# kubectl get pvc
    NAME                                                             STATUS   VOLUME         CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    data-my-release-etcd-0                                           Bound    karthik-pv8    250Gi      RWO            default        3s
    data-my-release-etcd-1                                           Bound    karthik-pv5    250Gi      RWO            default        2s
    data-my-release-etcd-2                                           Bound    karthik-pv4    250Gi      RWO            default        3s
    my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0      Bound    karthik-pv10   250Gi      RWO            default        3s
    my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1      Bound    karthik-pv3    250Gi      RWO            default        3s
    my-release-pulsar-bookie-journal-my-release-pulsar-bookie-2      Bound    karthik-pv1    250Gi      RWO            default        3s
    my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0      Bound    karthik-pv2    250Gi      RWO            default        3s
    my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1      Bound    karthik-pv9    250Gi      RWO            default        3s
    my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-2      Bound    karthik-pv11   250Gi      RWO            default        3s
    my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0   Bound    karthik-pv7    250Gi      RWO            default        3s
    root@node2:~#
  12. 检查 pod 的状态。

    root@node2:~# kubectl get pods -o wide
    NAME                                            READY   STATUS      RESTARTS        AGE    IP              NODE    NOMINATED NODE   READINESS GATES
    <content removed to save page space>

    请确保 Pod 状态为“正在运行”且按预期工作

  13. 测试在 Milvus 和NetApp对象存储中写入和读取数据。

    • 使用“prepare_data_netapp_new.py”Python 程序写入数据。

      root@node2:~# date;python3 prepare_data_netapp_new.py ;date
      Thu Apr  4 04:15:35 PM UTC 2024
      === start connecting to Milvus     ===
      === Milvus host: localhost         ===
      Does collection hello_milvus_ntapnew_update2_sc exist in Milvus: False
      === Drop collection - hello_milvus_ntapnew_update2_sc ===
      === Drop collection - hello_milvus_ntapnew_update2_sc2 ===
      === Create collection `hello_milvus_ntapnew_update2_sc` ===
      === Start inserting entities       ===
      Number of entities in hello_milvus_ntapnew_update2_sc: 3000
      Thu Apr  4 04:18:01 PM UTC 2024
      root@node2:~#
    • 使用“verify_data_netapp.py”Python 文件读取数据。

      root@node2:~# python3 verify_data_netapp.py
      === start connecting to Milvus     ===
      === Milvus host: localhost         ===
      
      Does collection hello_milvus_ntapnew_update2_sc exist in Milvus: True
      {'auto_id': False, 'description': 'hello_milvus_ntapnew_update2_sc', 'fields': [{'name': 'pk', 'description': '', 'type': <DataType.INT64: 5>, 'is_primary': True, 'auto_id': False}, {'name': 'random', 'description': '', 'type': <DataType.DOUBLE: 11>}, {'name': 'var', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 65535}}, {'name': 'embeddings', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 16}}]}
      Number of entities in Milvus: hello_milvus_ntapnew_update2_sc : 3000
      
      === Start Creating index IVF_FLAT  ===
      
      === Start loading                  ===
      
      === Start searching based on vector similarity ===
      
      hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      hit: id: 2600, distance: 0.602496862411499, entity: {'random': 0.3098157043984633}, random field: 0.3098157043984633
      hit: id: 1831, distance: 0.6797959804534912, entity: {'random': 0.6331477114129169}, random field: 0.6331477114129169
      hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
      hit: id: 2524, distance: 0.5918987989425659, entity: {'random': 0.285283165889066}, random field: 0.285283165889066
      hit: id: 264, distance: 0.7254047393798828, entity: {'random': 0.3329096143562196}, random field: 0.3329096143562196
      search latency = 0.4533s
      
      === Start querying with `random > 0.5` ===
      
      query result:
      -{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309, 0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': 0}
      search latency = 0.4476s
      
      === Start hybrid searching with `random > 0.5` ===
      
      hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      hit: id: 1831, distance: 0.6797959804534912, entity: {'random': 0.6331477114129169}, random field: 0.6331477114129169
      hit: id: 678, distance: 0.7351570129394531, entity: {'random': 0.5195484662306603}, random field: 0.5195484662306603
      hit: id: 2644, distance: 0.8620758056640625, entity: {'random': 0.9785952878381153}, random field: 0.9785952878381153
      hit: id: 1960, distance: 0.9083120226860046, entity: {'random': 0.6376039340439571}, random field: 0.6376039340439571
      hit: id: 106, distance: 0.9792704582214355, entity: {'random': 0.9679994241326673}, random field: 0.9679994241326673
      search latency = 0.1232s
      Does collection hello_milvus_ntapnew_update2_sc2 exist in Milvus: True
      {'auto_id': True, 'description': 'hello_milvus_ntapnew_update2_sc2', 'fields': [{'name': 'pk', 'description': '', 'type': <DataType.INT64: 5>, 'is_primary': True, 'auto_id': True}, {'name': 'random', 'description': '', 'type': <DataType.DOUBLE: 11>}, {'name': 'var', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 65535}}, {'name': 'embeddings', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 16}}]}

      基于以上验证,Kubernetes 与矢量数据库的集成,通过使用NetApp存储控制器在 Kubernetes 上部署 Milvus 集群,为客户提供了强大、可扩展且高效的大规模数据操作管理解决方案。此设置为客户提供了处理高维数据和快速高效地执行复杂查询的能力,使其成为大数据应用和人工智能工作负载的理想解决方案。对各种集群组件使用持久卷 (PV),以及从NetApp ONTAP创建单个 NFS 卷,可确保最佳资源利用率和数据管理。验证 PersistentVolumeClaims (PVC) 和 pod 的状态以及测试数据写入和读取的过程为客户提供了可靠且一致的数据操作的保证。使用ONTAP或StorageGRID对象存储客户数据进一步增强了数据的可访问性和安全性。总体而言,这种设置为客户提供了一种有弹性且高性能的数据管理解决方案,可以随着客户不断增长的数据需求而无缝扩展。