Provisioning, PostgreSQL / K8S

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

Provisioning

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

๐Ÿ“— ํ”„๋กœ๋น„์ €๋‹ - PostgreSQL

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

  • PostgreSQL ์„ค์น˜ ๋ฐฉ๋ฒ• (HostPath ๋ฐฉ์‹)

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

PostgreSQL ์„ค์น˜

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

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

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

helm pull bitnami/postgresql --untar

cd postgresql

StorageClass ์ž‘์„ฑ

k apply -f mysc.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

PV ๊ตฌ์„ฑ

StorageClass ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ์œ ์˜ํ•œ๋‹ค.

  • ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (slave1)
sudo mkdir /mnt/data{1..3}
  • pv ์ƒ์„ฑ
k apply -f mypv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
  labels:
    type: local
spec:
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data1"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [slave1]}     
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv2
  labels:
    type: local
spec:
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data2"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [slave1]}   
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv3
  labels:
    type: local
spec:
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data3"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [slave1]}     
---

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

k get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv1 2Gi RWO Delete Available local-storage 3s
mypv2 2Gi RWO Delete Available local-storage 3s
mypv3 2Gi RWO Delete Available local-storage 3s

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

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

cd postgresql

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

NAME: mypsql
LAST DEPLOYED: Fri May 30 18:06:59 2025
NAMESPACE: psql
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:

    mypsql-postgresql.psql.svc.cluster.local - Read/Write connection

To get the password for "postgres" run:

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

To get the password for "admin" run:

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

To connect to your database run the following command:

    kubectl run mypsql-postgresql-client --rm --tty -i --restart='Never' --namespace psql --image docker.io/bitnami/postgresql:17.5.0-debian-12-r3 --env="PGPASSWORD=$POSTGRES_PASSWORD" \
      --command -- psql --host mypsql-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 psql svc/mypsql-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/

PVC ํ™•์ธ

k get pvc -n psql

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mypsql-postgresql-0 Bound mypv1 2Gi RWO local-storage 30s

>### POD ํ™•์ธ
``` bash
k get po -n psql

NAME                  READY   STATUS    RESTARTS   AGE
mypsql-postgresql-0   1/1     Running   0          42s

pv ํŒจ์น˜

helm ์„ ์‚ญ์ œํ•˜๊ณ , pvc๋ฅผ ์‚ญ์ œํ•ด๋„ pv์— Released ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ์œผ๋ฉด ์ •์ƒ์ ์œผ๋กœ bound ๋˜์ง€ ์•Š์œผ๋‹ˆ ์•„๋ž˜์ฒ˜๋Ÿผ patch ๋ฅผ ํ•ด์ค€๋‹ค.

kubectl patch pv <PV_NAME> -p '{"spec":{"claimRef": null}}'

4๏ธโƒฃ ๊ฒ€์ฆ - ์„ค์น˜ ํ™•์ธ

k exec -it mypsql-postgresql-0 -n psql -- bash

I have no name!@mypsql-postgresql-0:/Ihavenoname!@mypsqlโˆ’postgresqlโˆ’0:/I have no name!@mypsql-postgresql-0:/ psql psql -U admin
Password for user admin:
psql (17.5)
Type "help" for help.

psql=> \c psql
You are now connected to database "psql" as user "admin".

psql=> SELECT current_database();

current_database

psql
(1 row)

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