๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ปค์คํ ๋ฆฌ์์ค, CRD, ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ์ ๋ํด ์์๋ณธ๋ค. ์ง์ ํฌ์คํ ๊น์ง ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ฅผ ์์ฑํด์๋ค. ํ๋, ๋ ํ๋ฆฌ์นด์ , ๋ํ๋ก์ด๋จผํธ, HPA, ์คํ ๋ฆฌ์ง ํด๋์ค, PV, PVC ๋ฑ๋ฑ ์ด๋ฐ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๊ธฐ๋ง ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์์ด ์ฌ์ฉํ ์ ์๋ ์ค๋ธ์ ํธ๋ค์ด๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ ๋ง๊ณ ๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ์๋ก์ด ๋ฆฌ์์ค์ ์ข ๋ฅ๋ฅผ ๋ง๋ค์ด์ ์ฟ ๋ฒ๋คํฐ์ค์์๋ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ์ง์ ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ปค์คํ ๋ฆฌ์์ค(Custom Resource)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฌ์ค ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๊ณ ์ดํดํ๊ธฐ ์ํด์๋ ์ปจํธ๋กค๋ฌ๋ผ๋ ๋ณ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ดํดํ๊ณ ๊ตฌํํ ์ค ์์์ผ ํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์์ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฅธ๋ฐ Cloud-native Infrastructure ์ด๋ผ๊ณ ํ๋ ์ํ๊ณ์์ ์์ฃผ ์ฐ์ด๋ ๊ฐ๋ ์ ๋ดํฌํ๊ณ ์๋ค. ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ณด๊ธฐ ์ ์ ์ฐ๋ฆฌ๋ ์ด '์ปจํธ๋กค๋ฌ' ๋ผ๊ณ ํ๋ ๊ฐ๋ ์ ๋ํด์ ์๊ฒ๋๋ง๋ผ๋ ๋ฐฐ์ฐ๊ณ ๋์ด๊ฐ๋๋ก ํ์.
1. ์ฟ ๋ฒ๋คํฐ์ค์ 2๊ฐ์ง ๋์ ๋ฐฉ์ : ๋ช ๋ น(Imperative) ๊ณผ ์ ์ธ(Declarative)!
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ฆฌ์์ค๋ฅผ ๋์์ํค๊ฒ ํ๋ ๋ฐฉ์์ด 2๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. ๋ช ๋ นํ๊ณผ ์ ์ธ์ ์ด 2๊ฐ์ง์ด๋ค. ์ฐ์ ์์ ์ผ๋ก ๋์๊ฐ์ ๋์ปค๋ฅผ ๋ฐฐ์ธ ๋ ์ฐ๋ฆฌ๋ docker run ~ ๋๋ docker build ~ ์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ํํ์๋ค. ๊ฒฐ๋ก ๋ถํฐ ์ด์ผ๊ธฐํ๋ฉด ์ด๋ฐ ๋ฐฉ์์ ๋ช ๋ นํ ๋ฐฉ์์ ์ํ๋ค. ์ฆ, docker run, docker build ์ ๊ฐ์ ํน์ ๋ช ๋ น์ ์ฒ๋ฆฌํ๋ ์ฃผ์ฒด์ ํต์ ํด์ ๊ทธ ์ฃผ์ฒด๊ฐ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋๋ ค๋ฐ๋ ๋ฐฉ์์ ๋ช ๋ นํ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ช ๋ นํ ๋ฐฉ์์ด ์ง์๋๋๋ฐ, ์ผ๋ก๋ก kubectl run ~, kubectl create ~ ์ ๊ฐ์ ๋ช ๋ น์ด๋ค์ด๋ค.
๋ฐ๋ฉด์ ์ง์ ์ฟ ๋ฒ๋คํฐ์ค ์๋ฆฌ์ฆ ํฌ์คํ ๊น์ง ๋ฐฐ์์ค๋ฉด์ ๋ฆฌ์์ค๋ฅผ ๋์์ํฌ ๋ ๋ชจ๋ ์ฐ๋ฆฌ๋ kubectl apply -f ~ ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฌํ ๋ช ๋ น์ด๋ฅผ ์ ์ธ์ ๋ฐฉ์์ด๋ผ๊ณ ํ๋๋ฐ, ๋์ฒด '์ด๋ค ๊ฒ'์ ์ ์ธํ๋ค๋ ๊ฒ์ผ๊น? ์ฐ๋ฆฌ์๊ฒ ๊ทธ๋์ ์ต์ํด์๋ kubectl apply -f ๋ช ๋ น์ด๋ฅผ ๋ค์ ๋ ์ฌ๋ ค๋ณด์. kubectl apply -f ๋ช ๋ น์ด ๋ค์ ์ฐ๋ฆฌ๋ ์ด๋ค ๊ฒ์ ๋ช ์ํ์๋? ๋ฐ๋ก YAML ํ์ผ์ ๊ฒฝ๋ก์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ YAML ํ์ผ์๋ ์ฐ๋ฆฌ๊ฐ ์์ฑ ๋๋ ์ ์ฉํ๊ณ ์ ํ๋ ์ฌํญ์ ๋ช ์ํ ๋งค๋ํ์คํธ ํ์ผ์ด์๋ค. ์ด๋ ๊ฒ ์ ์ธํ ๋ฐฉ์์ ์ต์ข ์ ์ผ๋ก ๋๋ฌํด์ผ ํ๋ ์ํ ์ฆ, ์ฐ๋ฆฌ๊ฐ ๋ช ์ํ YAML ํ์ผ ๋ด์ฉ์ ์ํ๋ฅผ ์ ์ํ ๋ค, ํ์ฌ ์ํ๊ฐ ๋๋ฌํด์ผ ํ๋ ์ํ์ ๋ค๋ฅผ ๊ฒฝ์ฐ ํ์ฌ ์ํ๋ฅผ ๋๋ฌํด์ผ ํ๋ ์ํ๋ก ์ผ์น์ํค๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.(์ฐธ๊ณ ๋ก ๋๋ฌํด์ผ ํ๋ ์ํ๋ฅผ '๋ฐ๋์งํ ์ํ' ๋ผ๊ณ ๋ ํ๋ฉฐ Desired State ๋ผ๊ณ ํ๋ค) ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ ์ค ์ ์ธ์ ๋ฐฉ์์ ์งํฅํ๋ค.
์กฐ๊ธ ๋ ์ธ๋ถ์ ์ผ๋ก ๋ค์ด๊ฐ์, ๋ช ๋ นํ๊ณผ ์ ์ธ์ ๋ฐฉ์ ๊ฐ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ฅผ ์ดํด๋ณด๋๋ก ํ์. ๋จผ์ ๋ช ๋ นํ ๋ฐฉ์์ ๋ช ๋ น์ด(ex. kubectl create ~)๋ฅผ ์์ฒญํ๋ฉด ๊ทธ ์์ฒญ์ kube-api server ํ๋๋ก ์ธ์ ๋์ด create ๋ช ๋ น์ด ๋ค์ ๋ช ์ํ ๋์๋ค ์๋ฅผ ๋ค์ด, ํ๋๋ฅผ ์์ฑํ๋ค๊ฑฐ๋ HPA๋ฅผ ์์ฑํ๋ค๊ฑฐ๋ ๋ฑ์ ํน์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋๋ก ๋์ํ๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ช ๋ นํ ๋ฐฉ์์ ์ด๋ฏธ ์์ฑํ ๋ฆฌ์์ค๋ฅผ ๋ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, kubectl create ~ ๋ช ๋ น์ด๋ก "zedd" ๋ผ๋ ์ด๋ฆ์ ํ๋๋ฅผ ์์ฑํ ๋ค, ๋ kubectl create ๋ช ๋ น์ด๋ก "zedd" ๋ผ๋ ์ด๋ฆ์ ํ๋๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๊ฒ ๋ช ๋ นํ ๋ฐฉ์์ "์ฟ ๋ฒ๋คํฐ์ค์ผ, ๋ ์ด๋ฌ์ฟต ์ ๋ฌ์ฟต ๋์ํด!" ๋ผ๊ณ ์ง์ ์ ์ผ๋ก ์ด๋ป๊ฒ ํ๋ํ ์ง ๋ช ์๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ๋ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ฉด์ ์ ์ธ์ ๋ฐฉ์์ ์ด์ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ์๋ฅผ ๋ค์ด, kubectl apply -f ~ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ์๊ฐ ๋๊ฐ์ด kube-api server ํ๋๋ก ์์ฒญ์ด ์ธ์ ๋์ง๋ง, ๊ทธ ์ดํ์ ๋จ๊ณ๊ฐ ๋ช ๋ นํ ๋ฐฉ์๊ณผ ๋ค๋ฅด๋ค. ์ผ๋จ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด์.
๋จผ์ etcd ๋ผ๋ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ชจ๋ ์ํ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์ ์ฅ์๋ก ์์ฒญ์ด ๋ค์ด๊ฐ ๋ค, ์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค๋ฌํ๊ณ ํ๋ ์ปดํฌ๋ํธ๊ฐ ์ค์ง์ ์ผ๋ก ์ด๋ค ๋์์ ์ํํ ์ง ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ์ ํ๋ค. ์ฌ์ค kubectl apply -f ๋ช ๋ น์ด๋ ๋ค์ ์ ์ธํ๋ YAML ํ์ผ์ด ์ต์ข ์ ์ผ๋ก ์์ฑํด์ผ ํ ์ํ๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ ๋ฟ์ด์ง, kubectl apply ๋ช ๋ น์ด ์์ฒด๊ฐ ์ฟ ๋ฒ๋คํฐ์ค์๊ฒ ์ด๋ค ๋์์ ์ทจํด์ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ฒ ๋ช ๋ นํ๋ ์ง์ ์ ์ธ ์ฃผ์ฒด๊ฐ ์๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค๋ฌ๋ผ๋ ๊ฒ์ ๋ ธ๋ ์ปจํธ๋กค๋ฌ, ๋ํ๋ก์ด๋จผํธ ์ปจํธ๋กค๋ฌ ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ๋ณ๋๋ก ์กด์ฌํ ์๋ ์๊ฒ ์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ ์ด๋ฐ ๋ณ๋์ ์ปจํธ๋กค๋ฌ๋ค์ด ๋ชจ๋ ํ ๊ณณ์์ ์ํ๋๊ณ ๊ด๋ฆฌ๋ ์ ์๋๋ก ์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค๋ฌ ๋งค๋์ ๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ๋ค. ์ด ์ปจํธ๋กค๋ฌ ๋งค๋์ ๋ ์ฟ ๋ฒ๋คํฐ์ค์ ํต์ฌ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์ kube-system ์ด๋ผ๋ ๋ค์์คํ์ด์ค์ ํ๋๋ก ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ด ์ปจํธ๋กค๋ฌ ๋งค๋์ ๊ฐ Watch๋ฅผ ์ํํ๋ค๊ฐ, ์ฐ๋ฆฌ๊ฐ kubectl apply -f ๋ช ๋ น์ด์ ํจ๊ป ๋ฐ๋์งํ ์ํ๋ฅผ ๋ช ์ํ YAML ํ์ผ์ ๋ช ์ํด์ฃผ๋ฉด ์ปจํธ๋กค๋ฌ ๋งค๋์ ๋ ํด๋น YAML ํ์ผ์ ๋ณด๊ณ ๊ทธ์ ๋ง๋ ๋ ธ๋ ์ปจํธ๋กค๋ฌ ๋๋ ๋ํ๋ก์ด๋จผํธ ์ปจํธ๋กค๋ฌ ๋ฑ์ ์ฌ์ฉํด ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
2. ๋๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ฌ์ฉํ์ : ์ปค์คํ ๋ฆฌ์์ค(Custom Resource)
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์์๋ ์ฌ์ฉํ ์ ์๋ ์ปค์คํ ๋ฆฌ์์ค์ ๋ํด์ ์์๋ณด๋๋ก ํ์. ์ด๋ค ๋ฆฌ์์ค ์ค๋ธ์ ํธ์ ๋งค๋ํ์คํธ๋ฅผ ๋ณด์์ ๋, ๊ฐ๋จํ๊ฒ ์ปค์คํ ๋ฆฌ์์ค์ธ์ง ์๋์ง ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋งค๋ํ์คํธ ํ์ผ์ apiVersion ๊ฐ์ ๋ณด๋ฉด ๋๋ค. ๊ธฐ์กด์ ๋ฐฐ์ ๋ ์ฟ ๋ฒ๋คํฐ์คํธ ๋ฆฌ์์ค ์ค๋ธ์ ํธ์ ๋งค๋ํ์คํธ์๋ ๋ฌ๋ฆฌ ์ปค์คํ ๋ฆฌ์์ค์ ๋งค๋ํ์คํธ์ apiVersion ๊ฐ์ ์ ๋ ํน์ดํ ๊ฐ๋ค์ด ๋ช ์๋์ด ์๋ค. ๋ง์น URL ๋๋ฉ์ธ ๊ฐ๊ธฐ๋ ํ๊ณ , ์ด์จ๊ฑด ๋ญ๊ฐ ํน์ดํ๋ค.
# prometheus ์คํ์ PodMonitor ๋ผ๋ ์ปค์คํ
๋ฆฌ์์ค์ ๋งค๋ํ์คํธ
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: example-app
labels:
team: frontend
spec:
selector:
matchLabels:
app: example-app
podMetricsEndpoints:
- port: web
์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค. ์ฒซ๋ฒ์งธ๋ ํ๋, ๋ํ๋ก์ด๋จผํธ, ์๋น์ค ๋ฑ๊ณผ ๊ฐ์ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ค์ ์ถ์ํํจ์ผ๋ก์จ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ๋ฌถ์ด ๋์ ํจํค์ง์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋๋ฒ์งธ๋ ์ฟ ๋ฒ๋คํฐ์ค์ ์ ํ ์๊ด์ด ์๋ ๋ก์ง์ ์ปค์คํ ๋ฆฌ์์ค์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ค์ ๋ก ๋ํ์ ์ธ ์ปค์คํ ๋ฆฌ์์ค ์ค ํ๋๋ก Prometheus Operator๋ฅผ ๋ณด๋ฉด kustomize, helm ๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ํ ๋ฒ์ Prometheus ์ ๊ด๋ จ๋ ๋ฆฌ์์ค๋ค์ ์์ฑํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณต์กํ๊ณ ๋ง์ ๋ฆฌ์์ค์ ๋ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ค์์ผ๋ก์จ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ๋ง๊ป ํ์ฅํด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํธ๋ฆฌํ ์ปค์คํ
๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ์
์ฅ์์๋ ๋น์ฐํ ํธ๋ฆฌํ๊ฒ ์ง๋ง, ์ด๋ฌํ ํธ๋ฆฌํ ์ปค์คํ
๋ฆฌ์์ค๋ฅผ ์ง์ ๋ง๋๋ ๋จ๊ณ๋ ๊ฝค๋ ์ฝ์ง ์์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.(์ญ์ ๋ชจ๋์ ํธ์๋ฅผ ์ํด ๋๊ตฐ๊ฐ๋ ๋ค์์ ๊ณ ์์...) ์ด์จ๊ฑฐ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ปค์คํ
๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋จ๊ณ๋ ํฌ๊ฒ ์๋์ ๊ฐ๋ค.
- ํ์ฌ ์ํ๋ฅผ ์ปค์คํ ๋ฆฌ์์ค์ ๋ํ ๋ฐ๋์งํ ์ํ๋ก ๋ณํ์ํฌ ์ ์๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๊ณ ์คํํ๋ค
- ์ปค์คํ ๋ฆฌ์์ค์ ์์ธ ์ ๋ณด๋ฅผ ์ ์ํ๋ CRD(Custom Resource Definition) ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค
- CRD์ ์ ์๋ ๋ฐ์ดํฐ์ ๋ง์ถฐ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค
- 1๋ฒ์์ ์คํํ ์ปจํธ๋กค๋ฌ๋ ์์ฑ๋ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ๊ฐ์งํ๊ณ , ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์ํ๋ ๋ฐ๋์งํ ์ํ๊ฐ ๋๋๋ก ์ปจํธ๋กค๋ฌ๊ฐ ์์ ์ ์ํํ๋ค
์ ๋จ๊ณ ์์์ ๋ฑ์ฅํ ๊ฐ๋ ๋ค์ ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ์. ๋จผ์ CRD์ด๋ค.
2-1. ์ปค์คํ ๋ฆฌ์์ค์ ๋ํ ๋ช ์ธ์ : CRD(Custom Resource Definition)
CRD๋ ๋ง ๊ทธ๋๋ก ์ปค์คํ ๋ฆฌ์์ค์ ๋ํ ์ ์๋ฅผ ์ ์ด๋์ ๋ช ์ธ์์ ๊ฐ์ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ค์ ๋ก CRD๋ YAML ํ์ผ๋ก ์ ์๋๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ CustomResourceDefinition ์ด๋ผ๋ ์ด๋ฆ์ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋งค๋ํ์คํธ๋ฅผ ์์ฑํ๋ค. CRD๋ฅผ ์ ์ํ๋ ์์ ๋งค๋ํ์คํธ๋ฅผ ํ๋ ์ดํด๋ณด์.
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: mycrds.zedd.com
spec:
group: zedd.com
scope: Namespaced
names:
plural: mycrds
singular: mycrd
kind: Zedd
shortNames: ["z"]
versions:
- name: v1alpha1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
required: ["spec"]
properties:
spec:
required: ["myvalue"]
type: object
properties:
myvalue:
type: "string"
minimum: 1
์ ๋งค๋ํ์คํธ์ ์๋ฏธ๋ฅผ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์์๋ณด์.
- metadata.name: CRD์ ์ด๋ฆ์ ์๋ฏธ. ์ฆ, ์ ๋งค๋ํ์คํธ๋ก ์์ฑ๋๋ CRD์ ๊ณ ์ ํ ์ด๋ฆ์ ์๋ฏธํ๋ค
- spec.group: ์ปค์คํ ๋ฆฌ์์ค์ API ๊ทธ๋ฃน์ ์๋ฏธ. ์ด ๊ฐ๊ณผ ํ๋จ์์ ์์๋ณผ spec.names.plural ๊ฐ์ concatenateํ ๊ฐ์ด metadata.name๊ณผ ์ผ์นํด์ผ ํ๋ค. ์ ํํ๋ "spec.names.plural ๊ฐ + `.` + spec.group" ๋ฌธ์์ด์ ํฉ์น ๊ฒ์ด metadata.name๊ณผ ์ผ์นํด์ผ ํจ
- spec.scope: Namespaced :: ์ปค์คํ ๋ฆฌ์์ค๊ฐ ๋ค์์คํ์ด์ค์ ์ข ์์ ์ธ ๋ฆฌ์์ค์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
- spec.names.plural: ์ปค์คํ ๋ฆฌ์์ค์ ๋ณต์ํ์ ๋ํ๋ด๋ ์ด๋ฆ(๋จ์ ์ธ ์๋ก, ์ฐ๋ฆฌ๊ฐ kubectl get pods ๋ผ๊ณ ๋ช ๋ น์ด๋ฅผ ์ํํ๋๋ฐ, ์ด ๋ 'pods'๊ฐ ํ๋๋ผ๋ ๋ฆฌ์์ค์ ๋ณต์ํ์ ์๋ฏธ)
- spec.names.singular: ์ปค์คํ ๋ฆฌ์์ค์ ๋จ์ํ์ ๋ํ๋ด๋ ์ด๋ฆ
- spec.names.kind: YAML ํ์ผ์์ ์ ์ํ ๋ kind ํญ๋ชฉ์ ๋ํ๋ผ ์ปค์คํ ๋ฆฌ์์ค ์ด๋ฆ
- spec.names.shortNames: ["z"] :: ์ปค์คํ ๋ฆฌ์์ค ์ด๋ฆ์ ์ค์๋ง(ex. ๋ํ๋ก์ด๋จผํธ๋ฅผ kubectl get deploy ๋ง ํด๋ ์ถ๋ ฅ๋๋๋ก ํ๋ ๊ฒ์ฒ๋ผ)
- spec.versions[0].name: ์ปค์คํ ๋ฆฌ์์ค์ API ๋ฒ์ . ์ฐธ๊ณ ๋ก ํด๋น ๊ฐ์ spec.group์ ๋ช ์๋ ๊ฐ์ ํจ๊ป ์ด์ฉํ์ฌ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์ํ API ๊ทธ๋ฃน๊ณผ ๋ฒ์ ์ ์ค์ ํจ. ๋ณดํต์ "{API ๊ทธ๋ฃน}/{๋ฒ์ }" ํํ๋ก ์ ์ํจ. ๋ฐ๋ผ์ ์ ์์์์๋ "zedd.com/valpha1"์ด ๋จ.
- spec.versions[0].schema.openAPIV3Schema: ํด๋น ์์ญ์ ์ปค์คํ ๋ฆฌ์์ค์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํจ
- spec.versions[0].schema.required: ["spec"] :: ํด๋น ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ ์ํ ๋๋ ๋ฐ๋์ 'spec' ์์ญ์ด ์กด์ฌํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ ๋ช ์
- spec.versions[0].schema.properties: ์ปค์คํ
๋ฆฌ์์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ ํ์์ ์๋ฏธ
- properties ์์ญ์ ๋ณด๋ฉด required์ ๋ช ์ํ ๊ฒ์ฒ๋ผ spec ์์ญ์ด ์๊ณ , ๋ ๋ค๋ฅธ required๊ฐ ๋ฑ์ํ๋๋ฐ, ์ด๋ "myvalue" ๋ผ๋ ๊ฐ์ด ๊ผญ ์์ด์ผ ํ๊ณ , ์ด myvalue ๋ผ๋ ๊ฐ์ ๋ํด์ ๋ properties๋ฅผ ์ ์ํ๋๋ฐ, ์ด ๋๋ ๋ ๋ฌธ์์ด(string) ํํ์ด์ด์ผ ํ๊ณ , ์ต์ 1๊ธ์ ์ด์์ด์ด์ผ ํจ์ ์๋ฏธํจ
์์ ๊ฐ์ ๋งค๋ํ์คํธ๋ฅผ ์ ์ํ๊ณ ๋๊ฐ์ด kubectl apply -f ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด CRD๊ฐ ์์ฑ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ฑ๋ CRD๋ฅผ ์ด์ฉํด์ ์ฐ๋ฆฌ๋ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์๋ค. ๋ฐฉ๊ธ ์์์ ์ ์ํ CRD๊ฐ ์์ฑ๋์๋ค๊ณ ๊ฐ์ ํ๊ณ , ์ด CRD๋ฅผ ํ์ฉํ๋ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ์์ ๋งค๋ํ์คํธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
apiVersion: zedd.com/v1alpha1
kind: Zedd
metadata:
name: my-custom-resource-zedd
spec:
myvalue: "This is required value in zedd crd"
์ ๋งค๋ํ์คํธ์ ๋ํด์๋ kubectl apply -f ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด Zedd ๋ผ๋ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ค.
2-2. CRD, ์ปค์คํ ๋ฆฌ์์ค, ์ปจํธ๋กค๋ฌ ๊ฐ์ ๊ด๊ณ
์ง์ ๋ชฉ์ฐจ๊น์ง ํด์ CRD์ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ์์ฑํ๋์ง ์ดํด๋ณด์๋ค. ์ฌ์ค ์ด 2๊ฐ์ ๊ฐ๋ ์ด ์์ง๊น์ง๋ ํผ๋์ค๋ฌ์ธ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด 2๊ฐ์ ๊ฐ๋ ๊ณผ ๋๋ถ์ด ์ปจํธ๋กค๋ฌ๋ผ๋ ๊ฐ๋ ๋ ๊ฐ์ด ๋ฑ์ฅํ๋๋ฐ, ์ฐ์ ์ด 3๊ฐ์ง ๊ฐ๋ ์ด ๋์ฒด ์ด๋ค ๊ด๊ณ๊ฐ ์๋ ๊ฒ์ธ์ง ๋์ํํด์ ์์๋ณผ ํ์๊ฐ ์๋ค.
์ง์ ๋ชฉ์ฐจ์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ CRD๋ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ ์๋ฅผ ๋ช ์ํด๋์ ๊ฒ ๋ฟ์ด๋ค. ์๋ฅผ ๋ค์ด, ์ปค์คํ ๋ฆฌ์์ค ๋งค๋ํ์คํธ์์ apiVersion ๊ฐ์ ์ด๋ค ๊ฐ์ ์จ์ผํ๊ณ , ์ปค์คํ ๋ฆฌ์์ค์ ์ด๋ฆ์ ์ด๋ป๊ฒ ํ ๊ฒ์ด๋ฉฐ, ์ด๋ค ํ๋๋ ํ์์ ์ผ๋ก ๋ฃ์ด์ผ ํ๊ณ ๋ฑ๋ฑ..์ ์ ์ํ๋ค. ์ด๋ ๊ฒ ํด์ CRD์ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ฉด ๋์ผ๊น? ์๋๋ค.
์ฌ์ค ์ปค์คํ ๋ฆฌ์์ค๋ ๋จ์ํ YAML ํ์ผ์ ๋ถ๊ณผํ๋ค. ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ ์ํ YAML ํ์ผ์ ๋ํด์ kubectl apply -f ๋ช ๋ น์ด๋ฅผ ์ํํ๋ค๊ณ ํ๋ค ์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์๋๋ค. ์ด ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ธ์งํ๋ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ค๋ฉด ๋ง์ด๋ค.
์ปจํธ๋กค๋ฌ๋ ์ปค์คํ ๋ฆฌ์์ค๋ผ๋ etcd์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ์ด๋ ํ ํ๋๋ผ ์๋น์ค ๋ฑ๊ณผ ๊ฐ์ ํํ๋ก ๋์ํ๋๋ก ์ ์ํ ๊ตฌํ์ฒด์ด๋ค. ์๋ฅผ ๋ค์ด, ๋น๋ก ์ฟ ๋ฒ๋คํฐ์ค์์ ๋นํธ์ธ์ผ๋ก ์ ๊ณตํ๋ ๋ฆฌ์์ค์ด์ง๋ง ๋ ํ๋ฆฌ์นด์ ์ด๋ผ๋ ์ผ์ข ์ ์ปค์คํ ๋ฆฌ์์ค๋ "๋ผ๋ฒจ ์ ๋ ํฐ๊ฐ ์ผ์นํ๋ ์ผ์ ๊ฐ์์ ํ๋๋ฅผ ํญ์ ์ ์งํ๋" ๋์์ด์๊ณ , ์ด ๋์์ ์ค์ง์ ์ผ๋ก ์ํ๋๋๋ก ํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ ๋งค๋์ ๋ผ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ํ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ชฉ์ฐจ์์ "Zedd" ๋ผ๋ ์ข ๋ฅ์ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์ค์ง์ ์ธ ๋์์ ์ํํ๊ฒ ํ๋ ค๋ฉด ์ด "Zedd" ๋ผ๋ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ๋์์ ์ํํ๋๋ก ํ๋ ์ปจํธ๋กค๋ฌ๋ผ๋ ๊ฒ์ด ๊ตฌํ๋์ด ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ปจํธ๋กค๋ฌ๋ Go์ธ์ด์ ๊ฐ์ ์์ค์ฝ๋ ๋ ๋ฒจ์ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ๊ตฌํ๋์ด์ผ ํ๋ค.(๋ฌผ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ ์์ฒด๊ฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ Operator SDK๋ KubeBuilder์ ๊ฐ์ ๋ค์ํ ํ๋ ์ํฌ๊ฐ ์กด์ฌํ๋ค)
๋ง์ฝ ์๋ฅผ ๋ค์ด, "Zedd" ๋ผ๋ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์ํํ๋ ๋ชฉ์ ์ด "ํญ์ 2๊ฐ์ ํ๋๋ฅผ ์์ฑํ๋ ๊ฒ" ์ด๋ผ๊ณ ํด๋ณด์. ์ด ๋, CRD, ์ปค์คํ ๋ฆฌ์์ค, ์ปจํธ๋กค๋ฌ์ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
(์ปค์คํ ๋ฆฌ์์ค์ ๋ํ ์ปจํธ๋กค๋ฌ๊ฐ ์ด๋ฏธ ๊ตฌํ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋)๊ฐ์ฅ ๋จผ์ CRD๋ฅผ ์์ฑํ๊ณ , ๋ค์์ผ๋ก ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค. ์ด์ ์ปจํธ๋กค๋ฌ๋ ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์์ฑ๋ ๊ฒ์ ๊ฐ์งํ๊ณ , ํด๋น ์ปค์คํ ๋ฆฌ์์ค๊ฐ ์๋ํ๋ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ค. ์ด '๋น์ฆ๋์ค ๋ก์ง'์ด๋ ๊ฒ์ ๋ฐ๋ก ํ๋ 2๊ฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์ปจํธ๋กค๋ฌ๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ํ ์ฆ, ์ฟ ๋ฒ๋คํฐ์ค ์์์๋ 'ํ์ฌ ์ํ๊ฐ ๋ฐ๋์งํ ์ํ๊ฐ ๋๋๋ก ํ๋'์ด ๋์์ "Reconcile" ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค๋ ์ ๋ ์์๋์. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ CRD๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์คํผ๋ ์ดํฐ(Operator) ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฌํ CRD๋ฅผ ์ฌ์ฉํด์ ์คํผ๋ ์ดํฐ ํจํด์ ํ์ฉํด์ ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ ๋ ๋งค์ฐ ์ค์ํ๊ฒ ์ฌ๊ฒจ์ง๋ ์๋ฆฌ ์ค ํ๋์ด๋ค. ๋ฌผ๋ก ์ปค์คํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก CRD์ ์คํผ๋ ์ดํฐ ํจํด๋ง์ ์ด์ฉํ ์ ์๋ ๊ฒ์ ์๋๋ผ๋ ์ ๋ ์์๋์.