前回と同様、Difyの helm に内用されているMinIOを使用していましたが、データが永続化できていないためPODが再起動されるとデータが消えてしまう状態でした。データを永続化するためにも、MinIOをk8sにデプロイしていきます。
参考情報
minio:
embedded: false
# using embedded minio
# connection info would be set automatically
# best to use external s3/minio if you have one
# setting embedded to false and set minio/s3 url in envrionment variable
と書かれています。
MinIOとは
簡単に言うと、S3互換のファイルを保存してくれるアプリです。
Difyでは、ナレッジにアップロードしたファイルなどを保持してくれるんですかね。
MinIO は、Amazon Web Services S3 互換 API を提供し、すべてのコア S3 機能をサポートするオブジェクト ストレージ ソリューションです。MinIO は、パブリック クラウドまたはプライベート クラウド、ベアメタル インフラストラクチャ、オーケストレーションされた環境、エッジ インフラストラクチャなど、どこにでもデプロイできるように構築されています。
NFSでデータを永続化
データを永続化するためにNFSを使用します。
NFSのUbuntuでの構築方法は、ネットを探せばいくらでもありますが、
$ sudo mkdir /srv/nfs/share/minio
$ sudo chown nobody:nogroup /srv/nfs/share/minio
$ sudo chmod 755 /srv/nfs/share/minio
$ ls -la /srv/nfs/share/minio
Kubernetes に MinIOをデプロイ
NFSサーバーのIPが 192.168.7.64
の場合の例で記載しています。
ディスクサイズは 100G
としていますが、ニーズに合わせて変更してください。
設定ファイル作成
# nano minio-deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: minio
labels:
name: minio
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minio-sc
provisioner: kubernetes.io/nfs
parameters:
archiveOnDelete: "false"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: minio-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: minio-sc
nfs:
server: 192.168.7.64
path: /srv/nfs/share/minio
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-pvc
namespace: minio
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
storageClassName: minio-sc
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: minio
name: minio
namespace: minio
spec:
containers:
- name: minio
image: quay.io/minio/minio:latest
command:
- /bin/bash
- -c
args:
- minio server /data --console-address :9001
env:
- name: MINIO_ROOT_USER
value: "microai"
- name: MINIO_ROOT_PASSWORD
value: "microai_password"
volumeMounts:
- mountPath: /data
name: minio-volume
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "minio"
operator: In
values:
- "true"
volumes:
- name: minio-volume
persistentVolumeClaim:
claimName: minio-pvc
---
apiVersion: v1
kind: Service
metadata:
name: minio
labels:
app: minio
namespace: minio
spec:
type: LoadBalancer
ports:
- port: 9001
selector:
app: minio
---
apiVersion: v1
kind: Service
metadata:
name: minio-api
labels:
app: minio
namespace: minio
spec:
type: LoadBalancer
ports:
- port: 9000
targetPort: 9000
selector:
app: minio
rootユーザーのUsername, Password は以下の箇所で設定します。
env:
- name: MINIO_ROOT_USER
value: "microai"
- name: MINIO_ROOT_PASSWORD
value: "microai_password"
デプロイ実行
# kubectl apply -f minio-deployment.yaml
起動確認
$ kubectl get pod,svc -n minio
NAME READY STATUS RESTARTS AGE
pod/minio 1/1 Running 0 7m26s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio LoadBalancer 10.100.177.152 192.168.7.37 9001:31018/TCP 7m26s
service/minio-api LoadBalancer 10.105.243.17 192.168.7.38 9000:32227/TCP 7m26s
ブラウザでアクセス
にアクセス。※IPは、EXTERNAL-IP
に合わせてください
このようななんとも言えないデザインの画面が表示されます🥵
ログイン
上記で設定したUsername, Password でログインします。
なお、指定しないと
Username: minioadmin
Password: minioadmin
となります。
このような画面が表示されます。
使い方については、また勉強してブログにまとめます。一旦🍻