์ฟ ๋ฒ๋คํฐ์ค์์๋ ํ๊ฒฝ ๋ณ์๋ ์๋กญ๊ฒ ์์ฑํ ํ์ผ์ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ ๋ฌํด์ฃผ๊ธฐ ์ํด์ Configmap, Secret ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฆ์์ ์ ์ถํ ์ ์๋ฏ Configmap ์ ๋ณด์์ ์ผ๋ก ์ค์์น ์์ ๋ฐ์ดํฐ๋ค์ ์ฌ์ฉํ ๋, Secret ์ ๋ณด์์ ์ผ๋ก ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ Configmap ์ Plain Text ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋ฐ๋ฉด, Secret ์ ์ธ์ฝ๋ฉ ๋์ด ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ Secret ์ ์์ฑ ํ ์ด๋ป๊ฒ ํ๋์๊ฒ ์ ๋ฌํ๋ ์ง๋ฅผ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋ด์ผ๋ก Secret ์ ์ธ์ฝ๋ฉ ๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ค ๋์ฝ๋ฉ ํ๋ฉด ์ด๋ค ๊ฐ์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ผ๋ก ์์ ํ์ง๋ ์์ต๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค๋ ์ด๋ ๊ฒ ๊ตณ์ด Secret ์ ๊ฐ์ ์ธ์ฝ๋ฉํด์ ์ ์ฅํ๋ ์ด์ ๋ ํด์ปค์๊ฒ ํผ๋์ ์ฃผ๊ธฐ ์ํด์๋ผ๊ณ ํฉ๋๋ค.
๋ง์ฝ, ์ ๋ง ๋ณด์์ ์ผ๋ก ์์ ํ๊ฒ Secret ์ ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด, RBAC ๋ฅผ ํตํด ์ ๊ทผ ๊ถํ์ ์ ํํ๊ฑฐ๋ Vault ์ ๊ฐ์ ํค ๋งค๋์ ํด์ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋~
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค์์๋ Secret ์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Env ์ ์ด์ฉํ ๋ฐฉ๋ฒ
- Volume ์ ์ด์ฉํ ๋ฐฉ๋ฒ
์ฐจ๋ก๋๋ก ํ๋์ฉ ์์๋ณด๋๋ก ํ์ฃ !
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
Env ์ ์ด์ฉํ ๋ฐฉ๋ฒ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ Secret ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
apiVersion: v1
data:
password: Mzk1MjgkdmRnN0pi # 39528$vdg7Jb
username: bXktYXBw # my-app
kind: Secret
metadata:
creationTimestamp: null
name: env-each-secret
---
apiVersion: v1
kind: Pod
metadata:
name: env-each-secret
spec:
containers:
- name: tester
image: nginx
env:
- name: SECRET_USERNAME # ์ปจํ
์ด๋ ๋ด์์ ๋ฑ๋ก ๋ ํ๊ฒฝ๋ณ์์ ์ด๋ฆ
valueFrom:
secretKeyRef:
name: env-each-secret # secret ์ ์ด๋ฆ
key: username # secret data ์ ๋ช
์๋ ํค
- name: SECRET_PASSWORD # ์ปจํ
์ด๋ ๋ด์์ ๋ฑ๋ก ๋ ํ๊ฒฝ๋ณ์์ ์ด๋ฆ
valueFrom:
secretKeyRef:
name: env-each-secret # secret ์ ์ด๋ฆ
key: password # secret data ์ ๋ช
์๋ ํค
Volume ์ด ์๋ Env ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋ง์ดํธ๋ ๊ฒฝ๋ก๋ ๋ฐ๋ก ์์ต๋๋ค.
env ๋ฅผ ์คํํ ๊ฒฐ๊ณผ SECRET_USERNAME ๊ณผ SECRET_PASSWORD ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.
์์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ Secret ์ด ๊ฐ์ด ์ปจํ ์ด๋ ๋ด์์ ์ด๋ฐ ์์ผ๋ก ์์ ํ ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ RBAC ๋ฅผ ํตํด ์ ๊ทผ ์ ํ์ ๋ฐ๋์ ํด์ผํฉ๋๋ค.
์์ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๊น๋ํฉ๋๋ค. ํ์ง๋ง Secret ์ data ๊ฐฏ์๋งํผ .spec.containers[].env ์ ๋ฆฌ์คํธ ๋ํ ๋์ด๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ง์ฝ Secret ์ data ๊ฐ 100๊ฐ๋ผ๋ฉด pod.yaml ์ ์ฝ๋๊ฐ ์๋นํด์ง์ฃ .
๊ทธ๋ผ ๋ฐ๋ก ์ด์ด์ data ๊ฐฏ์๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
ํ๊บผ๋ฒ์ Env ๋ก Secret ์ data ์ฒ๋ฆฌ
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
apiVersion: v1
data:
password: Mzk1MjgkdmRnN0pi # 39528$vdg7Jb
username: bXktYXBw # my-app
kind: Secret
metadata:
creationTimestamp: null
name: env-all-secrets
---
apiVersion: v1
kind: Pod
metadata:
name: env-all-secrets
spec:
containers:
- name: tester
image: nginx
envFrom:
- secretRef:
name: env-all-secrets
ํ์ฐํ pod.yaml ์ ์ฝ๋ ์๊ฐ ์ ์ด์ก์ต๋๋ค.
Volume ์ด ์๋ Env ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋ง์ดํธ๋ ๊ฒฝ๋ก๋ ๋ฐ๋ก ์์ต๋๋ค.
env ๋ฅผ ์คํํ ๊ฒฐ๊ณผ SECRET_USERNAME ๊ณผ SECRET_PASSWORD ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.
Secret ์ data ๋ฅผ ํ๋ํ๋ ์ฒ๋ฆฌํ ํ์์์ด ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ๋ Env ๊ฐ ์๋ Volume ์ ํตํด Secret ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ Volume ์ ํตํ Secret ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
apiVersion: v1
data:
password: Mzk1MjgkdmRnN0pi # 39528$vdg7Jb
username: bXktYXBw # my-app
kind: Secret
metadata:
name: volume-basic-secret
---
apiVersion: v1
kind: Pod
metadata:
name: volume-basic-secret
spec:
containers:
- name: tester
image: nginx
volumeMounts:
- name: test-secret
mountPath: /etc/secret-volume
readOnly: true
volumes:
- name: test-secret
secret:
secretName: volume-basic-secret
Volume ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ Env ์ ๋ฌ๋ฆฌ ๋ง์ดํธ ๊ฒฝ๋ก๊ฐ ์กด์ฌํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ดํธ๋ tmpfs ๋ก ๋ฉ๋๋ค.
Configmap ๊ณผ ๋ฌ๋ฆฌ Secret ์ Volume Mount ํ ๊ฒฝ์ฐ tmpfs ๋ก ๋ง์ดํธ ๋ฉ๋๋ค.
tmpfs ๋ RAM ๊ธฐ๋ฐ์ ๊ฐ์ ํ์ผ ์์คํ ์ผ๋ก ๋ฌผ๋ฆฌ์ ์ธ ํ๋์จ์ด๊ฐ ํ์ทจ ๋นํด๋ ๊ณต๊ฒฉ์๊ฐ ์ํฌ๋ฆฟ์ ์ทจ๋ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Env ์ ๋ฌ๋ฆฌ Secret ์ data ๊ฐ password, username ์ ํ์ผ๋ก ์กด์ฌํฉ๋๋ค. ์ด ํ์ผ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ ๊ฑธ๋ ค์๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค. ์ค์ ํ์ผ์ ..data ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ Secret ์ data ๊ฐ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ง์ฝ ํ๋ํ๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ด์ฉํด ๋ณผ ์ ์์ต๋๋ค.
Volume ์ ํตํด ํ๋ํ๋ Secret ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
apiVersion: v1
data:
password: Mzk1MjgkdmRnN0pi # 39528$vdg7Jb
username: bXktYXBw # my-app
kind: Secret
metadata:
name: volume-basic-secret
---
apiVersion: v1
kind: Pod
metadata:
name: volume-basic-secret
spec:
containers:
- name: tester
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: volume-basic-secret
items:
- key: username
path: my-group/my-username
Volume ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ Env ์ ๋ฌ๋ฆฌ ๋ง์ดํธ ๊ฒฝ๋ก๊ฐ ์กด์ฌํฉ๋๋ค.
/etc/foo ๋ฐ์ /my-group/my-username ์ usernmae ์ data ๋ง ๋ง์ดํธ ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ ์ฟ ๋ฒ๋คํฐ์ค์์ posix ๋ก ํ์ผ์ ๋ง์ดํธํ๊ธฐ ๋๋ฌธ์ ๊ถํ ์ค์ ๋ ํ ์ ์์ต๋๋ค.
Volume ์ ํตํด ์ ๋ฌ๋ Secret ์ ๋ฐ์ดํฐ ๊ถํ ์ค์
(๊ณต์ ๋ฌธ์๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ)
apiVersion: v1
data:
password: Mzk1MjgkdmRnN0pi # 39528$vdg7Jb
username: bXktYXBw # my-app
kind: Secret
metadata:
name: volume-posix-secret
---
apiVersion: v1
kind: Pod
metadata:
name: volume-posix-secret
spec:
containers:
- name: test
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: volume-posix-secret
defaultMode: 0400
Volume ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ Env ์ ๋ฌ๋ฆฌ ๋ง์ดํธ ๊ฒฝ๋ก๊ฐ ์กด์ฌํฉ๋๋ค.
์ด? ์ด์ํฉ๋๋ค.. 0400 ์ผ๋ก ์ค์ ํ๋๋ฐ ์ค์ ๋ก ๋ณด๋ 0777 ์ ๋๋ค.
์ด๋ ์ฌ์ค ์ ๋๋ก ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๋ณด๋ฉด ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ ๊ฑธ๋ ค ์๋๋ฐ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ํน์ง์ ์๊ฐํด๋ณด๋ฉด ํฌ๊ฒ ๋ฌธ์ ๋ ๊ฒ์ ์์ด๋ณด์ ๋๋ค.
์ฌ๋ณผ๋ฆญ ๋งํฌ์ ๋์ ํ์ผ์ ์ค์ ๋ก 0400 ์ด ์ ์ค์ ๋์ด์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ Secret ์ data ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค. ๋งค๋ฒ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด์ฃ ..
Configmap ์ data ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ Secret ๊ณผ 99% ์ ์ฌํฉ๋๋ค. Secret ์ ์๋ฉด Configmap ๋ํ ์ฝ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ฃ .
ํน์ดํ ์ ์ Configmap ์ ๊ฒฝ์ฐ Volume ์ ์ฌ์ฉํด๋ ๋ง์ดํธ๊ฐ ๋์ง ์์ต๋๋ค. (df -h ์ ๊ฒฐ๊ณผ๊ฐ์ด ์์)
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!