[Kubernetes] ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ์ค์
๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ง๊ธ๊น์ง ๋ฐฐ์ด ์ฟ ๋ฒ๋คํฐ์ค์ ์ค๋ธ์ ํธ๋ค์ธ ํ๋, ๋ ํ๋ฆฌ์นด์ , ๋ํ๋ก์ด๋จผํธ, ์๋น์ค์ ๊ฐ์ ๋ฆฌ์์ค๋ค์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ๋ค์ ๋ํด ๋ฐฐ์๋ณด๋๋ก ํ์. ๊ทธ ์ค์์๋ ์ด๋ฒ ํฌ์คํ ์์๋ ๋ค์์คํ์ด์ค, ์ปจํผ๊ทธ๋งต, ์ํฌ๋ฆฟ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ ค๊ณ ํ๋ค.
1. ๋ฆฌ์์ค๋ฅผ ๊ตฌ๋ถํ๋ ์ฅ๋ฒฝ, ๋ค์์คํ์ด์ค(Namespace)
์ด์ ์ ๋ฐฐ์ ๋ ๋์ปค๋ ๋์ปค ์ค์์ ๋ฐฐ์ ์ ๋๋ ๋ฐฐํฌํ ์ปจํ ์ด๋๋ค์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ด ์์๋ค. ์๋ฅผ ๋ค์ด, 100๊ฐ์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ ํ, docker ps -a ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐํฌํ 100๊ฐ์ ์ปจํ ์ด๋๋ค์ด ๋ชจ๋ ์ถ๋ ฅ์ด ๋์๋ค. ๋ฌผ๋ก key : value ํํ๋ก ์ปจํ ์ด๋์ ๋ ์ด๋ธ์ ๋ถ์ฌ ์ผ์ข ์ ํํฐ๋ง์ ์ ์ฉํ ์ ์๊ธด ํ์ง๋ง, ์ข ๋ ๋ช ํํ๊ฒ ์ปจํ ์ด๋๋ค์ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ค.
ํ์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค๋ ์ฉ๋๋ ๋ชฉ์ ์ ๋ฐ๋ผ ํ๋, ๋ ํ๋ฆฌ์นด์ ๋ฑ๊ณผ ๊ฐ์ ์ปจํ ์ด๋์ ๊ด๋ จ๋ ๋ฆฌ์์ค๋ค์ ๊ตฌ๋ถ ์ง์ด ๊ด๋ฆฌํ ์ ์๋ ๋ณ๋์ ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋ค. ๋ฐ๋ก ๋ค์์คํ์ด์ค ์ค๋ธ์ ํธ์ด๋ค. ๋ง์ฝ ์ฌ๋ฌ ๊ฐ๋ฐ ์กฐ์ง์ด ํ๋์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๊ณต์ ํด ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ์กฐ์ง๋ณ๋ก ๋ค์์คํ์ด์ค๋ฅผ ๊ตฌ์ฑํด์ ๊ฐ ๋ค์์คํ์ด์ค์ ๊ฐ ์กฐ์ง์ด ์ฌ์ฉํ๋ ํ๋, ๋ํ๋ก์ด๋จผํธ, ์๋น์ค ๋ฑ๊ณผ ๊ฐ์ ๋ฆฌ์์ค๋ค์ ์ค์ ํ ์ ์๋ค. ๋ค์์คํ์ด์ค๋ ๋ง์น ํ๋์ ํด๋ฌ์คํฐ ๋ด๋ถ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๋๋์ด๋ค.(๋ฌผ๋ก ์ค์ ๋ก ๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์๋๋ค. ์คํดํ์ง ๋ง์)
๋ค์์คํ์ด์ค๋ฅผ ์ข ๋ ์ ๋๋ก ์ดํดํ๊ธฐ ์ํด์ ์ค์ต๊ณผ ๊ฐ์ด ์งํํด๋ณด์. ์ผ๋จ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค์์ ์๋ฌด๋ฐ ์ค์ ์ ํด์ฃผ์ง ์์ผ๋ฉด ์๋์ ๊ฐ์ด 4๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ์ค์ ๋์ด ์๋ค.
์์์ ๋ณด์ฌ์ง๋ ๋ค์์คํ์ด์ค๋ค ๊ฐ๊ฐ์ ํ๋, ๋ ํ๋ฆฌ์นด์ , ๋ํ๋ก์ด๋จผํธ, ์๋น์ค์ ๊ฐ์ ๋ฆฌ์์ค๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๊ณ ์์ฑํ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก default ๋ผ๋ ๋ค์์คํ์ด์ค์ ํ ๋น๋๋ค. ๋ง์ฝ ํน์ ๋ค์์คํ์ด์ค์๋ง ์กด์ฌํ๋ ๋ฆฌ์์ค๋ค์ ๋ณด๋ ค๋ฉด --namespace ์ต์ ์ ๋ฃ์ด ์ฃผ๋ฉด ๋๋ค.
$ kubectl get pods --namespace kube-system
$ kubectl get pods -n kube-system
์ฐธ๊ณ ๋ก ์์์ ์ค์ ํ kube-system ์ด๋ผ๋ ๋ค์์คํ์ด์ค๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๊ตฌ์ฑ์ ํ์์ ์ธ ์ปดํฌ๋ํธ๋ค๊ณผ ์ค์ ๊ฐ๋ค์ด ์กด์ฌํ๋ ๋ค์์คํ์ด์ค์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ ๋ค์์คํ์ด์ค์ ๋ผ๋ฒจ ๊ฐ์ ์ฐจ์ด์ ์ ๋ํด ๊ถ๊ธํดํ ์ ์๋ค. ์ฌ๊ธฐ์ '๋ผ๋ฒจ'์ด๋ผ ํจ์ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ํ๋์ ๋ ํ๋ฆฌ์นด์ ๊ฐ์ ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ ๋ผ๋ฒจ ์ ๋ ํฐ(Label Selector)์ด๋ค. ๊ฒฐ๋ก ์ ๋ค์์คํ์ด์ค๊ฐ ๋ผ๋ฒจ๋ณด๋ค ๋์ฑ ๋์ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ResourceQuota ๋ผ๋ ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํด ํน์ ๋ค์์คํ์ด์ค์์ ์์ฑ๋๋ ํ๋์ ์์ ์ฌ์ฉ๋์ ์ ํํ๊ฑฐ๋, ์ ๋๋ฏธ์ ์ปจํธ๋กค๋ฌ๋ผ๋ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ํน์ ๋ค์์คํ์ด์ค์ ์์ฑ๋๋ ํ๋์๋ ์ฌ์ด๋์นด ์ปจํ ์ด๋๋ฅผ ๋ถ์ผ ์ ์๋๋ก ํ๋ค๋์ง๊ฐ ๊ฐ๋ฅํ๋ค. ๋ํ ๋ชจ๋ํฐ๋ง, ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ธ๊ทธ๋ ์ค ๋ฑ์ ํน์ ๋ชฉ์ ์ ์ํด์๋ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
1-1. ๋ค์์คํ์ด์ค ์์ฑํ๊ธฐ
๊ทธ๋ฌ๋ฉด ์ด์ YAML ํ์ผ ๋๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํด๋ณด์. ์ฌ์ฉํ YAML ํ์ผ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
apiVersion: v1
kind: Namespace
metadata:
name: zedd-default
YAML ํ์ผ์ ํตํด ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ ๋๋ kubectl apply ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ง์ฝ์ ๋ช ๋ น์ด๋ก ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ์์ฑํ๊ณ ์ถ๋ค๋ฉด ์๋์ฒ๋ผ ์คํํ๋ฉด ๋๋ค.
$ kubectl create namespace zedd-default
์ด์ ๊ทธ๋ฌ๋ฉด ์์์ ์์ฑํ ๋ค์์คํ์ด์ค์๋ค๊ฐ ๋ํ๋ก์ด๋จผํธ, ์๋น์ค ๊ฐ์ ์ค๋ธ์ ํธ๋ค์ ์์ฑํด๋ณด์. ์์ง์ ์์ฑํ ๋ค์์คํ์ด์ค์ ํ ๋น๋ ๋ฆฌ์์ค๊ฐ ์๋ ์ํ๋ค.
์ด์ ๋ํ๋ก์ด๋จผํธ, ์๋น์ค๋ฅผ ์์ฑํ๋ YAML ํ์ผ์ ์๋์ ๊ฐ๋ค. ํด๋น ํ์ผ์ ๊ธฐ์กด์ ์ค์ตํ ๋ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๋, ๋ค์์คํ์ด์ค ์ค์ ํ๋ ๋ถ๋ถ๋ง ์ถ๊ฐ๋์๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment-ns
namespace: zedd-default
spec:
replicas: 1
selector:
matchLabels:
app: webserver
template:
metadata:
name: my-webserver
labels:
app: webserver
spec:
containers:
- name: my-webserver
image: alicek106/rr-test:echo-hostname
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: hostname-svc-clusterip-ns
namespace: zedd-default
spec:
ports:
- name: web-port
port: 8080
targetPort: 80
selector:
app: webserver
type: ClusterIP
์ YAML ํ์ผ๋ก ํ๋๊ฐ ์ ์์ฑ๋์๋์ง ์ดํด๋ณด๊ธฐ ์ํด์ ๋ชจ๋ ๋ค์์คํ์ด์ค์ ํ๋๋ฅผ ์ถ๋ ฅํด๋ณด๋๋ก ํ์. --all-namespaces ์ต์ ์ ์ฃผ์ด ํ์ธํ ์ ์๋ค.
$ kubectl get pods --all-namespaces
1-2 .๋ค์์คํ์ด์ค ๋ด์ ์๋น์ค์ ์ ๊ทผํ๊ธฐ
์ด๋ฒ์ ์์์ ์์ฑํ zedd-deafult ๋ค์์คํ์ด์ค ๋ด์ ์๋น์ค์ ์ ๊ทผํด๋ณด๋๋ก ํ์. ์ด์ ํฌ์คํ ์์ ์๋น์ค ์ค๋ธ์ ํธ์ ๋ํด ์ค๋ช ํ๋ฉด์, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด๋ถ์์ ํน์ ํ๋๋ด์์ ๋ค๋ฅธ ํ๋๋ก ํต์ ํ ๋, ์๋น์ค์ ์ด๋ฆ์ ์ผ์ข ์ ๋๋ฉ์ธ์ผ๋ก ํ์ฌ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฐํ ๋งํ๋ฉด, "๊ฐ์ ๋ค์์คํ์ด์ค ๋ด์ ์๋น์ค"์ผ ๊ฒฝ์ฐ์๋ง ์๋น์ค ์ด๋ฆ์ผ๋ก ์ ๊ทผํ ์๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, zedd-default ๋ผ๋ ๋ค์์คํ์ด์ค์ ๋ด๊ฐ ์๋น์ค๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์๋น์ค์ ์ ๊ทผํ๊ธฐ ์ํด ํน์ ํ๋๋ฅผ ํ๋ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฐ๋ฐ ์ด ํ๋๋ default ๋ผ๋ ๋ค์์คํ์ด์ค ๋ด์ ์์ฑ๋ ํ๋์ด๋ค. ์ด๋ด ๊ฒฝ์ฐ, default ๋ค์์คํ์ด์ค ๋ด์ ์๋ ํ๋๋ zedd-default ๋ผ๋ ๋ค์์คํ์ด์ค ๋ด์ ์๋น์ค์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์๋น์ค ์ด๋ฆ์ ํน์ ๊ท์น์ ๋ง๊ฒ ๋ช ์ํ๋ค๋ฉด ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋๋ผ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ ๊ท์น์ ์๋์ ๊ฐ๋ค.
{SERVICE NAME}.{NAMESPACE NAME}.svc
# ์๋๊ฐ ์๋น์ค์ Fully Qualified Domain Name(FQDN)์. ์๋์ฒ๋ผ ์ ์ํด๋ ํต์ ๊ฐ๋ฅ
{SERVICE NAME}.{NAMESPACE NAME}.svc.cluster.local
๋ค์์คํ์ด์ค๋ kubectl delete ๋ช ๋ น์ด๋ก ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค. ๋จ, ๋ค์์คํ์ด์ค๋ฅผ ์ญ์ ํ๋ฉด ํด๋น ๋ค์์คํ์ด์ค ์กด์ฌํ๋ ๋ชจ๋ ๋ฆฌ์์ค ๋ํ ํจ๊ป ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ๋ค์์คํ์ด์ค๋ฅผ ์ญ์ ํ ๋ ๋ฐ๋์ ์ ์คํด์ง๋ ์ต๊ด์ ๊ฐ๋๋ก ํ์.
1-3. ๋ค์์คํ์ด์ค์๋ ์ข ์์ ์ธ ๋๋ ๋ ๋ฆฝ์ ์ธ ์ค๋ธ์ ํธ
์์์ ๋ค์์คํ์ด์ค๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์ฐ๋ฆฌ๋ ํ๋, ๋ ํ๋ฆฌ์นด์ , ๋ํ๋ก์ด๋จผํธ, ์๋น์ค๋ผ๋ ์ค๋ธ์ ํธ๊ฐ ๋ค์์คํ์ด์ค์ ๋ฐ๋ผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถ๋๋ ์ฆ, ๋ค์์คํ์ด์ค์ ์ข ์๋๋ค๋ ์ฌ์ค์ ๋ฐฐ์ ๋ค. ์ด๋ฅผ ์ค๋ธ์ ํธ๊ฐ ๋ค์์คํ์ด์ค์ ์ํ๋ค ํ์ฌ object is namespaced ๋ผ๊ณ ๋ ํ๋ค. ๋ค์์คํ์ด์ค์ ์ํ๋ ์ค๋ธ์ ํธ๋ค์ด ๋ฌด์์ด ์๋์ง ๋ณด๊ธฐ ์ํด์๋ --namespaced ์ต์ ์ true๋ก ์ฃผ์ด ํ์ธํ ์ ์๋ค.
$ kubectl api-resources --namespaced=true
๊ทธ๋ฌ๋ฉด ๋ค์์คํ์ด์ค์ ๋ ๋ฆฝ์ ์ด์ง ์์ ์ค๋ธ์ ํธ๋ค๋ ์์๊น? ๋น์ฐํ๋ค. ๋ํ์ ์ผ๋ก ๋ ธ๋๋ผ๋ ์ค๋ธ์ ํธ๊ฐ ๊ทธ๋ ๋ค. ๋ ธ๋๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์ฌ์ฉ๋๋ ์ ์์ค์ ์ค๋ธ์ ํธ์ด๋ฉฐ, ๋ค์์คํ์ด์ค์ ์ํด ๊ตฌ๋ถ๋์ง ์๋๋ค. ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ์ค๋ธ์ ํธ๊ฐ ๋ฌด์์ด ์๋์ง ๋ณด๊ธฐ ์ํด์๋ ์ ๋ช ๋ น์ด์์ false๋ก ๋ฐ๊พธ์ด์ฃผ๋ฉด ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
2. ์ค์ ๊ฐ์ ํ๋์ ์ ๋ฌํ์, Configmap ๊ณผ Secret
์ด๋ฒ์๋ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํตํด ๋ฐฐํฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์ฌ์ฉํ ์ค์ ๊ฐ์ ๋์ ์ผ๋ก ์ ์ดํ ์ ์๋๋ก ํด์ฃผ๋ ์ปจํผ๊ทธ๋งต(Configmap)๊ณผ ์ํฌ๋ฆฟ(Secret)์ ๋ํด ์์๋ณด์. ์ฌ์ค ์ด์ ์ ๋์ปค ์ค์์ ๋ฐฐ์ฐ๋ฉด์ ๊ทธ ๋๋ ๋์ผํ๊ฒ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ๋ํด ๋ฐฐ์ด์ ์ด ์๋ค. ๊ทธ ๋ ๋ฐฐ์ ๋ ์ญํ ๋ค๊ณผ ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋งค์ฐ ์ ์ฌํ๋ค.
๋ฌผ๋ก ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์ฌ์ฉํ ์ค์ ๊ฐ๋ค์ ์ธํ ํ ์ ์๋ค. ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋น๋ํ (๋์ปค) ์ด๋ฏธ์ง ๋ด๋ถ์ ํ๊ฒฝ ๋ณ์ ๋๋ ํ์ผ์ ํํ๋ก ์ค์ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ์ง์ ํด๋์ ์ ์๋ค. ํ์ง๋ง ๋์ปค ์ด๋ฏธ์ง๋ ํ ๋ฒ ๋น๋๋ฅผ ํ๋ฉด ๋ถ๋ณ์ ์ํ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ค๊ฐ์ ์ค์ ๊ฐ๋ค์ ๋ณ๊ฒฝํด์ผ ํ๋ ์ํฉ์ด ์๊ธฐ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋น๋ํด์ผ ํ๋ ๊ท์ฐฎ์์ด ๋ฐ์ํ๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฟ ๋ฒ๋คํฐ์ค ํ๋๋ฅผ ์ ์ํ๋ YAML ํ์ผ ๋ด๋ถ์ env ํค์๋๋ก ๊ฐ ํ๊ฒฝ๋ณ์ ์ด๋ฆ๊ณผ ๊ทธ์ ๊ฐ์ ์ ์ํ ์ ์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋์ฝ๋ฉํ๋ ๋ฐฉ์์ ์ํฉ์ ๋ฐ๋ผ ๋จ์ ์ด ์กด์ฌํ๋ค. ๋ง์ฝ ํน์ ์ค์ ๊ฐ๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง YAML ํ์ผ ๋ด์ฉ์ด ๋ชจ๋ ๊ฐ์ ์ํฉ, ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ด์ ํ๊ฒฝ์์ ๊ฐ๊ฐ ๋ฐฐํฌํ๋ ํ๋๋ฅผ ์ํ YAML ํ์ผ์ ์ ์ํ๋ค๊ณ ํ๋ฉด ์ด๋ค ํ๊ฒฝ์ธ์ง๋ฅผ ๋ํ๋ด๋ ํน์ env ๊ฐ๋ง ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋์ผํ ๊ฒ์ด๊ณ , ๊ฒฐ๊ตญ ๊ฑฐ์ ๋น์ทํ ๋ด์ฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ YAML ํ์ผ 2๊ฐ๋ฅผ ๋ฐ๋ก ์ ์ํด์ผ ํ๋ค.
๋ง์ฝ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ๋ค๋ฉด ์์ ๊ฐ์ ์ํฉ์ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก, ์ปจํผ๊ทธ๋งต์๋ ์ค์ ๊ฐ์, ์ํฌ๋ฆฟ์๋ ๋ณด์์ ๋ ธ์ถ๋์ด์๋ ์๋๋ ๊ฐ๋ค์ ์ ์ฅํ ์ ์๋ค. ์ด๋ ๊ฒ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ํ์ฉํ๋ค๋ฉด ์ค์ ๊ฐ๋ค์ ํ๋์ ๋ถ๋ฆฌํ์ฌ ๋ณ๋์ ์ค๋ธ์ ํธ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด์ ํ๋์ฉ ์์๋ณด๋๋ก ํ์. ๋จผ์ ์ปจํผ๊ทธ๋งต์ด๋ค.
2-1. ์ปจํผ๊ทธ๋งต(Configmap)
์ปจํผ๊ทธ๋งต์ ๋ณด์์ ๋ ธ์ถ๋์ด๋ ์๊ด์ด ์๋ ์ผ๋ฐ์ ์ธ ์ค์ ๊ฐ์ ๋ด์ ์ ์ฅํ ์ ์๋ ์ค๋ธ์ ํธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์คํ์ด์ค์ ์ข ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ค์์คํ์ด์ค ๋ณ๋ก ์ปจํผ๊ทธ๋งต์ด ์กด์ฌํ๋ค. ์ด์ ์ปจํผ๊ทธ๋งต์ ์์ฑํด๋ณด๋๋ก ํ์. YAML ํ์ผ์ ์ง์ ์ ์ํด์ ์ปจํผ๊ทธ๋งต์ ์์ฑํ ์๋ ์์ง๋ง kubectl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค. ์๋ ๋ช ๋ น์ด ํ์์ ํตํด์ ์ปจํผ๊ทธ๋งต์ ํ๋ ์์ฑํด๋ณด์.
$ kubectl create configmap [CONFIGMAP NAME] --from-literal [KEY]=[VALUE]
$ kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG
--from-literal ์ต์ ์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด์ ์ฌ๋ฌ ๊ฐ์ key=value ํํ๋ก ์ปจํผ๊ทธ๋งต์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ ์ ์๋ค. ์๋์ฒ๋ผ ๋ง์ด๋ค.
$ kubectl create configmap zedd-configmap \
--from-literal LOG_LEVEL=DEBUG \
--from-literal NAME=ZEDD
๊ทธ๋ฆฌ๊ณ ์์ฑํ ์ปจํผ๊ทธ๋งต์ ์์ธํ ๋ด์ฉ์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ 2๊ฐ์ง ๋ช ๋ น์ด ์ค ํ๋ ์ ํํด์ ๋ณผ ์ ์๋ค.
$ kubectl describe configmap [CONFIGMAP NAME]
$ kubectl get configmap [CONFIGMAP NAME] -o yaml
๋ง์ฝ ์ปจํผ๊ทธ๋งต ์ด๋ฆ์ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ๋ชจ๋ ์ปจํผ๊ทธ๋งต์ ๋ํ ๋ด์ฉ์ด ์ถ๋ ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑํ ์ปจํผ๊ทธ๋งต์ ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด kubectl get configmap ๋๋ kubectl get cm ์ด๋ผ๋ ๋ช ๋ น์ด๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
์ด์ ์ปจํผ๊ทธ๋งต์ ์์ฑํด๋ณด์์ผ๋, ๋ค์์ผ๋ก๋ ํ๋์์ ํด๋น ์ปจํผ๊ทธ๋งต์ ๊ฐ์ ธ์ ๋ณผ ์ฐจ๋ก์ด๋ค. ํ๋์์ ์ปจํผ๊ทธ๋งต์ ์ฌ์ฉํ๋ ค๋ฉด ํ๋, ๋ ํ๋ฆฌ์นด์ , ๋ํ๋ก์ด๋จผํธ ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ YAML ํ์ผ์ ํ๋ ํ ํ๋ฆฟ ๋ด์ ์๋์ฒ๋ผ ์ ์ํด์ฃผ๋ฉด ๋๋ค.(์๋์์๋ ํ๋ ํ ํ๋ฆฟ ๋ถ๋ถ๋ง ๋ฐ์ทํ์๋ค)
spec:
containers:
- name: zedd-webserver
env:
valueFrom:
configMapKeyRef:
name: log-level-configmap
key: LOG_LEVEL
๊ทธ๋ฐ๋ฐ ์์ ๊ฐ์ด YAML ํ์ผ์ ์ปจํผ๊ทธ๋งต์ ์ ์ํ๊ณ ํ๋๋ฅผ ๋ฐฐํฌํ๊ฒ ๋๋ค๋ฉด ๋ด๋ถ์ ์ผ๋ก ํ๋๊ฐ ์ปจํผ๊ทธ๋งต์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ ๊ฑธ๊น? ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ์ด 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ ์ ํ ๊ฒ์ ์ ํํ๋ ๊ธฐ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ค์ฝ๋ ๋ด๋ถ์์ ์ด๋ป๊ฒ ์ค์ ๊ฐ์ ์ฝ์ด๋ค์ด๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
2-1-1. ์ปจํ ์ด๋์ ํ๊ฒฝ ๋ณ์๋ก ์ปจํผ๊ทธ๋งต ์ฌ์ฉํ๊ธฐ
๊ฐ์ฅ ๋จผ์ ์์๋ณผ ๋ฐฉ๋ฒ์ ์ปจํผ๊ทธ๋งต์ ๊ฐ์ ์ปจํ ์ด๋์ ํ๊ฒฝ๋ณ์๋ก ์ฝ์ด๋ค์ด๋ ๋ฐฉ๋ฒ์ด๋ค. ์ปจํผ๊ทธ๋งต์ ์ ์ฅ๋ key=value ํํ์ ๋ฐ์ดํฐ๊ฐ ์ปจํ ์ด๋์ ํ๊ฒฝ๋ณ์์ ๊ทธ๋๋ก ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปจํผ๊ทธ๋งต์ ์ฐ๋ฆฌ๋ MY_CONFIG=ZEDD ๋ก ์ค์ ํ๋ค๊ณ ํ๋ค๋ฉด ์ปจํ ์ด๋ ๋ด๋ถ ํฐ๋ฏธ๋์์ echo $MY_CONFIG ๋ฅผ ์ ๋ ฅํ๋ฉด ZEDD ๋ผ๋ ๊ฐ์ด ๋์ค๊ฒ ๋๋ค. ๊ทธ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์์คํ ํ๊ฒฝ ๋ณ์๋ก๋ถํฐ ์ค์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ฌ๋ฉด ์ปจํผ๊ทธ๋งต์ ์ค์ ๊ฐ์ ์ปจํ ์ด๋์ ํ๊ฒฝ ๋ณ์๋ก ๊ฐ์ ธ์ ๋ณด๋ ์ค์ต์ ์งํํด๋ณด์. ์ ์ฉํด๋ณผ YAML ํ์ผ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
apiVerson: v1
kind: Pod
metadata:
name: container-env-zedd
spec:
containers:
- name: zedd-container
image: busybox
args: ['tail', '-f', '/dev/null']
envFrom:
- configMapRef:
name: log-level-configmap
- configMapRef:
name: start-k8s
์ ํ์ผ ๋ด์ฉ ์ค ์ค์ํ ๋ถ๋ถ์ envFrom ๊ณผ configMapRef ํค์๋์ด๋ค. ์์์ ์์ฑ๋ ๋ด์ฉ์ log-level-configmap ๊ณผ start-k8s ๋ผ๋ ์ปจํผ๊ทธ๋งต์ผ๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ ํ๊ฒฝ๋ณ์๋ฅผ ์์ฑํ๋๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, envFrom ํญ๋ชฉ์ ํ์์ ์ ์ด์ค ํ๋์ ์ปจํผ๊ทธ๋งต์ด ์ฌ๋ฌ ๊ฐ์ key:value๋ฅผ ๊ฐ๊ณ ์๋ค๋ฉด ๊ทธ ๋ชจ๋๋ฅผ ํ๊ฒฝ๋ณ์๋ก ๊ฐ์ ธ์ค๋๋กํ๋ค. ๋ง์ฝ ์ YAML ํ์ผ์ ์ ์๋ ์ปจํผ๊ทธ๋งต์ด ์์ฑ๋์ด ์์ง ์์ ์ํ๋ผ๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์ํํด์ฃผ์.
$ kubectl create configmap log-level-configmap \
--from-literal LOG_LEVEL=DEBUG && \
kubectl create configmap start-k8s \
--from-literal k8s=kubernetes \
--from-literal container=docker
์ด์ YAML ํ์ผ์ kubectl apply ๋ช ๋ น์ด๋ฅผ ํ์ฉํด์ ๋ฐฐํฌํด๋ณด๋๋ก ํ์. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค์ ๋ฐฐํฌํ ํ๋ ๋ด์ ์ค์ ๋ก ํ๊ฒฝ๋ณ์๊ฐ ์ ์ค์ ๋์๋์ง ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํด๋ณด์.
$ kubectl exec container-env-zedd printenv | grep -E "(LOG|container|k8s)"
ํฐ๋ฏธ๋ ํ๋ฉด์ ๋ณด๋ฉด ์์์ YAML ํ์ผ์ ์ ์ํ ์ปจํผ๊ทธ๋งต์ key:value ๊ฐ๋ค์ด ํ๋ ๋ด ํ๊ฒฝ ๋ณ์๋ก ์ ์ค์ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฒ์๋ ์ปจํผ๊ทธ๋งต์ ๋ชจ๋ ํ๊ฒฝ๋ณ์๋ฅผ ํ๋ ๋ด์ ์ค์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ปจํผ๊ทธ๋งต์ ํน์ key:value๋ง ํ๋ ๋ด์ ํ๊ฒฝ๋ณ์๋ก ์ค์ ํด๋ณด๋๋ก ํ์. ์ด๋ฒ์๋ valueFrom ๊ณผ configMapKeyRef ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์๋ YAML ํ์ผ์ ์ดํด๋ณด์.
apiVersion: v1
kind: Pod
metadata:
name: container-env-zedd-v2
spec:
containers:
- name: zedd-container
image: busybox
args: ['tail', '-f', '/dev/null']
env:
- name: ENV_KEYNAME_1
valueFrom:
configMapKeyRef:
name: log-level-configmap
key: LOG_LEVEL
- name: ENV_KEYNAME_2
valueFrom:
configMapKeyRef:
name: start-k8s
key: k8s
env ํญ๋ชฉ์ ๋ด์ฉ์ ์ดํด๋ณด์. ์ฐ์ ์ปจํผ๊ทธ๋งต์์ ์ ํ์ ์ผ๋ก ๊ฐ์ ธ์ฌ key:value๋ฅผ ํ๋ ๋ด์์ ์ด๋ค ํ๊ฒฝ๋ณ์ ์ด๋ฆ์ผ๋ก ์ค์ ํ ์ง ๋ํ๋ผ ์ ์๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ENV_KEYNAME_1 ๊ณผ ENV_KEYNAME_2์ ํด๋นํ๋ค. ๊ทธ๋ฆฌ๊ณ valueFrom ํค์๋๋ฅผ ํตํด์ ์ด๋ค ์ปจํผ๊ทธ๋งต์ ์ด๋ค key๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง configMapKeyRef ํค์๋๋ฅผ ํตํด ๋ํ๋ผ ์ ์๋ค. ์ YAML ํ์ผ ๋ด์ฉ์ ํ๋๋ฅผ ์๋กญ๊ฒ ๋ฐฐํฌํ๊ณ , ํ๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ ํ๊ฒฝ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์.
$ kubectl exec container-env-zedd-v2 printenv | grep -E "(KEYNAME)"
ํฐ๋ฏธ๋ ํ๋ฉด์ ๋ณด๋ฉด ํด๋น ํ๋ ๋ด๋ถ์ ํ๊ฒฝ๋ณ์์ YAML ํ์ผ๋ก ๋ช ์ํด์ค ํ๊ฒฝ๋ณ์ ๊ฐ์ด ์ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
2-1-2. ์ปจํผ๊ทธ๋งต์ ๊ฐ์ ํ์ผ ํํ๋ก ํ๋ ๋ด๋ถ์ ๋ง์ดํธํ๊ธฐ
๋ค์์ ์ปจํผ๊ทธ๋งต์ ๊ฐ์ ํ๋ ๋ด์ ํ๊ฒฝ๋ณ์๊ฐ ์๋ ํ์ผ ํํ๋ก ๋ง์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ์ด๋ฒ์ ์ฌ์ฉํ ํค์๋๋ volumeMounts ์ volumes ์ด๋ค. ์ฌ๊ธฐ์ ์ฟ ๋ฒ๋คํฐ์ค์์์ ๋ณผ๋ฅจ์ด๋ผ๋ ๊ฒ์ ํ์ฉํ๋ค. ์ด ๋ณผ๋ฅจ์ ๋์ปค ํฌ์คํ ์๋ฆฌ์ฆ์์ ๋ฐฐ์ ๋ ๋ณผ๋ฅจ๊ณผ ๊ธฐ๋ฅ์ด ๊ฑฐ์ ์ ์ฌํ๋ค. ์ฆ, ์ปจํผ๊ทธ๋งต์ ๋ง์ดํธํ๊ธฐ ์ํด ๋ณผ๋ฅจ์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์๋ YAML ํ์ผ ๋ด์ฉ ์์๋ฅผ ์ดํด๋ณด์.
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-all-pod
spec:
containers:
- name: zedd-container
image: busybox
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: start-k8s
์๋กญ๊ฒ ์ถ๊ฐ๋ ํญ๋ชฉ๋ค์ ๋ํด ์์๋ณด์.
- spec.volumes : ์๋กญ๊ฒ ์์ฑํ ๋ณผ๋ฅจ์ ์ด๋ฆ์ ๋ช ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ณผ๋ฅจ์ด ์ฌ์ฉํ ์ปจํผ๊ทธ๋งต์ด ๋ฌด์์ธ์ง ์ ์ํ๋ค.
- spec.containers.volumeMounts : ์ด์ฉํ ๋ณผ๋ฅจ์ ๋ช ์ํ๊ณ , ํ๋ ๋ด์์ ๋ง์ดํธํ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํด์ค๋ค.
์ด์ ์ YAML ํ์ผ ๋ด์ฉ์ผ๋ก ํ๋๋ฅผ ๋ฐฐํฌํ๊ณ ํ๋ ๋ด๋ถ์ /etc/config ๊ฒฝ๋ก๋ก ์ด๋ํด๋ณด์.
$ kubectl exec -it configmap-volume-all-pod ls /etc/config
container, k8s ๋ผ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ ํํ์ ํ์ผ์ด 2๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด ๋ ํ์ผ ์ด๋ฆ์ ์ปจํผ๊ทธ๋งต์ key์ ํด๋นํ๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ํ์ผ ๋ด์ฉ์ ๊ทธ๋ผ ๋ฌด์์ด ๋ค์ด์์๊น? cat ๋ช ๋ น์ด๋ฅผ ํ์ฉํด ์ด์ด๋ณด์. ํ์ผ ๋ด์ฉ์ ๋ฐ๋ก ์ปจํผ๊ทธ๋งต์ ํน์ key์ ํด๋นํ๋ value ๊ฐ์ด ๋ค์ด์๋ค.
$ kubectl exec configmap-volume-all-pod cat /etc/config/container && \
kubectl exec configmap-volume-all-pod cat /etc/config/k8s
์ด๋ฒ์๋ ์ปจํผ๊ทธ๋งต์์ ์ํ๋ key:value ์ ๋ฐ์ดํฐ๋ง ํ๋ ๋ด์ ํ์ผ๋ก ๋ง์ดํธํด๋ณด๋๋ก ํ์. ๋ฐฉ๊ธ ๋ฐฐํฌํ YAML ํ์ผ ๋ด์ฉ์์ spec.volumes ๋ถ๋ถ์ ๊ฐ๋จํ๊ฒ ์ถ๊ฐ๋ง ํด์ฃผ๋ฉด ๋๋ค. ์๋ ๋ด์ฉ์ ์ดํด๋ณด์.
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-all-pod-v2
spec:
containers:
- name: zedd-container
image: busybox
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: start-k8s
items:
- key: k8s
path: k8s_selected
์ถ๊ฐ๋ ๋ถ๋ถ์ spec.volumes.configMap.items ๋ถ๋ถ์ด๋ค. ํด๋น ๋ถ๋ถ์ ๋ช ์ํ ์ปจํผ๊ทธ๋งต(์ ์์์์๋ start-k8s๋ผ๋ ์ปจํผ๊ทธ๋งต)์์ ์ด๋ค key์ ๊ฐ๋ง ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง, ๊ทธ๋ฆฌ๊ณ path ๋ถ๋ถ์๋ ๊ทธ ๊ฐ์ ธ์จ ๊ฐ์ด ๋ค์ด์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฌด์์ผ๋ก ํ ์ง ๋ช ์ํด์ค๋ค. ์ YAML ํ์ผ์ ๋ฐฐํฌํ๊ณ , ํ๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์. ๊ทธ๋ฌ๋ฉด k8s ์ด๋ฆ์ด ์๋ k8s_selected ๋ผ๋ ์ด๋ฆ์ ํ์ผ์ด ์กด์ฌํ๊ฒ ๋๋ค.
$ kubectl exec configmap-volume-all-pod-v2 ls /etc/config
$ kubectl exec configmap-volume-all-pod-v2 cat /etc/config/k8s_selected
์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค์ ๋ฐ์ดํฐ๋ฅผ ํ๋ ๋ด๋ถ ๋๋ ํฐ๋ฆฌ์ ์์น์ํค๋ ๊ฒ์ ๊ณต์ ๋ฌธ์์์๋ ํฌ์ฌ(Projection)๋ผ๊ณ ํํํ๋ค.
2-1-3. ํ์ผ๋ก๋ถํฐ ์ปจํผ๊ทธ๋งต ์์ฑํ๊ธฐ
์ง๊ธ๊น์ง๋ ์ปจํผ๊ทธ๋งต์ ๋จ์ํ ๋ฌธ์์ด๋ก ํ ๋นํ๊ธฐ ์ํด --from-literal ์ต์ ์ ํ์ฉํด์ ์์ฑํ๋ค. ์ด๋ฒ์๋ ์ปจํผ๊ทธ๋งต์ ์ค์ ๊ฐ๋ค์ด ๋ค์ด์๋ ํน์ ํ์ผ๋ก๋ถํฐ ์ปจํผ๊ทธ๋งต์ ์์ฑํด๋ณด์. ์ด ๋ ์ฌ์ฉํ๋ ์ต์ ์ --from-file ์ต์ ์ด๋ค. ๋ง์ฝ ์ปจํผ๊ทธ๋งต์ผ๋ก ์ค์ ํ ํ์ผ ๋ด์ฉ์ด index.html ์ด๋ผ๊ณ ํ๋ค๋ฉด ์๋์ฒ๋ผ ์ปจํผ๊ทธ๋งต์ ์์ฑํ ์ ์๋ค. ์ฐธ๊ณ ๋ก --from-file๋ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํด์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ์ปจํผ๊ทธ๋งต์ผ๋ก ์ค์ ํ ์ ์๋ค.
$ kubectl create configmap index-configmap --from-file index.html
๊ทธ๋ฐ๋ฐ, ์ ๋ช ๋ น์ด๋ก ์ปจํผ๊ทธ๋งต์ ์์ฑํ๊ณ ๋ณผ๋ฅจ์ ํ์ฉํด ํ๋ ๋ด์ ๋ง์ดํธ์์ผฐ์ ๋, ํ๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ ๋ง์ดํธ์ํจ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ณด๋ฉด ํ์ผ์ ์ด๋ฆ์ด ์ปจํผ๊ทธ๋งต์ key๋ก, ํ์ผ์ ๋ด์ฉ์ด ์ปจํผ๊ทธ๋งต์ value๋ก ์ค์ ๋๋ค. ๋ง์ฝ ์ปจํผ๊ทธ๋งต์ key๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ฒ๋ผ ๋ฑํธ(=)๋ฅผ ํ์ฉํด์ ์ด๋ฆ์ ๋ช ์ํด์ค ์ ์๋ค.
$ kubectl create configmap index-configmap --from-file index_key=index.html
๊ทธ๋ฆฌ๊ณ .env ๋ผ๋ ํ์ฅ์์ ํ์ผ์ ์ด์ฉํด์ ์ฌ๋ฌ ๊ฐ์ key=value ๊ฐ ํํ๋ก ๊ตฌ์ฑ๋ ์ค์ ํ์ผ์ ํ๊บผ๋ฒ์ ์ปจํผ๊ทธ๋งต์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์๋์ฒ๋ผ index.env ๋ผ๋ ํ์ผ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
key1=value1
key2=value2
key3=value3
์ด .env ํ์ผ์ ์ปจํผ๊ทธ๋งต์ผ๋ก ์์ฑํ๋ ค๋ฉด --from-env-file ์ด๋ผ๋ ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
$ kubectl create configmap from-envfile --from-env-file index.env
๋ค์์ YAML ํ์ผ๋ก ์ปจํผ๊ทธ๋งต์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ, ์ปจํผ๊ทธ๋งต์ ์์ฑํ ๋ ๋ฌธ์์ด์ด๋ฉด --from-literal, ๋ง์ฝ ํ์ผ์ด๋ผ๋ฉด --from-file ๊ณผ ๊ฐ์ ์ต์ ์ ํ์ฉํ๋ ๊ฒ์ด ์๋ ์์ฑํ ์ปจํผ๊ทธ๋งต ์ค๋ธ์ ํธ๊ฐ ์ ์๋ YAML ํ์ผ์ ๋ฐฐํฌ(์ฆ, kubectl apply ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉ)ํด์๋ ์ปจํผ๊ทธ๋งต์ ์์ฑํ ์๋ ์๋ค. ๋ฐ๋ก --dry-run ๊ณผ -o yaml ์ต์ ์ ํจ๊ป ์ฌ์ฉํด์ ๋ง์ด๋ค. ์ด 2๊ฐ์ง ์ต์ ์ ์ฌ์ฉํ๋ฉด ์ปจํผ๊ทธ๋งต์ ์ค์ง์ ์ผ๋ก ์์ฑํ์ง ์์ ์ฑ๋ก ์์ฑ๋ ์ปจํผ๊ทธ๋งต์ YAML ํ์ผ ํํ๋ก ์ถ๋ ฅ์ํฌ ์ ์๋ค.
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ --dry-run ์ต์ ๋๋ฌธ์ธ๋ฐ, 'dry run' ์ด๋ผ๋ ์ฉ์ด ์์ฒด์ ์๋ฏธ๋ฅผ ๋ณด๋ฉด ๊ทธ ์ด์ ๋ฅผ ์ง์ํ ์ ์๋ค. dry run ์ด๋, ํน์ ์์ ์ ์คํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๊ฒํ ํ๋ ๋ช ๋ น์ด ๋๋ API๋ฅผ ์๋ฏธํ๋ค. ์ค์ ๋ก, ์ฟ ๋ฒ๋คํฐ์ค ๋ช ๋ น์ด(ex. kubectl apply, create, ...)์ --dry-run ์ต์ ์ ์ถ๊ฐํ๋ฉด ์คํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ ์คํ ๊ฐ๋ฅํจ์ ํ๋จํ๋๋ผ๋ ์ค์ ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ์์ฑํ์ง ์๊ฒ ๋๋ค. ๋ง์ฝ์ ์๋ฌ๊ฐ ๋๋ YAML ํ์ผ์ ์คํํ๊ณ ์ ํ๋ฉด ์๋์ ๊ฐ์ด ์๋ฌ๊ฐ ๋ ๊ฒ์์ ์์(?)ํด์ค๋ค.
๊ทธ๋ผ ์ด์ --dry-run ๊ณผ -o yaml ์ต์ ์ ๊ฐ์ด ์ฌ์ฉํด์ ์์ฑํ ์ปจํผ๊ทธ๋งต์ YAML ํ์ผ ๋ด์ฉ์ผ๋ก ์ถ๋ ฅ์์ผ๋ณด์.
$ kubectl create configmap zedd-configmap-yaml \
--from-literal NAME=ZEDD --dry-run -o yaml
ํฐ๋ฏธ๋ ํ๋ฉด์ ๋ณด๋ฉด ์์ฑํ ์ปจํผ๊ทธ๋งต์ ๋ํ YAML ํ์ผ ๋ด์ฉ์ ์ถ๋ ฅํด์ค๋ค. ์ด๋ฅผ ๋ฆฌ๋ค์ด๋ ์ ํ์ฌ YAML ํ์ผ๋ก ์ ์ฅํ๊ณ , kubectl apply ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ปจํผ๊ทธ๋งต์ ์์ฑํ ์ ์๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฐ๋ ์ด์ ๋ ๋ญ๋ผ? ์ ํํ์ง๋ ์์ง๋ง ์๋ง ์์ฑํ ์ปจํผ๊ทธ๋งต์ YAML ํ์ผ ํํ๋ก ๋จ๊ธฐ๊ณ ์์นด์ด๋น ๋ฐ ์ฌ์ฌ์ฉ ๋ชฉ์ ์ผ๋ก ์ด์ฉํ๋ ์ฉ๋๋ผ๊ณ ์๊ฐ๋๋ค.
$ kubectl create configmap zedd-configmap-yaml \
--from-literal NAME=ZEDD --dry-run -o yaml > zedd-configmap-yaml.yaml && \
kubectl apply -f zedd-configmap-yaml.yaml
ํ์ง๋ง ์ปจํผ๊ทธ๋งต์ key, value ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด YAML ํ์ผ์ ๊ธธ์ด๊ฐ ๋ถํ์ํ๊ฒ ๊ธธ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค. ์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฟ ๋ฒ๋คํฐ์ค 1.14 ๋ฒ์ ๋ถํฐ๋ kustomize ๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋์ฑ ํธํ๊ฒ ์ปจํผ๊ทธ๋งต์ ์์ฑํ ์ ์๊ฒ ๋๋ค. ์ด์ ๋ํด์๋ ์๋ ์ํฌ๋ฆฟ์ ๋ฐฐ์ฐ๋ฉด์ ์์๋ณผ ์์ ์ด๋ค.
2-2. ์ํฌ๋ฆฟ(Secret)
์ปจํผ๊ทธ๋งต๊ณผ ์ ์ฌํ๊ธด ํ์ง๋ง SSH ํค, DB ๊ณ์ ์ ํจ์ค์๋ ๋ฑ๊ณผ ๊ฐ์ด ๋ณด์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ํฌ๋ฆฟ์ ๋ํด ๋ฐฐ์๋ณด์. ์ด ์ํฌ๋ฆฟ๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด์ ์ ๋ฐฐ์ ๋ ๋์ปค ์ค์์์ ์๊ฐํ๋ ์ํฌ๋ฆฟ๊ณผ ์ฉ๋๊ฐ ๋งค์ฐ ์ ์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ํฌ๋ฆฟ์ ๋ค์์คํ์ด์ค์ ์ข ์๋๋ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ์ด๋ฉฐ, ์์ ๋ฐฐ์ด ์ปจํผ๊ทธ๋งต๊ณผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๊ฑฐ์ ๋์ผํ๋ค. ํ์ง๋ง ์ํฌ๋ฆฟ์ด ๋ณด๋ค ๋ ์ธ๋ถํ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
2-2-1. ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น๋ฐ์ค๋ฝ๊ฒ ์ ์ฅํ์, Opaque ์ํฌ๋ฆฟ
์ฐ์ ๊ฐ๋จํ๊ฒ ์ํฌ๋ฆฟ์ ํ๋ ์์ฑํด๋ณด์. ์ํฌ๋ฆฟ์ ์์ฑํ ๋๋, --from-literal, --from-file, --from-env-file ์ต์ ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ๋ช ์ํ ๋ฌธ์์ด์ ์ํฌ๋ฆฟ์ผ๋ก ์์ฑํด๋ณด์.
$ kubectl create secret generic \
zedd-password --from-literal password=zedd1234
์ํฌ๋ฆฟ๋ง์ ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด ์ ๋ช ๋ น์ด์์ generic ์ด๋ผ๋ ํน์ ์ต์ ์ ๋ถ์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ ์ํฌ๋ฆฟ์ ์ข ๋ฅ๊ฐ ๋ช ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์๋์์ ๋ณด๋ฉด generic ์ต์ ์ ์ง์ ํด ์ํฌ๋ฆฟ์ ๋ง๋ค๋ฉด Opaque ๋ผ๋ TYPE์ ์ํฌ๋ฆฟ์ด ์์ฑ์ด ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์, ์ด์ ๊ทธ๋ฌ๋ฉด ์์ฑํ ์ํฌ๋ฆฟ์ ์ ๋ณด๋ฅผ ์ดํด๋ณด์.
๋์ปค ์ค์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ์ํฌ๋ฆฟ์ ์์ฑํ ๋ value์ ๋ช ์ํ zedd1234 ๋ผ๋ ๊ฐ์ด ์ํฌ๋ฆฟ ์ ๋ณด์๋ emVkZDEyMzQ= ์ด๋ผ๋ ๋ฌธ์์ด๋ก ๋ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํฌ๋ฆฟ ๊ฐ์ ์ ์ฅํ ๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ base64๋ก ๊ฐ์ ์ธ์ฝ๋ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.(๋จ, ์ํฌ๋ฆฟ์ด ์ค์ ๋์๋ค๊ณ ํ๋๋ผ๋ ํ๋ ๋ด๋ถ๋ก ์ง์ ๋ค์ด๊ฐ ํด๋น ์ํฌ๋ฆฟ์ ๊ฐ์ ์ง์ ๋ณด๋ฉด ๊ทธ ๋๋ ๋์ฝ๋ฉ๋ ๊ฐ์ผ๋ก ๋์ด์๋ค)
์ํฌ๋ฆฟ๋ YAML ํ์ผ๋ก๋ถํฐ ์์ฑ์ด ๊ฐ๋ฅํ๋ฐ, YAML ํ์ผ์ ๋ช ์๋๋ ๋ฐ์ดํฐ๋ ๋ฐ๋์ ์ธ์ฝ๋ฉ๋ ๊ฐ์ผ๋ก ๋ช ์๋์ด์ผ ํ๋ค. ์ค์ ๋ก, --dry-run ๊ณผ -o yaml ์ต์ ์ ์ฌ์ฉํด์ ์ํฌ๋ฆฟ์ ์์ฑํ ๋์ YAML ํ์ผ์ ๋ณด๋ฉด ์๋์ฒ๋ผ ์ธ์ฝ๋ฉ๋ ๊ฐ์ผ๋ก ์ค์ ๋จ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ปจํผ๊ทธ๋งต์ ๋ฐฐ์ ์ ๋์ฒ๋ผ ์ํฌ๋ฆฟ์ ๋ช ์๋ ๋ชจ๋ ๊ฐ์ ํ๋ฒ์ ํ๋ ๋ด ํ๊ฒฝ๋ณ์๋ก ์ค์ ํ๊ฑฐ๋, ์ํฌ๋ฆฟ์ ํน์ ๊ฐ๋ง ํ๊ฒฝ๋ณ์๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ, ๋ณผ๋ฅจ์ ํ์ฉํด์ ๋ชจ๋ ์ํฌ๋ฆฟ ๋๋ ํน์ ์ํฌ๋ฆฟ์ ํ๋ ๋ด์ ํน์ ๊ฒฝ๋ก์ ๋ง์ดํธํ๋ ๋ฐฉ๋ฒ๋ค ๋ชจ๋ YAML ํ์ผ ๋ด์์ ์ ์ํ ์ ์๋ค. ๋จ์ง YAML ํ์ผ ํญ๋ชฉ์์ ์ปจํผ๊ทธ๋งต์์์ configMapRef ํค์๋๋ฅผ secretRef๋ก, configMapKeyRef ํค์๋๋ฅผ secretKeyRef ํค์๋๋ก๋ง ๋ฐ๊พธ์ด ์ฃผ๋ฉด ๋๋ค.
2-2-2. ๋น๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ์ ๊ทผํ๋๋ก ํด์ฃผ์, docker-registry ์ํฌ๋ฆฟ
๋ค์์ Opaque ์ ํ์ ์ํฌ๋ฆฟ๊ณผ๋ ๋ค๋ฅธ ์ข ๋ฅ์ธ docker-registry ์ ํ์ ์ํฌ๋ฆฟ์ ๋ํด ๋ฐฐ์๋ณด์. ์ด ์ํฌ๋ฆฟ์ ๋น๊ณต๊ฐ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ์ธ์ฆ์ ์ํ ์ ํ์ด๋ค. ์ผ๋ก๋ก, ์ฐ๋ฆฌ๋ ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ํ๋ก์ด๋จผํธ, ํ๋ ๋ฑ์ ๋ฐฐํฌํ ๋ ํ์ฉํ๋ YAML ํ์ผ ๋ด์์ ํ๋ ํ ํ๋ฆฟ ๋ด์ ์ปจํ ์ด๋ ์คํ์ ์ ์ํด์ค ๋ ์ปจํ ์ด๋๊ฐ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ๋ช ์ํด์ฃผ์๋ค. ์ด๋ ๊ฒ ๋ช ์ํ ์ด๋ฏธ์ง๋ฅผ ์ต์ด๋ก๋ ๋ก์ปฌ ์๋ฒ์์ ์ฐพ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปค ํ๋ธ์์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.(๋์ปค ์ปจํ ์ด๋๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด๋ ๋์ผ)
ํ์ง๋ง ์ง๊ธ๊น์ง ์ค์ตํ๋ฉด์ ํ์ฉํ ์ด๋ฏธ์ง๋ค์ ๋ชจ๋ ๋์ปค ํ๋ธ์ ๊ณต๊ฐ๋ ์ด๋ฏธ์ง์๊ธฐ ๋๋ฌธ์ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์์ง๋ง, ๋ง์ฝ ํ์ฉํ๋ ค๋ ์ด๋ฏธ์ง๊ฐ ์ฌ๋ด์ ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ์ด๊ฑฐ๋ ๋์ปค ํ๋ธ์ ๊ฐ์ธ ๋ ํฌ์งํ ๋ฆฌ๋ผ๋ฉด ์ถ๊ฐ์ ์ธ ์ธ์ฆ์ ์ฐจ๊ฐ ํ์ํ ์ ์๋ค.
๋์ปค์์๋ docker login ๋ช ๋ น์ด๋ก ์ํ๋ ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ ๋๋ฉ์ธ์ ์ ๋ ฅํ์ฌ Username, Password๋ฅผ ์ ๋ ฅํ์ฌ ์ธ์ฆ์ ํ ์ ์์๋ค. ํ์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค์์๋ ์ด๋ฌํ ๋ช ๋ น์ด ๋์ ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ณ๋์ ์ํฌ๋ฆฟ์ ์์ฑํด์ ์ธ์ฆ ์ ์ฐจ๋ฅผ ์ํํ๋ค.
์ด ์ธ์ฆ ์ ์ฐจ๋ฅผ ์ํด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ํฌ๋ฆฟ์ ์์ฑํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. ์ฐ์ ์ฌ์ฉ์์ ํ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก์ .docker ๋๋ ํ ๋ฆฌ์ ์กด์ฌํ๋ config.json ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด json ํ์ผ์๋ ์ธ์ฆ์ ์ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ์ --from-file ์ต์ ์ ์ฌ์ฉํด ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ํฌ๋ฆฟ์ผ๋ก ์์ฑํ๋ฉด ๋๋ค. ์์๋ ์๋์ ๊ฐ๋ค.
$ kubectl create secret generic registry-auth \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ํฌ๋ฆฟ์ ์์ฑํ๋ ๋ช ๋ น์ด์ ์ง์ ๋ก๊ทธ์ธํ ์ ์๋ ์ ๋ณด(Username, Password)๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค. --docker-username, --docker-password ์ต์ ์ ํ์ฉํ๋ฉด ๋๋ค. ์ฐธ๊ณ ๋ก --docker-server ์ต์ ์ ์ฌ์ฉํด์ ์ธ์ฆํ ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ ์๋ฒ์ ๋๋ฉ์ธ์ ์ ๋ ฅํด์ค ์ ์๋ค. --docker-server ์ต์ ์ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปค ํ๋ธ(docker.io) ๋๋ฉ์ธ์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
$ kubectl create secret docker-registry registry-auth-by-cmd \
--docker-username=zedd-user \
--docker-password=zedd1234 \
--docker-server=zedd-registry.com
์ด๋ ๊ฒ ์์ฑํ ์ํฌ๋ฆฟ์ ๋ํ๋ก์ด๋จผํธ, ํ๋๋ฅผ ๋ฐฐํฌํ ๋ ํ์ฉํ๋ YAML ํ์ผ ๋ด์ ๋ช ์ํ ์ ์๋ค. ๋ฐ๋ก imagePullSecret ํญ๋ชฉ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ์์๋ ์๋์ ๊ฐ๋ค.
apiVerson: v1
kind: Pod
metadata:
name: private-registry-pod
spec:
containers:
- name: zedd-private-container
image: zedd-image:v1
imagePullSecrets:
- name: registry-auth-by-cmd
3. ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ์ข ๋ ์ฝ๊ฒ ๋ฐฐํฌํ์, kustomize
๋ค์์ผ๋ก ๋ฐฐ์๋ณผ ๊ฒ์ ์ง๊ธ๊น์ง ๋ฐฐ์ ์จ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๋๋ก ์ง์ํด์ฃผ๋ kustomize์ ๋ํด ์์๋ณด์. ์์์ ์ปจํผ๊ทธ๋งต์ด๋ ์ํฌ๋ฆฟ์ ๊ฐ์ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ค๋ฉด --dry-run ์ต์ ์ ์ฌ์ฉํด์ YAML ํ์ผ๋ก ๋ฐ๋ก ์ ์ฅํด๋์์ผ ํ๋ค. ํ์ง๋ง ๋ง์ฝ์ ์ ์ฅํด์ผ ํ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ ๊ฐ์๊ฐ ๋์ด๋๋ค๋ฉด ๊ทธ ๋ชจ๋ ์ค์ ๊ฐ๋ค์ YAML ํ์ผ์ ์ ์ฅํด์ผ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ฐ์ ์ํฌ๋ฆฟ๊ณผ ๊ฐ์ ๋ณด์์ ๋ฏผ๊ฐํ ๊ฐ์ (๋ฌผ๋ก ์ํธํ๋ ์ํ๋ก ์ค์ ๋๊ธด ํ์ง๋ง..) ํ์ผ ๋ด์ ์ง์ ๋ช ์ํ๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ผ๋ก ์ทจ์ฝํ๋ค๋ ์ ๊ณผ ์ํฌ๋ฆฟ๊ณผ ์ปจํผ๊ทธ๋งต ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ค์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค์ด์ง๋ค.
์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ปจํผ๊ทธ๋งต์ด๋ ์ํฌ๋ฆฟ์ ์ค์ ๋ ๊ฐ๋ค์ YAML ํ์ผ์ ์์ฑํ์ง ์๊ณ YAML ํ์ผ๊ณผ ๋ถ๋ฆฌํ์ฌ ๋ณ๋๋ก ๊ด๋ฆฌํ ์ ์๋ kustomize ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. kustomize๋ ์ํฌ๋ฆฟ๊ณผ ์ปจํผ๊ทธ๋งต ์ด์ธ์๋ ์์ฃผ ์ฌ์ฉ๋๋ YAML ํ์ผ์ ์์ฑ ๊ฐ์ ๋ณ๋๋ก ์ ์ํด ์ฌ์ฌ์ฉํ๊ฑฐ๋ ๋ ๋์๊ฐ ์ฌ๋ฌ YAML ํ์ผ์ ํ๋๋ก ๋ฌถ๋ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
kustomize๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด ์์ธํ ๋์์๊ธด ํ์ง๋ง ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค. kustomize๋ ์ผ์ข ์ YAML ํ์ผ์ ๋ณ๋๋ก ์์ฑํ ํ, kubectl apply ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ๋ฐฐํฌํ๋ฉด ๋๋ค. ๋จ, ๊ธฐ์กด์๋ -f ์ต์ ์ ์ฌ์ฉํ์ง๋ง, kustomize์ ๊ฒฝ์ฐ -k ์ต์ ์ ์ฌ์ฉํ๋ค. kustomize๋ฅผ ์ฌ์ฉํด์ ์ํฌ๋ฆฟ์ ์ ์ํด๋ณด์. YAML ํ์ผ ๋ด์ฉ์ ์๋์ ๊ฐ์ผ๋ฉฐ, ๋ฐ๋์ ํ์ผ ์ด๋ฆ์ kustomization.yaml ๋๋ kustomization.yml ๋๋ Kustomization ์ผ๋ก ์ค์ ํด์ผ ํ๋ค.
secretGenerator:
- name: kustomize-zedd-secret
type: Opaque
files:
- key=zedd-secret
์ด YAML ํ์ผ์ ์ฌ์ฉํด์ ์ํฌ๋ฆฟ์ ์์ฑํ๊ธฐ ์ํด ์๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์. ์๋ ๋ช ๋ น์ด์ ๋ง์ง๋ง ์ธ์์๋ ํด๋น YAML ํ์ผ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํด์ค๋ค.
$ kubectl apply -k ./
์ ๋ช ๋ น์ด๊ฐ ์ ๋์ํ๋์ง ํ ์คํธ ํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก --dry-run ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ kustomize๋ฅผ ์ฌ์ฉํ ๋๋ ๋น์ทํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด๋ฉด ๋๋ค. ์ญ์ ์๋ ๋ช ๋ น์ด์ ๋ง์ง๋ง ์ธ์์๋ ํด๋น YAML ํ์ผ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํด์ค๋ค.
$ kubectl kustomize ./
๋ง์ฝ ์ํฌ๋ฆฟ์ด ์๋ ์ปจํผ๊ทธ๋งต์ kustomize๋ก ์์ฑํ๊ณ ์ถ๋ค๋ฉด ์ YAML ํ์ผ์์ secretGenerator ํค์๋๋ฅผ configMapGenerator๋ก ๋ฐ๊พธ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ํฌ๋ฆฟ๊ณผ๋ ๋ฌ๋ฆฌ ์ปจํผ๊ทธ๋งต์๋ ์ ํ(type)์ด ์๊ธฐ ๋๋ฌธ์ type ํค์๋๊ฐ ์์ฑ๋์ด ์๋ ๋ผ์ธ์ ์ญ์ ํด์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก, kustomize๋ฅผ ์ฌ์ฉํด์ ์ํฌ๋ฆฟ ๋๋ ์ปจํผ๊ทธ๋งต์ ์์ฑํ๋ฉด ์ํฌ๋ฆฟ, ์ปจํผ๊ทธ๋งต์ ๊ตฌ๋ถํ ์ ์๋๋ก ํ๋ ํด์ฌ๊ฐ์ด ์ํฌ๋ฆฟ, ์ปจํผ๊ทธ๋งต์ ์ด๋ฆ ๋์ ๋ถ๋๋ค. ๊ทธ๋์ ๋ฐฉ๊ธ ์์์ kustomize๋ฅผ ํ์ฉํด์ ์์ฑํ ์ํฌ๋ฆฟ์ ๋ณด๋ฉด ์ํฌ๋ฆฟ ์์ฑ ์ ์ด๋ฆ์ kustomize-zedd-secret๋ง ๋ช ์ํ์ง๋ง ์ด๋ฆ ๋์ ํด์ฌ๊ฐ์ด ๋ถ์ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฌผ๋ก , ์ผ๋ฐ์ ์ธ kubectl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์๋ ์์ฑํ ์ํฌ๋ฆฟ, ์ปจํผ๊ทธ๋งต์ ์ด๋ฆ ๋์ ํด์ฌ๊ฐ์ ๋ถ์ฌ์ค ์ ์๋ค. ๋ช ๋ น์ด ๋ง์ง๋ง์ --append-hash ์ต์ ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
4. ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ๊ฐฑ์ ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๊ฐ๋ ๊ฐฑ์ ์ํค๊ธฐ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ ๊ฐ ์ค ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ์ํฉ์ด ์๊ธธ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ์ค์ ๋ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋๋ฐ, ์ด ๋ ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. ์ฒซ ๋ฒ์งธ๋ kubectl edit ๋ช ๋ น์ด๋ก ์์ ํ๋ ๋ฐฉ๋ฒ, ๋ ๋ฒ์งธ๋ ์ปจํผ๊ทธ๋งต ๋๋ ์ํฌ๋ฆฟ์ด ๋ช ์๋ YAML ํ์ผ์ ๋ณ๊ฒฝํ ๋ค ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ, ๋ง์ง๋ง์ผ๋ก๋ kubectl patch ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ทธ๋ฐ๋ฐ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ๊ฐ์ ์ 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ๋ค๊ณ ํ๋๋ผ๋, ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ๋ด์์๋ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋์๋์ง๋ ์ปจํผ๊ทธ๋งต ๋๋ ์ํฌ๋ฆฟ์ ํ๋์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์์์, ์ฐ๋ฆฌ๋ ์ปจํผ๊ทธ๋งต ๋๋ ์ํฌ๋ฆฟ์ ํ๋์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ผ๋ก 2๊ฐ์ง๋ฅผ ๋ฐฐ์ ๋ค. ์ฒซ ๋ฒ์งธ๋ ํ๊ฒฝ ๋ณ์๋ก ํ๋ ๋ด๋ถ์ ์ค์ ๊ฐ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด์๊ณ , ๋ ๋ฒ์งธ๋ ๋ณผ๋ฅจ์ด๋ผ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ํ์ฉํด์ ํ๋ ๋ด๋ถ์ ํน์ ๊ฒฝ๋ก์ ๋ง์ดํธํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
๋ ๋ฐฉ๋ฒ ์ค ์ฒซ ๋ฒ์ฌ ๋ฐฉ๋ฒ์ ์ปจํผ๊ทธ๋งต์ด๋ ์ํฌ๋ฆฟ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ ํ๋ ๋ด์ ์ ๊ณต๋ ๊ฐ๋ค๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๋ฐ๋ฉด์ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ํ์ฉํ๋ค๋ฉด ๋ณ๊ฒฝ ํ์ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ๊ฐ์ด ํ๋ ๋ด์์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
ํ์ง๋ง ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ(๋ง์ดํธํ๋ ๋ฐฉ๋ฒ)์ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ผ๋ ํ๋์์ ์ด๋ฏธ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ด ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ ์๋๋ค. ์ด ๋ง์ ์ดํดํ๊ธฐ ์ํด ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์๋ก ํ ๋ฒ ๋ค์ด๋ณด์.
์ฐ๋ฆฌ์๊ฒ๋ ๋ชจ๋ธ A, B ๋ผ๋ 2๊ฐ์ง ์ข ๋ฅ์ ๋ชจ๋ธ์ด ์์ค์ฝ๋ ๋ด์ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก์ ์กด์ฌํ๊ณ , ์ด ๋ชจ๋ธ์ด ์กด์ฌํ๋ ๊ฒฝ๋ก๋ฅผ ์ฐ๋ฆฌ๋ ์ปจํผ๊ทธ๋งต์ผ๋ก ์์ฑํ์ฌ ํ๋ ๋ด์ ์ ๊ณตํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ด๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋, ๋ชจ๋ธ A๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ์ปจํผ๊ทธ๋งต์ผ๋ก ์์ฑํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฟ ๋ฒ๋คํฐ์ค๋ก ๋ฐฐํฌํ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ์๊ธฐ ์ค๊ฐ์ ๋ชจ๋ธ A์ ์ฑ๋ฅ์ ๋ฌธ์ ์ ์ด ์๊ฒจ ๋ชจ๋ธ B๋ก ๊ต์ฒดํ๋ ค๊ณ ํ๋ค. ์ด ๋, ์ฐ๋ฆฌ๋ ์ปจํผ๊ทธ๋งต์ ๊ฐ ์ฆ, ๋ชจ๋ธ A๊ฐ ์๋ ๊ฒฝ๋ก์์ ๋ชจ๋ธ B๊ฐ ์๋ ๊ฒฝ๋ก๋ก ๊ฐ์ ๋ณ๊ฒฝ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์๋ ๋ฐ์์ํค๋ ค๊ณ ํ๋ค.
์ปจํผ๊ทธ๋งต์ ์์ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ทธ ์ดํ๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ผ๋ก ์ด๋ค ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฒ ๋ ๊น? ๋ชจ๋ธ A? B? ์ ๋ต์ A์ด๋ค. ์ ์ปจํผ๊ทธ๋งต์ ๊ฐฑ์ ์ํค๊ณ , ํ๋ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๊ฐ๋ ๊ฐฑ์ ์์ผฐ์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋ชจ๋ธ A๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ๊น? ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ๋ชจ๋ธ A๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์์ ๋ ์คํ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค์ ๋งํด, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์์ํ์ ๋ ์ด๋ฏธ ๋ชจ๋ธ A ๊ฒฝ๋ก๋ก ์ค์ ๋ ์ปจํผ๊ทธ๋งต์ ๋ณธ ์ํ์์ ์คํ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ธ B ๊ฒฝ๋ก๋ก ์์ ๋ ์ปจํผ๊ทธ๋งต์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋กญ๊ฒ ๋ฐ๋ผ๋ณด๋๋ก ํด์ผ ํ๋ ๊ฒ์ ๋ ๋ณ๊ฐ๋ก ํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์ํฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ชจ๋ธ B๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ๋ ํ๋๋ฅผ ์๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋งค๋ฒ ์ด๋ ๊ฒ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ์๊ธฐ๋ก ํด์ฃผ๊ฒ ๋๋ฉด ๊ท์ฐฎ์ ์ ์๋ค. ์ด๋ฅผ ์๋ํํ๊ธฐ ์ํด ๋ณ๊ฒฝ๋ ํ์ผ์ ๋ค์ ์ฝ์ด ๋ค์ด๋๋ก ์ปจํ ์ด๋์ ํ๋ก์ธ์ค์ ๋ณ๋์ ์๊ทธ๋(SIGHUP)์ ๋ณด๋ด๋ ์ฌ์ด๋์นด ์ปจํ ์ด๋๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํจ๊ป ํ๋ ๋ด์ ํฌํจ์์ผ๋ณผ ์ ์๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ํ์ฉํด์ ์ปจํผ๊ทธ๋งต, ์ํฌ๋ฆฟ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ํ ์๋ฆผ(Watch)์ ๋ฐ์ ๋ค, ์๋์ผ๋ก reload ํ์ฌ ๊ฐฑ์ ํ๋ ๋ก์ง๋ ์๊ฐํด๋ณผ ์ ์๋ค. ๊ทธ ์ด์ธ์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ ๊ฒ์ด๋ค. ์ด๋ ์ฌ์ฉ์์ ๊ธฐ์ ์๋ จ๋๋ ์ํฉ, ์ ๋ง์ ๋ง๊ฒ ์ ํ์ ํ๋ฉด ๋๋ค.
์ง๊ธ๊น์ง ํฌ์คํ ์ผ๋ก ํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ์ด์ ๋ํ ๋ชจ๋ ๋ชฉ์ฐจ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค. ์ฑ ์์๋ ์ด์ ๊ทธ ์ดํ์ ๋ด์ฉ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๋ํด ์๊ฐํ๋ค. ํ์๋ ์ง๊ธ ๋น์ฅ์ ๊ณต๋ถ ์ง๋๋ ์ฌ๊ธฐ๊น์ง๋ก ํ์ฌ ๋ง๋ฌด๋ฆฌํ๋ ค๊ณ ํ๋ค. ํ์ ์์ ๋ฌผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํ์ฉํ๊ธด ํ์ง๋ง, ํ์์ ๋ฉ์ธ ์ง๋ฌด๊ฐ DevOps ์์ง๋์ด๊ฐ ์๋ ๋ฟ๋๋ฌ, ์ถํ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ๋ด๊ฒ ํ์๋ก ํ ๋ ๊ทธ ๋ ๋น์ ์ฑ ์ ๋ค์ ํด๋ณด๋ ค๊ณ ํ๋ค.