Skip to content

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=#