๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Kubernetes

[Kubernetes] CRD, ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค, ๊ทธ๋ฆฌ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค, 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 ์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณต์žกํ•˜๊ณ  ๋งŽ์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ž„์œผ๋กœ์จ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ง˜๊ป ํ™•์žฅํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํŽธ๋ฆฌํ•œ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๋‹น์—ฐํžˆ ํŽธ๋ฆฌํ•˜๊ฒ ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ํŽธ๋ฆฌํ•œ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„๋Š” ๊ฝค๋‚˜ ์‰ฝ์ง€ ์•Š์€ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.(์—ญ์‹œ ๋ชจ๋‘์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋’ค์—์„œ ๊ณ ์ƒ์„...) ์–ด์จŒ๊ฑฐ๋‚˜ ๊ตฌ์ฒด์ ์œผ๋กœ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋Š” ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

  1. ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ฐ”๋žŒ์งํ•œ ์ƒํƒœ๋กœ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค
  2. ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๋Š” CRD(Custom Resource Definition) ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  3. CRD์— ์ •์˜๋œ ๋ฐ์ดํ„ฐ์— ๋งž์ถฐ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  4. 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, CR, Controller

 

์ง์ „ ๋ชฉ์ฐจ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ 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์™€ ์˜คํผ๋ ˆ์ดํ„ฐ ํŒจํ„ด๋งŒ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ๋„ ์•Œ์•„๋‘์ž.

 

 

๋ฐ˜์‘ํ˜•