[Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(3) - DB ์›Œํฌ๋กœ๋“œ ์„ค์ •ํ•˜๊ธฐ

2025. 11. 13. 16:47ยท๐Ÿณ Docker & Kubernetes
728x90

์ด๋ฒˆ์— ์—…๋ฌด๊ณผ์ •์—์„œ ์ผ๋˜ ํˆด๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด์„œ k8s ์›น ๋ฐฐํฌ๋ฅผ ์ž‘๋…„์— ํ–ˆ๋˜ ๊ธฐ์–ต์„ ๋˜์‚ด๋ ค ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด๋ณด๋ฉด์„œ ํฌ์ŠคํŒ…ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” kubectl, gcloud๋ฅผ ์„ค์น˜ํ•˜๊ณ  fastapi ์ธก ์›Œํฌ๋กœ๋“œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ gke ์œ„์— ์˜ฌ๋ ค๋ณด์•˜๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” DB ์„ค์ •์— ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ PV, PVC, configmap ๋“ฑ ๋‚ด๊ฐ€ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง„๋‹ค.

๋ชฉํ‘œ

  • GKE(Google Kubernetes Engine)์™€ GCE(Google Compute Engine) ๋“ฑ์„ ํ™œ์šฉํ•œ ํ’€์Šคํƒ ์›น ์„œ๋น„์Šค ๋ฐฐํฌํ•˜๊ธฐ
    1. docker file ๊ตฌ์„ฑํ•˜๊ธฐ
    2. kubectl ํ™œ์šฉํ•˜๊ธฐ
    3. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ์— ๊ด€ํ•œ ์ดํ•ด ๋ฐ ์ ์šฉ
      • Deployment
      • StatefulSet
      • Persistent Volume
      • Service
      • Gateway 

1. DB

  • Database๋Š” Stateful Set ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์˜ฌ๋ฆฐ๋‹ค.
  • DB๋Š” ์›๋ž˜๋„ ์ƒํƒœ์ •๋ณด๊ฐ€ ์žˆ๋Š”(stateful) ์š”์†Œ์ด๋‹ค. K8S์˜ Stateful set์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ํฌ์ŠคํŒ…์˜ Deployment์™€ ๋น„๊ตํ•ด๋ณด๊ฒ ๋‹ค.
    • Deployment(Replica Set)๋กœ ์ƒ์„ฑ๋œ Pod๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ ๊ธฐ์กด Pod์™€ ์ƒˆ๋กœ์šด Pod๊ฐ€ ์ด๋ฆ„, IP ์ฃผ์†Œ ๋“ฑ์ด ๊ฐ™์€ ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ฐ˜๋ฉด Stateful Set์€ ๊ฐ๊ฐ์˜ Pod ๋งˆ๋‹ค ๊ณ ์œ ์˜ Volume์„ ๊ฐ€์ง€๊ณ , ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ•˜๋”๋ผ๋„ ๊ธฐ์กด Pod์™€ ๋˜‘๊ฐ™์€ ์ด๋ฆ„๊ณผ IP๋ฅผ ๊ฐ€์ง„ ๋™์ผ Pod๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— Volume๊ณผ ์—ฐ๊ฒฐ์„ ์ง€์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • replica set์œผ๋กœ volume(Persistant Volume Claim)๊ณผ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์—ฐ๊ฒฐ pod ์ˆ˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๋ฉด PVC๋„ ์‚ฌ๋ผ์ง€์ง€๋งŒ, stateful set์˜ ๊ฒฝ์šฐ์—๋Š” PVC๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„ ์ƒˆ๋กœ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฒฐ๋ก ์ ์œผ๋กœ, Pod๊ฐ€ N๊ฐœ๋ฉด PVC๋„ N๊ฐœ, PV๋„ N๊ฐœ๋กœ ๊ฐ Pod๋Š” ์ž์‹ ์—๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น๋œ ํ•˜๋‚˜์˜ PV์—๋งŒ ์—ฐ๊ฒฐ๋œ๋‹ค.

A. Persistent Volume / Claim

  • Persistent Volume
    • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์Šคํ† ๋ฆฌ์ง€์ด์ž ๋ฆฌ์†Œ์Šค.
    • Pod ์ „์šฉ ๋ณผ๋ฅจ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Persistent Volume Claim
    • ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ. ํŠน์ • ํฌ๊ธฐ / ์ ‘๊ทผ๋ชจ๋“œ ๋“ฑ 
    • ์Šคํ† ๋ฆฌ์ง€์™€ Pod๋ฅผ ์ž‡๋Š” ์—ฐ๊ฒฐ๋‹ค๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒ ๋‹ค.
    • ์ •์  ํ”„๋กœ๋น„์ €๋‹(๊ด€๋ฆฌ์ž๊ฐ€ ์ง์ ‘์ƒ์„ฑ)๊ณผ ๋™์  ํ”„๋กœ๋น„์ €๋‹(PVC๋ฅผ ์œ„ํ•ด ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹) ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.
  • Pod๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ PVC๋ฅผ ์‚ญ์ œํ•˜๋ฉด PVC๋Š” ์ฆ‰์‹œ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  Pod๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์‚ญ์ œ๊ฐ€ ์—ฐ๊ธฐ๋œ๋‹ค.
  • PVC์— ๋ฐ”์ธ๋”ฉ ๋˜์–ด์žˆ๋Š” PV๋ฅผ ์‚ญ์ œํ•˜๋ฉด PV๋Š” ์ฆ‰์‹œ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  PVC์— ๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์‚ญ์ œ๊ฐ€ ์—ฐ๊ธฐ๋œ๋‹ค.
  • ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์€ ์‚ฌ์‹ค persistent volume ํ•˜๋‚˜๋ฅผ ๋‘๊ณ  pvc๋‚˜ pod๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ stateful set์€ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š๊ณ , PV์™€ PVC๊ฐ€ ํ•˜๋‚˜์˜ ์ง๊ฟ์œผ๋กœ ์˜์†์ ์œผ๋กœ ๋ฌถ์ธ๋‹ค.
  • pod๋งˆ๋‹ค pv์™€ pvc๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธด๋‹ค๋ฉด pod๋ฅผ ๊ต์ฒดํ–ˆ์„ ๋•Œ ์™ธ๋ถ€์—์„œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€ ์•Š์„๊นŒ?
    • stateful set์€ pod๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ PVC์™€ PV๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ด์ „๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ƒˆ pod๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์ƒˆ pod๋Š” ๊ธฐ์กด PVC๋ฅผ ์ฐพ์•„ ๋งˆ์šดํŠธํ•œ๋‹ค.
    • ๊ทธ๋Ÿผ ์ด์ „์˜ DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

B. StatefulSet

  • ๋ฐ”๋กœ yaml ํŒŒ์ผ์„ ๋ณด๋ฉด์„œ ๋ถ„์„ํ•ด๋ณด์ž.
# StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
  namespace: web
spec:
  serviceName: postgresql
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
        - name: postgres
          image: postgres:15
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_USER
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_PASSWORD
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgres-data
              mountPath: "/data/postgres"
              subPath: postgresql-data
            - name: pg-config
              mountPath: "/docker-entrypoint-initdb.d"
      volumes:
        - name: pg-config
          configMap:
            name: postgres-initdb-config
  volumeClaimTemplates:
    - metadata:
        name: postgres-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi
  • Deployment ์™€ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ volumeMounts, volumes, volumeClaimTemplates ๋ถ€๋ถ„์ด๋‹ค.

volumeClaimTemplates

  • pod๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์ด ํ…œํ”Œ๋ฆฟ๋Œ€๋กœ pvc๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”~ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • pvc๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  pv๊ฐ€ pvc์— ๋งž์ถฐ ์ƒ์„ฑ๋œ๋‹ค. 
  • pv access mode๋Š” read write once์ด๋‹ค. ํ•˜๋‚˜์˜ pv์— ํ•˜๋‚˜์˜ pvc๋งŒ ๋ถ™์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—!
  • resources.requests์—์„œ๋Š” ์ €์žฅ๊ณต๊ฐ„ 5Gi๋ฅผ ์š”์ฒญํ–ˆ๋‹ค.

volumeMounts / volumes

  • volumeMounts๋ฅผ ๋จผ์ € ๋ณด์ž. ๋ง ๊ทธ๋Œ€๋กœ ์กด์žฌํ•˜๋Š” volume์„ ์ด ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
  • ์ด๋ฆ„์ด postgres-data ์ด๋‹ค. ์ด๋Š” volumeClaimTemplate ์—์„œ ์ง€์ •ํ•œ ์ด๋ฆ„๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ด ํŒŒํŠธ์—์„œ ๋งˆ์šดํŠธํ•˜๋Š” ๋ณผ๋ฅจ์ด PV๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • mountPath์™€ subPath๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด ์–ด๋””์— volume์„ mountํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•œ๋‹ค.
  • ๊ทธ ๋‹ค์Œ volume์˜ ์ด๋ฆ„์€ pg-config ์ด๊ณ , ์ด๋Š” ์•„๋ž˜ spec.template.spec.volumes์— ์žˆ๋Š” volume๊ณผ ๊ฐ™๋‹ค. 
  • ์ด ๊ฒฝ์šฐ์—๋Š” pv๊ฐ€ ์•„๋‹ˆ๊ณ , ์–ด๋–ค ์ €์žฅ๊ณต๊ฐ„ ๋“ฑ์„ /docker-entrypoint-initdb.d ๋กœ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
  •  

C. Config Map

  • configMap์€ key-value ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธฐ๋ฐ€์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ํฌ์ŠคํŠธ์—์„œ postgresql์˜ custom docker image๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ์ด์œ ์ธ init.sql ์˜ ๋™์ž‘์„ ์ €์žฅํ•ด๋‘๊ธฐ ์œ„ํ•ด์„œ configMap์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. 
  • init.sql ์„ ๋‹ค์‹œ ๋ณด์ž.
// init.sql
DO
$$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg.catalog.pg_roles WHERE rolename == 'dain') THEN
        CREATE ROLE dain WITH LOGIN PASSWORD 'password';
    END IF;
END
$$;

DO
$$
BEGIN 
    IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname == 'energy_monitor') THEN
        CREATE DATABASE energy_monitor OWNER dain;
    END IF;
END
$$;

ALTER DATABASE energy_monitor OWNER TO dain;
  • ์ด ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ configMap ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์„ ๋•Œ, ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
    1. rolname์ด๋‚˜ password์™€ ๊ฐ™์€ ๊ธฐ๋ฐ€์ด ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๋Š” conigMap ํŒŒ์ผ์— ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ
    2. CREATE DATABASE cannot run inside a transaction block ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด rolename, password๋กœ ์ง€์ •ํ•œ ๋‚ด์šฉ๋“ค์„ secret ํ˜•ํƒœ๋กœ ์˜ฎ๊ฒผ๋‹ค. ๊ธฐ๋ณธ ์œ ์ €์ธ POSTGRES_USER, POSTGRES_PASSWORD ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค๋ฉด ์ƒˆ๋กœ ์œ ์ €๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.
# Secret
apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
  namespace: web
type: Opaque
stringData:
  POSTGRES_USER: "dain"
  POSTGRES_PASSWORD: "password"
  • ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” CREATE DATABASE ๋ช…๋ น์–ด๊ฐ€ ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.
  • ์œ„์—์„œ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋˜ user๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ์œ ์ €๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, DO~ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก์—์„œ ๋ถ„๋ฆฌํ•ด DB๊ฐ€ ์žˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
# Config Map
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-initdb-config
  namespace: web
data:
  pg-init-sql.sql: |
    SELECT 'CREATE DATABASE energy_monitor OWNER dain'
    WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'energy_monitor')\gexec
  • configMap์—๋Š” spec ๋Œ€์‹  data / binaryData๊ฐ€ ์žˆ๊ณ , key-value ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. 
  • configMap์˜ metadata.name์„ volumes์—์„œ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค. 
  • ๋‹ค์‹œ statefulset์—์„œ configMap ๋งˆ์šดํŠธ ๋ถ€๋ถ„์„ ๋ณด๋ฉด,
  volumeMounts:
    - name: postgres-data
      mountPath: "/data/postgres"
      subPath: postgresql-data
    - name: pg-config
      mountPath: "/docker-entrypoint-initdb.d"
volumes:
- name: pg-config
  configMap:
    name: postgres-initdb-config
  • volumes์—์„œ configMap type์„ ์ง€์ •ํ•˜๊ณ , configMap ์ด๋ฆ„์„ ๋งž๋Š” ๊ฒƒ์„ ์จ์ค€๋‹ค. volume์˜ ๋ณ„์นญ๋„ ์ •ํ•œ๋‹ค.
  • volumeMounts์—์„œ volume์— ์„ ์–ธํ•œ ๋ณ„์นญ์„ name์œผ๋กœ ์จ์„œ ์–ด๋–ค volume์„ ๋งˆ์šดํŠธํ•  ๊ฒƒ์ธ์ง€ ํ™•์ •ํ•˜๊ณ , ์ด volume์„ mountํ•  ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

D. Service

  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ด stateful set์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ „๋‹ฌํ•ด์ค„ service๋ฅผ ๋„์šฐ๋ฉด ๋œ๋‹ค. 
  • ์ด๋ฒˆ์—๋Š” ์™ธ๋ถ€ ๋จธ์‹ ์—์„œ DB์— ์ง์ ‘ ์ ‘์†ํ•  ์ผ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก Cluster IP  type์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.
# Service
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: web
spec:
  type: ClusterIP
  selector:
    app: postgresql
  ports:
    - name: tcp
      port: 5432
      targetPort: 5432

 

E. ๋„์›Œ๋ณด๊ธฐ!

  • ์ด์ œ ์—ฌํƒœ๊ป ๋งŒ๋“  ๊ฒƒ๋“ค์„ GKE ํด๋Ÿฌ์Šคํ„ฐ์— ๋„์›Œ๋ณผ ๊ฒƒ์ด๋‹ค.

  • ์œ„ ๋ถ€๋ถ„์—์„œ ์—ฐ๊ฒฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด CLI์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
gcloud container clusters get-credentials <cluster-name> --region <region> --project <project-id>
  • ๊ทธ๋ฆฌ๊ณ  namespace๋ฅผ default ์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ๊ฑธ ์ผ์œผ๋ฉด kubectl create namespace <name> ์œผ๋กœ ๋งŒ๋“ค์ž.
  • ์ˆœ์„œ๋Š” secret/configMap > DB > DB service > Web > Web Service ์ˆœ์œผ๋กœ ๋„์›Œ์•ผํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  kubernetes ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ตฌ์„ฑ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋ณด๋ฉด  ์˜๋ฏธ์ƒ ๋งž๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ์—ฐ๊ด€๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ์•„ ๋†“๋Š”๋‹ค. ๋•Œ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ๋ณด๋‹ค ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ๋” ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋ผ๊ณ  ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ, ๋‚˜๋Š” ํฌ๊ฒŒ DB์ชฝ ํŒŒ์ผ 4๊ฐœ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ , Web์ชฝ ํŒŒ์ผ 2๊ฐœ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์—ˆ๋‹ค. ์ „๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
# Secret
apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
  namespace: web
type: Opaque
stringData:
  POSTGRES_USER: "dain"
  POSTGRES_PASSWORD: "password"

---
# Config Map
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-initdb-config
  namespace: web
data:
  pg-init-sql.sql: |
    SELECT 'CREATE DATABASE energy_monitor OWNER dain'
    WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'energy_monitor')\gexec

---
# StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
  namespace: web
spec:
  serviceName: postgresql
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
        - name: postgres
          image: postgres:15
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_USER
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_PASSWORD
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgres-data
              mountPath: "/data/postgres"
              subPath: postgresql-data
            - name: pg-config
              mountPath: "/docker-entrypoint-initdb.d"
      volumes:
        - name: pg-config
          configMap:
            name: postgres-initdb-config
  volumeClaimTemplates:
    - metadata:
        name: postgres-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi

---
# Service
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: web
spec:
  type: ClusterIP
  selector:
    app: postgresql
  ports:
    - name: tcp
      port: 5432
      targetPort: 5432

  • ์ด๋ ‡๊ฒŒ ๋„์šฐ๊ณ  ๋‚˜๋ฉด ์—ฌ๊ธฐ์ €๊ธฐ์—์„œ ์ž˜ ๋„์›Œ์กŒ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ๋ช…๋ น์ค„ ๋„๊ตฌ์—์„œ๋Š”,
kubectl <type> -n <namespace>
  • ์ด๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ์™€ ์ƒํƒœ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • google cloud ์ฝ˜์†” ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” ํฌ๊ฒŒ ์›Œํฌ๋กœ๋“œ์™€ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ConfigMap, ๊ฒŒ์ดํŠธ์›จ์ด, ์„œ๋น„์Šค, ์ธ๊ทธ๋ ˆ์Šค ํŽ˜์ด์ง€์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

StatefulSet
Service
secret ๋ฐ config map
secret ์•”ํ˜ธํ™”๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
configMap

  • ์ด์ œ ์›น ์›Œํฌ๋กœ๋“œ๋„ ์˜ฌ๋ ค๋ณด๊ฒ ๋‹ค.
  • ํ•ฉ์นœ ์ „๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server
  namespace: web
  labels:
    app: server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      name: server
      labels:
        app: server
    spec:
      containers:
        - name: server
          image: mysterias/web-service:251103-0.0
          env:
            - name: db_user
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_USER
            - name: db_password
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_PASSWORD
            - name: db_host
              value: "postgresql"
            - name: db_port
              value: "5432"
            - name: db_name
              value: "energy_monitor"
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_USER
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_PASSWORD
          ports:
            - containerPort: 8080
              name: server

---
# Service
apiVersion: v1
kind: Service
metadata:
  name: server-svc
  namespace: web
  labels:
    app: server
spec:
  selector:
    app: server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: loadBalancer

  • ์ตœ์ข…์ ์œผ๋กœ web service๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์˜ฌ๋ผ๊ฐ”๋‹ค๋ฉด, ์„œ๋น„์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์™ธ๋ถ€ ์—”๋“œํฌ์ธํŠธ ip์™€ ์ง€์ •ํ•œ ํฌํŠธ์—์„œ ์ ‘์†ํ•ด์„œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!
728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿณ Docker & Kubernetes' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(4) - Gateway API๋กœ ๋ฐฐํฌํ•˜๊ธฐ  (0) 2025.11.19
[Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(2) - ๋ฐฑ์—”๋“œ ์›Œํฌ๋กœ๋“œ ๊ตฌ์„ฑํŒŒ์ผ ๋งŒ๋“ค๊ธฐ  (0) 2025.11.12
[Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(1) - Dockerfile ๊ตฌ์„ฑ, Docker compose๋กœ ํ™•์ธํ•˜๊ธฐ  (0) 2025.11.11
[Docker + ELK] Docker ELK๋ฅผ ์‚ฌ์šฉํ•ด์„œ PostgreSQL DB ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๊ธฐ  (1) 2023.12.21
[Docker] Docker ์ž…๋ฌธ - Docker Image, Container, ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ moniwiki ๋ฐฐํฌ ์˜ˆ์ œ๊นŒ์ง€  (1) 2023.04.27
'๐Ÿณ Docker & Kubernetes' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(4) - Gateway API๋กœ ๋ฐฐํฌํ•˜๊ธฐ
  • [Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(2) - ๋ฐฑ์—”๋“œ ์›Œํฌ๋กœ๋“œ ๊ตฌ์„ฑํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
  • [Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(1) - Dockerfile ๊ตฌ์„ฑ, Docker compose๋กœ ํ™•์ธํ•˜๊ธฐ
  • [Docker + ELK] Docker ELK๋ฅผ ์‚ฌ์šฉํ•ด์„œ PostgreSQL DB ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๊ธฐ
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (109)
      • ๐Ÿฌ ML & Data (55)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (17)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿณ Docker & Kubernetes (7)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐ŸŒ Networking (0)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (10)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[Docker/K8S] ์›น ์„œ๋น„์Šค๋ฅผ GKE๋กœ ๋ฐฐํฌํ•˜๊ธฐ(3) - DB ์›Œํฌ๋กœ๋“œ ์„ค์ •ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”