Appearance
Last updated at 2025-03-26 Posted at 2025-03-25
PostgreSQLのインストール
目次
概要
- kubernetesクラスターにPostgreSQLをインストールする
環境
- ストレージはNFSを使用する
StorageClassを作成
マウント先のディレクトリを先に作る必要がある
sh
mkdir -p ~/yaml/postgres
cat <<EOF > ~/yaml/postgres/nfs_sc.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-postgres
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.0.4
share: /mnt/raid5/k8s/postgres
mountPermissions: "775"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
mountOptions:
- nfsvers=4.1
- hard
EOF
kubectl apply -f ~/yaml/postgres/nfs_sc.yml
kubectl delete -f ~/yaml/postgres/nfs_sc.yml
実行ログ
log
kcm1:~$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-postgres nfs.csi.k8s.io Delete WaitForFirstConsumer true 6s
接続情報
sh
POSTGRES_USER=$(echo -n "postgres" | base64)
POSTGRES_PASSWORD=$(echo -n "passw@rd" | base64)
kubectl create ns postgres
cat <<EOF > ~/yaml/postgres/secret.yml
apiVersion: v1
kind: Secret
metadata:
name: postgres-secrets
type: Opaque
data:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
EOF
kubectl apply -f ~/yaml/postgres/secret.yml
実行ログ
log
kcm1:~$ kubectl get secret -n postgres
NAME TYPE DATA AGE
postgres-secrets Opaque 2 4s
StatefulSetを作成
sh
cat <<EOF > ~/yaml/postgres/statefulset.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:17
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secrets
key: POSTGRES_PASSWORD
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-secrets
key: POSTGRES_USER
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
resources:
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
livenessProbe:
exec:
command:
- pg_isready
- -U
- postgres
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
exec:
command:
- pg_isready
- -U
- postgres
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-postgres
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f ~/yaml/postgres/statefulset.yml
実行ログ
log
kcm1:~$ kubectl get pod -n postgres -w
NAME READY STATUS RESTARTS AGE
postgres-0 0/1 Running 0 5s
postgres-0 0/1 Running 1 (1s ago) 93s
postgres-0 1/1 Running 1 (12s ago) 104s
Serviceを作成
sh
cat <<EOF > ~/yaml/postgres/service.yml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
ports:
- port: 5432
name: postgres
clusterIP: None
selector:
app: postgres
EOF
kubectl apply -f ~/yaml/postgres/service.yml
log
kcm1:~$ kubectl get svc -n postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres ClusterIP None <none> 5432/TCP 4s
DB接続確認
podの中からDBにログインする
sh
kubectl exec -it -n postgres $(kubectl -n postgres get pod -l "app=postgres" -o jsonpath='{.items[0].metadata.name}') -- sh -c "PGPASSWORD=xxx psql --user=postgres -d template1"
実行ログ
log
kcm1:~$ kubectl exec -it -n postgres $(kubectl -n postgres get pod -l "app=postgres" -o jsonpath='{.items[0].metadata.name}') -- sh -c "PGPASSWORD=xxx psql --user=postgres -d template1"
psql (17.4 (Debian 17.4-1.pgdg120+2))
Type "help" for help.
template1=#