概要
ベクトルDBのMilvusをRed Hat OpenShift (OCP)に立てようとして、思いがけず苦労したので備忘録として残しておきます。元々はオンプレミスのIBM watsonxでRAGの検証をしようと思った際に、検証用なので小さい構成のMilvusを同居させたかったという動機でした。
前置き
OCPにアプリを追加インストールしインスタンスを立てる場合はOperatorを利用することが多いと思いますが、Milvus Operatorの公式を見るとHelmでのインストールの方が簡単そうでしたので、今回はHelmを使った方法を選びました。以下の手順は基本的にこちらに沿ったものです。OCPは4.14を使用しました。また、OCPにはMilvusのデータを格納するためのストレージが必要なので、NFSやODFなどのストレージクラスをセットアップしておく必要があります。
手順
まず、前提準備としてOCPを操作するBastion環境(ocコマンドが使えるLinuxなど)を用意しておきます。
- ocコマンド
- Helmコマンド
- OCPにログイン
oc login --username=${OCP_USERNAME} --password=${OCP_PASSWORD} --server=${OCP_URL}
- プロジェクトの作成と切り替え
oc create namespace milvus
oc project milvus
- Helm repoの登録
helm repo add zilliztech https://zilliztech.github.io/milvus-helm/
helm repo update
- HelmでMilvusをインストール
helm install my-release zilliztech/milvus
するとこのような出力が見られます。
NAME: my-release
LAST DEPLOYED: Sat Feb 15 05:52:25 2025
NAMESPACE: milvus
STATUS: deployed
REVISION: 1
TEST SUITE: None
少し待つと、Podが起動してくるはずなのですが・・・ここで実際にはそうならずに、エラーが出て待ち状態になっていました。OCPコンソールに入り、StatefulSetsに移ると、my-release-etcdなどの3つほどのStatefulSetsでPodができない状態になっている(0/3)ことがわかります。
そのmy-release-etcdのイベントタブで見ると、どうやら権限エラーになっている模様。
create Pod my-release-etcd-0 in StatefulSet my-release-etcd failed error: pods "my-release-etcd-0" is forbidden: ....
あまりOCPに詳しくないために、この問題に対処するのに時間がかかってしまいましたが、最終的に次のようなコマンドを実行すれば、このエラーが解消できました。
oc create serviceaccount milvus
oc adm policy add-scc-to-user anyuid -z milvus
oc set serviceaccount statefulsets/my-release-etcd milvus
oc set serviceaccount statefulsets/my-release-pulsarv3-zookeeper milvus
oc set serviceaccount statefulsets/my-release-pulsarv3-bookie milvus
使ってみる
さて、Serviceのmy-release-milvusを見ると、ポートとして19530と9091を開いていることがわかります。19530はMilvus、9091はWebUIのポートです。
まずPythonを使ってMilvusに接続するために、BastionからOCP上のMilvusサービスへのネットワーク経路を開いておきます。
oc port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
するとポートフォワードの待機状態になるので、クライアントPCからBastionの27017ポートに接続すれば、そこからOCP上のMilvusにつながります。以下はPythonで接続してみた例です。
from pymilvus import MilvusClient
milvus_host="Bastionのホスト名またはIPアドレス"
milvus_port="27017"
client = MilvusClient(
uri="http://"+milvus_host+":"+milvus_port
)
print(client.list_aliases())
client.create_collection(
collection_name="demo_collection",
dimension=768, # The vectors we will use in this demo has 768 dimensions
)
print(client.list_collections())
同様に、MilvusのWebUIを使うには、9091をBastionでポートフォワードします。
oc port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
すると、クライアントPCからWebUIを使うことができます。
http://(Bastionのホスト名またはIPアドレス):27018/webui/
Pythonで作成したcollectionが見えていますね!
まとめ
OpenShiftでMilvusを立てることができましたが、思わぬところで引っかかりました。ひょっとすると2025/2時点での不具合なのかもしれませんが、同じところでハマった方の助けになれば幸いです。