Kubernetes に PostgreSQL をインストールする

Jul 18, 2024, 6:30 AM
今まで、Difyの helm に内用されているPostgreSQLを使用していましたが、データが永続化できていないためPODが再起動されるとデータが消えてしまう状態でした。データを永続化するためにも、PostgreSQLをk8sにデプロイしていきます。


参考情報

https://github.com/douban/charts/blob/master/charts/dify/values.yaml に
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での構築方法は、ネットを探せばいくらでもありますが、
Raspberry Pi 3 B+(Ubuntu) でNFSファイルサーバーを作る で記事を書いていますので宜しければご覧ください。

$ 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:
うまく接続できました🍻
ベクトルデータベース Weaviate を試す。Docker で起動〜簡単なテストまで(Nvidia GPU使用)
Kubernetes に MinIO をインストールする