[Kubernetes] ConfigMap๊ณผ Secret
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ ํ๋์ ์ค์ ์ ์ฝ๋์์ ๋ถ๋ฆฌํ๋ ConfigMap๊ณผ Secret์ ์ ๋ฆฌํ๋ค. ํ๊ฒฝ๋ณ๋ก ๋ฌ๋ผ์ง๋ ์ค์ ๊ฐ๊ณผ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง์ ๋ฐ์ ๋ฃ์ง ์๊ณ , ์ธ๋ถ ์ค๋ธ์ ํธ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ๋ถ๋ฆฌํ๋? ์ค์ ๊ฐ(DB URL ๋ฑ)์ ์ฝ๋/์ด๋ฏธ์ง์ ํ๋์ฝ๋ฉํ๋ฉด, ํ๊ฒฝ(๊ฐ๋ฐ/์ด์)์ด ๋ฐ๋ ๋๋ง๋ค ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋น๋ํด์ผ ํ๋ค. ConfigMap(์ผ๋ฐ ์ค์ ) ยท Secret(๋ฏผ๊ฐ ์ ๋ณด)์ผ๋ก ๋ถ๋ฆฌํ๋ฉด, ๊ฐ์ ์ด๋ฏธ์ง์ ์ค์ ๋ง ๊ฐ์ ๋ผ์ธ ์ ์๋ค.
1. ConfigMap vs Secret
| ๊ตฌ๋ถ | ConfigMap | Secret |
|---|---|---|
| ์ฉ๋ | ์ผ๋ฐ ์ค์ ๊ฐ | ๋ฏผ๊ฐ ์ ๋ณด(๋น๋ฐ๋ฒํธยทํ ํฐ) |
| ์ ์ฅ | ํ๋ฌธ | base64 ์ธ์ฝ๋ฉ |
| ์ | APP_ENV, DB_URL | username, 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๋ ์ํธํ๊ฐ ์๋์ ๋ช ์ฌํ๊ณ ์ถ๊ฐ ๋ณดํธ๋ฅผ ์ ์ฉํ์.
Comments powered by Disqus.