Skip to main content
NetApp artificial intelligence solutions
日本語は機械翻訳による参考訳です。内容に矛盾や不一致があった場合には、英語の内容が優先されます。

オンプレミスでの Kubernetes を使用した Milvus クラスターのセットアップ

共同作成者 kevin-hoke

このセクションでは、 NetAppのベクトル データベース ソリューション用の milvus クラスターのセットアップについて説明します。

オンプレミスでの Kubernetes を使用した Milvus クラスターのセットアップ

ストレージとコンピューティングを独立して拡張し、効果的なインフラストラクチャ管理とデータ管理を行うという顧客の課題に対し、Kubernetes とベクター データベースを組み合わせることで、大規模なデータ操作を管理するための強力でスケーラブルなソリューションが実現します。 Kubernetes はリソースを最適化し、コンテナを管理し、ベクトル データベースは高次元データと類似性検索を効率的に処理します。この組み合わせにより、大規模なデータセットに対する複雑なクエリを迅速に処理し、増大するデータ量に合わせてシームレスに拡張できるため、ビッグデータ アプリケーションや AI ワークロードに最適です。

  1. このセクションでは、クラスター データと顧客データの両方にNetAppストレージ コントローラーを利用して、Kubernetes に Milvus クラスターをインストールするプロセスについて詳しく説明します。

  2. Milvus クラスターをインストールするには、さまざまな Milvus クラスター コンポーネントからのデータを保存するための永続ボリューム (PV) が必要です。これらのコンポーネントには、etcd (インスタンス 3 つ)、pulsar-bookie-journal (インスタンス 3 つ)、pulsar-bookie-ledgers (インスタンス 3 つ)、pulsar-zookeeper-data (インスタンス 3 つ) が含まれます。

    メモ Milvus クラスターでは、Milvus クラスターの信頼性の高いストレージとメッセージ ストリームの公開/サブスクリプションをサポートする基盤エンジンとして、Pulsar または Kafka のいずれかを使用できます。 NFS を使用した Kafka については、 NetApp はONTAP 9.12.1 以降で改善を行っており、これらの機能強化と、RHEL 8.7 または 9.1 以降に含まれる NFSv4.1 および Linux の変更により、NFS 経由で Kafka を実行するときに発生する可能性がある「silly rename」問題が解決されています。NetApp NFS ソリューションを使用した Kafka の実行に関する詳細情報については、以下を参照してください。"このリンク" 。
  3. NetApp ONTAPから単一の NFS ボリュームを作成し、それぞれ 250 GB のストレージを持つ 12 個の永続ボリュームを確立しました。ストレージ サイズはクラスターのサイズに応じて異なります。たとえば、各 PV が 50 GB である別のクラスターがあります。詳細については、以下の PV YAML ファイルの 1 つを参照してください。このようなファイルは合計 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オブジェクト ストアの両方に適用されます。 Milvus クラスターをデプロイするには Helm を使用します。 Milvus のダウンロード場所から構成ファイル values.yaml をダウンロードします。このドキュメントで使用した values.yaml ファイルについては、付録を参照してください。

  6. ログ、etcd、zookeeper、bookkeeper などの各セクションで、「storageClass」が「default」に設定されていることを確認します。

  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. ポッドのステータスを確認します。

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

    ポッドのステータスが「実行中」であり、期待どおりに動作していることを確認してください。

  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}}]}

      上記の検証に基づき、 NetAppストレージ コントローラを使用して Kubernetes 上に Milvus クラスタを展開することで実証されているように、Kubernetes とベクトル データベースを統合すると、大規模なデータ操作を管理するための堅牢でスケーラブルかつ効率的なソリューションが顧客に提供されます。このセットアップにより、顧客は高次元データを処理し、複雑なクエリを迅速かつ効率的に実行できるようになるため、ビッグデータ アプリケーションや AI ワークロードに最適なソリューションになります。さまざまなクラスター コンポーネントに永続ボリューム (PV) を使用し、 NetApp ONTAPから単一の NFS ボリュームを作成することで、最適なリソース使用率とデータ管理が保証されます。 PersistentVolumeClaims (PVC) とポッドのステータスを検証し、データの書き込みと読み取りをテストするプロセスにより、信頼性が高く一貫性のあるデータ操作が保証されます。顧客データにONTAPまたはStorageGRIDオブジェクト ストレージを使用すると、データのアクセス性とセキュリティがさらに強化されます。全体として、この設定により、増大するデータ ニーズに合わせてシームレスに拡張できる、回復力に優れた高性能なデータ管理ソリューションが顧客に提供されます。