今まで、Difyの helm に内用されているPostgreSQLを使用していましたが、データが永続化できていないためPODが再起動されるとデータが消えてしまう状態でした。データを永続化するためにも、PostgreSQLをk8sにデプロイしていきます。
参考情報
postgresql:
# using embedded postgresql
# connection info would be set automatically
# best to use external pg if you have one
# setting embedded to false and set pg url in envrionment variable
embedded: true
と書かれています。
NFSでデータを永続化
データを永続化するためにNFSを使用します。
NFSのUbuntuでの構築方法は、ネットを探せばいくらでもありますが、
$ sudo mkdir /srv/nfs/share/postgres
$ sudo chown nobody:nogroup /srv/nfs/share/postgres
$ sudo chmod 755 /srv/nfs/share/postgres
$ ls -la /srv/nfs/share/postgres
Kubernetes に PostgreSQLをデプロイ
NFSサーバーのIPが 192.168.7.64
の場合の例で記載しています。
ディスクサイズは 10G
としていますが、ニーズに合わせて変更してください。
作成するDB、ユーザーは
POSTGRES_DB: dify
POSTGRES_USER: dify_user
POSTGRES_PASSWORD: dify_password
の部分を修正してください。
ネームスペースの作成
# kubectl create namespace postgres
設定ファイル作成
# nano postgres-deployment.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: postgres-sc
provisioner: kubernetes.io/nfs
parameters:
archiveOnDelete: "false"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: postgres-sc
nfs:
server: 192.168.7.64
path: /srv/nfs/share/postgres
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
namespace: postgres
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: postgres-sc
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: postgres
name: postgres-secret
labels:
app: postgres
data:
POSTGRES_DB: dify
POSTGRES_USER: dify_user
POSTGRES_PASSWORD: dify_password
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: postgres
spec:
replicas: 2
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
securityContext:
fsGroup: 999
initContainers:
- name: init-pg-hba
image: busybox
command: ['sh', '-c', 'echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf']
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgresdata
containers:
- name: postgres
image: 'postgres:latest'
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-secret
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgresdata
subPath: data
securityContext:
runAsUser: 999
runAsGroup: 999
allowPrivilegeEscalation: false
volumes:
- name: postgresdata
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: postgres
labels:
app: postgres
spec:
type: LoadBalancer
ports:
- port: 5432
selector:
app: postgres
デプロイ実行
# kubectl apply -f postgres-deployment.yaml
※再インストール時は
# rm -Rf /srv/nfs/share/postgres/*
でNFSのフォルダを空にしておきましょう
起動確認
$ kubectl get pod,svc -n postgres
NAME READY STATUS RESTARTS AGE
pod/postgres-5b784bd7b5-766kk 1/1 Running 0 28s
pod/postgres-5b784bd7b5-br6xm 1/1 Running 0 28s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/postgres LoadBalancer 10.98.97.255 192.168.7.36 5432:32513/TCP 28s
接続確認
$ sudo apt install postgresql-client
$ psql -h 192.168.7.36 -U dify_user -d dify
Password for user dify_user:
うまく接続できました🍻