Provisioning, PostgreSQL / standalone

Jeonghak Choยท2025๋…„ 6์›” 8์ผ

Provisioning

๋ชฉ๋ก ๋ณด๊ธฐ
41/44

๐Ÿ“— ๊ฐœ์š” - PostgreSQL - K8S - standalone

๐Ÿณ๏ธโ€๐ŸŒˆ [๊ถ๊ธˆํ•œ์ ]

  • PostgreSQL์˜ ์ตœ์†Œํ•œ์˜ ์ŠคํŽ™์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• (ํ•˜๋ฒ„์—์„œ ์ฐธ์กฐ,๋กœ์ปฌ ํ…Œ์ŠคํŠธ์šฉ)

๐Ÿ”—[๋ชฉ์ฐจ]

1๏ธโƒฃ ์ค€๋น„

PostgreSQL ์ฐจํŠธ ๋‹ค์šด๋กœ๋“œ

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

helm pull bitnami/postgresql --untar

cd postgresql

StorageClass

  • sc ์ •์˜
apiVersion: storage.k8s.io/v1
kind: StorageClass
reclaimPolicy: Delete 
metadata:
  name: dev-psql-local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
  • sc ์ƒ์„ฑ
k apply -f dev-psql-sc.yaml

storageclass.storage.k8s.io/dev-psql-local-storage created

k get sc

NAME                     PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
dev-psql-local-storage   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  31s

๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ

  • ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (slave1)
sudo mkdir /tmp/dev-psql-data1
sudo chown -R 1001:1001 /tmp/dev-psql-data1

ls -ld /tmp/dev-psql-data1
drwxr-xr-x 2 1001 1001 4096 Jun  7 01:43 /tmp/dev-psql-data1

PV

  • PV ์ •์˜
    StorageClass ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ์œ ์˜ํ•œ๋‹ค.
apiVersion: v1
kind: PersistentVolume
metadata:
  name: dev-psql-pv1
  labels:
    type: local
spec:
  storageClassName: dev-psql-local-storage
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/dev-psql-data1"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [slave1]}     
  • pv ์ƒ์„ฑ
k apply -f dev-psql-pv.yaml

persistentvolume/dev-psql-pv1 created

k get pv

NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                 STORAGECLASS         REASON   AGE
dev-psql-pv1   1Gi        RWO            Delete           Available                                         psql-local-storage            3m35s

pv ๋ชฉ๋ก ํ™•์ธ

k get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
dev-psql-pv1 1Gi RWO Delete Available psql-local-storage 21s

# 2๏ธโƒฃ ์„ค์ • - ์‚ฌ์šฉ์ž Values ํŒŒ์ผ ์ƒ์„ฑ
``` bash
cp values.yaml dev-psql-values.yaml
  • dev-values.yaml ํŒŒ์ผ ํŽธ์ง‘
  • ์•„๋ž˜ ๋‚ด์šฉ ๋‚จ๊ธฐ๊ณ  ์‚ญ์ œ
global:
  postgresql:
    auth:
      postgresPassword: "psql"
      username: "admin"
      password: "psql"
      database: "psql"
primary:
  persistence:
    size: 1Gi
    storageClass: "dev-psql-local-storage"
  • value ํŒŒ์ผ ์ ์šฉ ํ™•์ธ
cd ..
helm template postgresql -f dev-psql-values.yaml

3๏ธโƒฃ ์„ค์น˜

PostgreSQL ์„ค์น˜ (standalone)

helm install my-psql . -n my-dev -f dev-psql-values.yaml --create-namespace --set volumePermissions.enabled=true

NAME: my-psql
LAST DEPLOYED: Sat Jun  7 10:58:51 2025
NAMESPACE: my-dev
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: postgresql
CHART VERSION: 16.7.4
APP VERSION: 17.5.0

Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information.

** Please be patient while the chart is being deployed **

PostgreSQL can be accessed via port 5432 on the following DNS names from within your cluster:

    my-psql-postgresql.my-dev.svc.cluster.local - Read/Write connection

To get the password for "postgres" run:

    export POSTGRES_ADMIN_PASSWORD=$(kubectl get secret --namespace my-dev my-psql-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d)

To get the password for "admin" run:

    export POSTGRES_PASSWORD=$(kubectl get secret --namespace my-dev my-psql-postgresql -o jsonpath="{.data.password}" | base64 -d)

To connect to your database run the following command:

    kubectl run my-psql-postgresql-client --rm --tty -i --restart='Never' --namespace my-dev --image docker.io/bitnami/postgresql:17.5.0-debian-12-r3 --env="PGPASSWORD=$POSTGRES_PASSWORD" \
      --command -- psql --host my-psql-postgresql -U admin -d psql -p 5432

    > NOTE: If you access the container using bash, make sure that you execute "/opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash" in order to avoid the error "psql: local user with ID 1001} does not exist"

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace my-dev svc/my-psql-postgresql 5432:5432 &
    PGPASSWORD="$POSTGRES_PASSWORD" psql --host 127.0.0.1 -U admin -d psql -p 5432

WARNING: The configured password will be ignored on new installation in case when previous PostgreSQL release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue.

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - primary.resources
  - readReplicas.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

POD ํ™•์ธ

k get po -n my-dev

NAME                   READY   STATUS    RESTARTS   AGE
my-psql-postgresql-0   1/1     Running   0          2m5s

์ฐจํŠธ ๋ฒ„์ „

helm ls -n my-dev

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
my-psql my-dev          1               2025-06-07 10:58:51.6772875 +0900 KST   deployed        postgresql-16.7.4       17.5.0

4๏ธโƒฃ ๊ฒ€์ฆ

PostgreSQL ์—ฐ๊ฒฐ

k exec -it my-psql-postgresql-0 -n my-dev -- bash

I have no name!@my-psql-postgresql-0:/$ psql psql -U admin
Password for user admin:
psql (17.5)
Type "help" for help.

psql=> SELECT current_database();
 current_database
------------------
 psql
(1 row)

PostgreSQL DNS ํ™•์ธ

I have no name!@my-psql-postgresql-0:/$ psql psql -U admin -h my-psql-postgresql-0.my-psql-postgresql-hl.my-dev.svc.cluster.local
Password for user admin:
psql (17.5)
Type "help" for help.

psql=>

์ฐธ๊ณ 

์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น์–ด

# helm ์‚ญ์ œ ํ›„ ์žฌ ์ƒ์„ฑ
helm delete my-psql -n my-dev
helm install my-psql . -n my-dev -f dev-psql-values.yaml --create-namespace --set volumePermissions.enabled=true

# helm upgrade
helm upgrade my-psql . -n my-dev -f dev-psql-values.yaml --create-namespace --set volumePermissions.enabled=true

# persistentVolumeReclaimPolicy: Retain ์ผ ๊ฒฝ์šฐ  - Released ์ƒํƒœ์˜ pv Available๋กœ ๋ณ€๊ฒฝ 
rm -rf /tmp/dev-psql-data1/*
kubectl patch pv my-pv1 -p '{"spec":{"claimRef": null}}'

# persistentVolumeReclaimPolicy: Retain ์ผ ๊ฒฝ์šฐ - PV ์ƒ์„ฑ/์‚ญ์ œ
k apply -f dev-psql-pv.yaml

k delete -f dev-psql-pv.yaml

0๊ฐœ์˜ ๋Œ“๊ธ€