Post

[Kubernetes] ConfigMap๊ณผ Secret

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํŒŒ๋“œ์˜ ์„ค์ •์„ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ConfigMap๊ณผ Secret์„ ์ •๋ฆฌํ•œ๋‹ค. ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ์„ค์ •๊ฐ’๊ณผ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์— ๋ฐ•์•„ ๋„ฃ์ง€ ์•Š๊ณ , ์™ธ๋ถ€ ์˜ค๋ธŒ์ ํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์™œ ๋ถ„๋ฆฌํ•˜๋‚˜? ์„ค์ •๊ฐ’(DB URL ๋“ฑ)์„ ์ฝ”๋“œ/์ด๋ฏธ์ง€์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด, ํ™˜๊ฒฝ(๊ฐœ๋ฐœ/์šด์˜)์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•œ๋‹ค. ConfigMap(์ผ๋ฐ˜ ์„ค์ •) ยท Secret(๋ฏผ๊ฐ ์ •๋ณด)์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ๊ฐ™์€ ์ด๋ฏธ์ง€์— ์„ค์ •๋งŒ ๊ฐˆ์•„ ๋ผ์šธ ์ˆ˜ ์žˆ๋‹ค.


1. ConfigMap vs Secret

๊ตฌ๋ถ„ConfigMapSecret
์šฉ๋„์ผ๋ฐ˜ ์„ค์ •๊ฐ’๋ฏผ๊ฐ ์ •๋ณด(๋น„๋ฐ€๋ฒˆํ˜ธยทํ† ํฐ)
์ €์žฅํ‰๋ฌธbase64 ์ธ์ฝ”๋”ฉ
์˜ˆAPP_ENV, DB_URLusername, password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  DATABASE_URL: postgres://user:password@db:5432/mydatabase
---
# Secret
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: dXNlcm5hbWU=   # base64("username")
  password: cGFzc3dvcmQ=   # base64("password")

โš ๏ธ Secret์˜ base64๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ทธ์ € ์ธ์ฝ”๋”ฉ์ผ ๋ฟ์ด๋ผ ๋ˆ„๊ตฌ๋‚˜ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” etcd ์•”ํ˜ธํ™”ยท์™ธ๋ถ€ ๋น„๋ฐ€ ๊ด€๋ฆฌ(VaultยทKMS)ยทRBAC๋กœ ์ ‘๊ทผ ์ œํ•œ์„ ํ•จ๊ป˜ ์ ์šฉํ•ด์•ผ ์ง„์งœ ์•ˆ์ „ํ•˜๋‹ค. ๊ทธ๋ž˜๋„ ConfigMap๋ณด๋‹ค๋Š” Secret์— ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋‹ค.


2. ์‚ฌ์šฉ ๋ฐฉ๋ฒ• โ€” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ vs ๋ณผ๋ฅจ

ConfigMapยทSecret์€ ํŒŒ๋“œ์— โ‘  ํ™˜๊ฒฝ ๋ณ€์ˆ˜(envFrom) ๋˜๋Š” โ‘ก ํŒŒ์ผ(๋ณผ๋ฅจ ๋งˆ์šดํŠธ)๋กœ ์ฃผ์ž…ํ•œ๋‹ค.

flowchart LR
    CM["๐Ÿ“‹ ConfigMap/Secret"]
    CM -- "envFrom" --> Env["ํ™˜๊ฒฝ ๋ณ€์ˆ˜"]
    CM -- "volumeMount" --> File["ํŒŒ์ผ (/etc/config)"]
    Env & File --> Pod["๐Ÿ“ฆ Pod"]

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ฃผ์ž…

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: config-secret-pod
spec:
  containers:
    - name: myapp-container
      image: nginx:1.25.3-alpine
      envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: db-secret

๋ณผ๋ฅจ(ํŒŒ์ผ)๋กœ ๋งˆ์šดํŠธ

1
2
3
4
5
6
7
8
# ConfigMap์„ ํŒŒ์ผ๋กœ: ๊ฐ ํ‚ค = ํŒŒ์ผ๋ช…, ๊ฐ’ = ํŒŒ์ผ ๋‚ด์šฉ
volumeMounts:
  - name: config-volume
    mountPath: /etc/config
volumes:
  - name: config-volume
    configMap:
      name: app-config

๐Ÿ’ก ํ™˜๊ฒฝ ๋ณ€์ˆ˜ vs ํŒŒ์ผ โ€” ์งง์€ ์„ค์ •๊ฐ’์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(envFrom)๊ฐ€ ํŽธํ•˜๊ณ , ์„ค์ • ํŒŒ์ผ ์ „์ฒด(nginx.conf ๋“ฑ)๋‚˜ ์ธ์ฆ์„œ๋Š” ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค. ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธํ•˜๋ฉด ๊ฐ ํ‚ค๊ฐ€ ํŒŒ์ผ ์ด๋ฆ„, ๊ฐ’์ด ํŒŒ์ผ ๋‚ด์šฉ์ด ๋œ๋‹ค.


3. ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ & ๋™์  ๋ฐ˜์˜

1
2
3
4
5
6
7
8
9
10
11
12
13
# ConfigMap ์ƒ์„ฑ
kubectl create configmap app-config \
  --from-literal=APP_ENV=production \
  --from-literal=DATABASE_URL=postgres://user:password@db:5432/mydatabase

# Secret ์ƒ์„ฑ
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

# ์ˆ˜์ • ํ›„ ํŒŒ๋“œ์— ๋ฐ˜์˜(์žฌ์‹œ์ž‘)
kubectl edit configmap app-config
kubectl rollout restart pod <pod-name>

๐Ÿ’ก ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ฃผ์ž…ํ•œ ๊ฐ’์€ ํŒŒ๋“œ ์žฌ์‹œ์ž‘์ด ํ•„์š”ํ•˜๋‹ค. ConfigMap์„ ์ˆ˜์ •ํ•ด๋„ ์ด๋ฏธ ๋œฌ ํŒŒ๋“œ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์•ˆ ๋ฐ”๋€Œ๋ฏ€๋กœ, rollout restart๋กœ ์ƒˆ๋กœ ๋„์›Œ์•ผ ๋ฐ˜์˜๋œ๋‹ค. (๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋Š” ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ž๋™ ๊ฐฑ์‹ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.)


4. Ambassador Pod ํŒจํ„ด

ํ•œ ํŒŒ๋“œ์— ํ”„๋ก์‹œ ์ปจํ…Œ์ด๋„ˆ(Ambassador)๋ฅผ ํ•จ๊ป˜ ๋‘์–ด, ์•ฑ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™ธ๋ถ€ ์„œ๋น„์Šค(DBยทAPI)์— ์ ‘๊ทผํ•˜๋Š” ๋ณต์žก์„ฑ์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
  name: ambassador-pod
spec:
  containers:
    - name: app-container
      image: nginx:1.25.3-alpine
    - name: ambassador-container
      image: nginx:1.25.3-alpine

๐Ÿ’ก ์•ฑ์€ localhost์˜ Ambassador๋งŒ ๋ฐ”๋ผ๋ณด๊ณ , Ambassador๊ฐ€ ์‹ค์ œ ์™ธ๋ถ€ ์—ฐ๊ฒฐ(์ฃผ์†Œยท์ธ์ฆยท์žฌ์‹œ๋„)์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์•ฑ ์ฝ”๋“œ์—์„œ ์™ธ๋ถ€ ์—ฐ๊ฒฐ์˜ ๋ณต์žกํ•จ์„ ๊ฑท์–ด๋‚ด๋Š” ์‚ฌ์ด๋“œ์นด ๊ณ„์—ด ํŒจํ„ด์ด๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
ConfigMap & Secret
โ”œโ”€ ๋ชฉ์    ์„ค์ •์„ ์ฝ”๋“œ/์ด๋ฏธ์ง€์—์„œ ๋ถ„๋ฆฌ
โ”œโ”€ ๊ตฌ๋ถ„   ConfigMap(ํ‰๋ฌธ) / Secret(base64ยท๋ฏผ๊ฐ)
โ”œโ”€ ์ฃผ์ž…   envFrom(ํ™˜๊ฒฝ๋ณ€์ˆ˜) / volume(ํŒŒ์ผ)
โ””โ”€ ๋ฐ˜์˜   ์ˆ˜์ • ํ›„ rollout restart
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
ConfigMap์ผ๋ฐ˜ ์„ค์ • ์ €์žฅ
Secret๋ฏผ๊ฐ ์ •๋ณด(base64)
envFrom/volumeํ™˜๊ฒฝ๋ณ€์ˆ˜/ํŒŒ์ผ ์ฃผ์ž…

ํ•ต์‹ฌ์€ ์„ค์ •์„ ์ด๋ฏธ์ง€ ๋ฐ–์œผ๋กœ ๋นผ๋‚ด ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์— ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜ ์„ค์ •์€ ConfigMap, ๋ฏผ๊ฐ ์ •๋ณด๋Š” Secret์— ๋‘๋˜, Secret์˜ base64๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹˜์„ ๋ช…์‹ฌํ•˜๊ณ  ์ถ”๊ฐ€ ๋ณดํ˜ธ๋ฅผ ์ ์šฉํ•˜์ž.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.