๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์˜ฌํ•ด ์œ ๋Ÿฝ์˜ ์ฃผ์š” Kubernetes ์ปจํผ๋Ÿฐ์Šค์ธ KubeCon + CloudNativeCon Europe 2020์€ ๊ฐ€์ƒ์œผ๋กœ ๊ฐœ์ตœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํ˜•์‹ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๊ณ„ํšํ•œ ๋ณด๊ณ ์„œ "Go?"๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์ „์šฉ Shell-operator๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”โ€ ์‰˜ ์—ฐ์‚ฐ์ž.

๊ฐ•์—ฐ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ž‘์„ฑ๋œ ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Kubernetes์šฉ ์—ฐ์‚ฐ์ž ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์‹œํ•˜๊ณ  ์…ธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ž์‹ ๋งŒ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์†Œ๊ฐœ ๋ณด๊ณ ์„œ ์˜์ƒ (์˜์–ด๋กœ ์ตœ๋Œ€ 23๋ถ„, ๊ธฐ์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ •๋ณด ์ œ๊ณต) ๋ฐ ํ…์ŠคํŠธ ํ˜•์‹์˜ ์ฃผ์š” ๋ฐœ์ทŒ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋‹ค!

Flant์—์„œ๋Š” ์ง€์†์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๊ฐœ๋…์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ๋‚˜๋‹ค: ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ ์Šคํฌ๋ฆฝํŒ…!

ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ์ผ์ด ์ผ์–ด๋‚˜๋Š” ๋งฅ๋ฝ์ธ Kubernetes๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Kubernetes API ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ

Kubernetes์˜ API๋Š” ๊ฐ ๊ฐœ์ฒด ์œ ํ˜•์— ๋Œ€ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ผ์ข…์˜ ํŒŒ์ผ ์„œ๋ฒ„๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„์˜ ๊ฐœ์ฒด(๋ฆฌ์†Œ์Šค)๋Š” YAML ํŒŒ์ผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„œ๋ฒ„์—๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ~์„ ๋ฐ›๋‹ค ์ข…๋ฅ˜์™€ ์ด๋ฆ„์— ๋”ฐ๋ฅธ ์ž์›;
  • ๋ณ€ํ™” ๋ฆฌ์†Œ์Šค(์ด ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” "์˜ฌ๋ฐ”๋ฅธ" ๊ฐœ์ฒด๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๊ฐœ์ฒด๋‚˜ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ์šฉ ๊ฐœ์ฒด๋Š” ๋ชจ๋‘ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.)
  • ๋”ฐ๋ฅด๋‹ค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ์ฆ‰์‹œ ํ˜„์žฌ/์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์„ ๋ฐ›์Šต๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ Kubernetes๋Š” ์„ธ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ข…์˜ ํŒŒ์ผ ์„œ๋ฒ„(YAML ๋งค๋‹ˆํŽ˜์ŠคํŠธ์šฉ) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ, ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค).

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋ฌธ์ œ๋Š” ์„œ๋ฒ„๊ฐ€ ์ •๋ณด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋„๋กํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ด ์žฅ์น˜ - Kubernetes ์„ธ๊ณ„์—์„œ ๋‘ ๋ฒˆ์งธ๋กœ ์ค‘์š”ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” Kubernetes์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์ค‘์ฒฉ๋œ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•œ ํ›„ K8s์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์œ ํ˜•์€ Kubernetes์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์œ ํ˜•๊ณผ ๋‹ฌ๋ฆฌ ์ผ๋ถ€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์—์„œ ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ฐฐํฌ ์ปจํŠธ๋กค๋Ÿฌ(ํฌํ•จ๋จ kube-controller-manager)์€ ๋ฐฐํฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ReplicaSet์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ReplicaSet์€ ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ณต์ œ๋ณธ(๋‘ ๊ฐœ์˜ Pod)์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Pod๋Š” ์•„์ง ์˜ˆ์•ฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ํ•ด๋‹น YAML์— ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • Kubelet์€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค(์˜ˆ: Docker)๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์ „์ฒด ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. kubelet์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•˜๊ณ  ํฌ๋“œ์˜ ์ƒํƒœ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„ ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ReplicaSet ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋„ ๋™์ผํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ตœ์ข…์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ(ํ˜„์žฌ) ์ƒํƒœ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์‰˜ ์—ฐ์‚ฐ์ž

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

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๊ฐ„๋‹จํ•œ ์˜ˆ: ๋น„๋ฐ€ ๋ณต์‚ฌ

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. default ๋น„๋ฐ€์ด ์žˆ๋Š” mysecret. ๋˜ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€์—๋Š” ํŠน์ • ๋ผ๋ฒจ์ด ๋ถ€์ฐฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” Secret์„ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด์ œ ์ž‘์—…์ด ๊ณต์‹ํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ ์…ธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ ์ž์ฒด์— ๋Œ€ํ•ด ๋ช‡ ๋งˆ๋”” ๋งํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์ž‘๋™ ๋ฐฉ์‹

Kubernetes์˜ ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Shell-Operator๋Š” ์ž์ฒด ํฌ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ด ํฌ๋“œ์—์„œ /hooks ์‹คํ–‰ ํŒŒ์ผ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Bash, Python, Ruby ๋“ฑ์˜ ์Šคํฌ๋ฆฝํŠธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์‹คํ–‰ ํŒŒ์ผ์„ ํ›„ํฌ(hook)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.ํ›„ํฌ).

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

Shell-operator๋Š” Kubernetes ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ํ•„์š”ํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ด๋Ÿฌํ•œ ํ›„ํฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์‰˜ ์šด์˜์ž๋Š” ์–ด๋–ค ํ›„ํฌ๋ฅผ ์–ธ์ œ ์‹คํ–‰ํ• ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”? ์š”์ ์€ ๋ชจ๋“  ํ›„ํฌ์—๋Š” ๋‘ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ ์‰˜ ์šด์˜์ž๋Š” ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ›„ํฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. --config ๊ตฌ์„ฑ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ํ›„ํฌ๋Š” ์—ฐ๊ฒฐ๋œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ ํ›„ํฌ๋Š” ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ(๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ) - JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Bash์—์„œ ์—ฐ์‚ฐ์ž ๋งŒ๋“ค๊ธฐ

์ด์ œ ๊ตฌํ˜„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค). ๋„์„œ๊ด€ shell_lib, ์ด๋Š” Bash์—์„œ ํ›„ํฌ ์ž‘์„ฑ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค):

  • ์ฒซ ๋ฒˆ์งธ๋Š” ๊ตฌ์„ฑ ๋‹จ๊ณ„์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ์—๋Š” ํ›„ํฌ์˜ ์ฃผ์š” ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

source /shell_lib.sh

function __config__() {
  cat << EOF
    configVersion: v1
    # BINDING CONFIGURATION
EOF
}

function __main__() {
  # THE LOGIC
}

hook::run "$@"

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์†Œ์Šค ๋น„๋ฐ€;
  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ ˆ์ด๋ธ”์ด ๋ถ™์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ ๋น„๋ฐ€์ด ๋ชจ๋‘ ์†Œ์Šค ๋น„๋ฐ€๊ณผ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋น„๋ฐ€ ์†Œ์Šค๋ฅผ ๊ตฌ๋…ํ•˜์„ธ์š”

์ด์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ ๊ตฌ์„ฑ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฆ„์œผ๋กœ Secret์— ๊ด€์‹ฌ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. mysecret ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ default:

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

function __config__() {
  cat << EOF
    configVersion: v1
    kubernetes:
    - name: src_secret
      apiVersion: v1
      kind: Secret
      nameSelector:
        matchNames:
        - mysecret
      namespace:
        nameSelector:
          matchNames: ["default"]
      group: main
EOF

๊ฒฐ๊ณผ์ ์œผ๋กœ ์†Œ์Šค ๋น„๋ฐ€์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ›„ํฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค(src_secret) ๋‹ค์Œ ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๋ฆ„๊ณผ ์ „์ฒด ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”์ 

์ด์ œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ตฌ๋…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ๋ฐ”์ธ๋”ฉ ๊ตฌ์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

- name: namespaces
  group: main
  apiVersion: v1
  kind: Namespace
  jqFilter: |
    {
      namespace: .metadata.name,
      hasLabel: (
       .metadata.labels // {} |  
         contains({"secret": "yes"})
      )
    }
  group: main
  keepFullObjectsInMemory: false

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ด๋ฆ„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ ํ•„๋“œ๊ฐ€ ๊ตฌ์„ฑ์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. jqFilter. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, jqFilter ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ƒˆ JSON ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์„ ๊ฐ€์ง„ ํ›„ํฌ๋Š” ๋‹ค์Œ ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋ฐฐ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. filterResults ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด. ๋ถ€์šธ ๋ณ€์ˆ˜ hasLabel ์ง€์ •๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ ˆ์ด๋ธ”์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์„ ํƒ์ž keepFullObjectsInMemory: false ์™„์ „ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋Œ€์ƒ ๋น„๋ฐ€ ์ถ”์ 

์ฃผ์„์ด ์ง€์ •๋œ ๋ชจ๋“  ๋น„๋ฐ€์„ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. managed-secret: "yes" (์ด๊ฒŒ ์šฐ๋ฆฌ ๋ชฉํ‘œ์•ผ dst_secrets):

- name: dst_secrets
  apiVersion: v1
  kind: Secret
  labelSelector:
    matchLabels:
      managed-secret: "yes"
  jqFilter: |
    {
      "namespace":
        .metadata.namespace,
      "resourceVersion":
        .metadata.annotations.resourceVersion
    }
  group: main
  keepFullObjectsInMemory: false

์ด ๊ฒฝ์šฐ jqFilter ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. resourceVersion. ๋น„๋ฐ€์„ ์ƒ์„ฑํ•  ๋•Œ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฃผ์„์— ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€์˜ ๋ฒ„์ „์„ ๋น„๊ตํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ›„ํฌ๋Š” ์‹คํ–‰ ์‹œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์„ธ ๊ฐ€์ง€ ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์Šค๋ƒ…์ƒท(์Šค๋ƒ… ์‚ฌ์ง„) ๋ฌด๋ฆฌ.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉด hasLabel ๋ฌธ์ œ true ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ:
    • ์ „์—ญ ๋น„๋ฐ€์„ ๋กœ์ปฌ ๋น„๋ฐ€๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
      • ๋™์ผํ•˜๋‹ค๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ - ์‹คํ–‰ kubectl replace ๋˜๋Š” create;
  • ๋ฉด hasLabel ๋ฌธ์ œ false ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ:
    • Secret์ด ์ง€์ •๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—†๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
      • ๋กœ์ปฌ ๋น„๋ฐ€์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œํ•˜์„ธ์š”. kubectl delete;
      • ๋กœ์ปฌ ๋น„๋ฐ€์ด ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

Bash์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ์šฐ๋ฆฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์˜ˆ์ œ๊ฐ€ ์žˆ๋Š” ์ €์žฅ์†Œ.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ 35์ค„์˜ YAML ๊ตฌ์„ฑ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ์–‘์˜ Bash ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ Kubernetes ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค! ์‰˜ ์šด์˜์ž์˜ ์ž„๋ฌด๋Š” ์ด๋“ค์„ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋น„๋ฐ€ ๋ณต์‚ฌ๊ฐ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ ์šฉ์˜ ์œ ์ผํ•œ ์˜์—ญ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ 1: ConfigMap ๋ณ€๊ฒฝ

์„ธ ๊ฐœ์˜ ํฌ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐํฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ConfigMap์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๊ตฌ์„ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ ConfigMap์€ ํŠน์ • ์ƒํƒœ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(v.1์ด๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๋ชจ๋“  Pod๋Š” ์ด ํŠน์ • ๋ฒ„์ „์˜ ConfigMap์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ConfigMap์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(v.2). ๊ทธ๋Ÿฌ๋‚˜ Pod๋Š” ์ด์ „ ๋ฒ„์ „์˜ ConfigMap(v.1)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์ƒˆ๋กœ์šด ConfigMap(v.2)์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์„น์…˜์— ์ฒดํฌ์„ฌ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. template ๋ฐฐํฌ ๊ตฌ์„ฑ:

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์ฒดํฌ์„ฌ์€ ๋ชจ๋“  Pod์— ๋“ฑ๋ก๋˜๋ฉฐ, ๋ฐฐํฌ์˜ ์ฒดํฌ์„ฌ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ConfigMap์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ฃผ์„์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‰˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค ConfigMap์„ ๊ตฌ๋…ํ•˜๊ณ  ์ฒดํฌ์„ฌ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ›„ํฌ.

์‚ฌ์šฉ์ž๊ฐ€ ConfigMap์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์‰˜ ์šด์˜์ž๋Š” ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์ฒดํฌ์„ฌ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์— Kubernetes์˜ ๋งˆ๋ฒ•์ด ๋ฐœํœ˜๋ฉ๋‹ˆ๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ํฌ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ƒˆ ํฌ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํฌ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. Ready, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐฐํฌ๋Š” ConfigMap์˜ ์ƒˆ ๋ฒ„์ „์„ ๋™๊ธฐํ™”ํ•˜๊ณ  ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์˜ˆ 2: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜ ์ž‘์—…

์•„์‹œ๋‹ค์‹œํ”ผ Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ข…๋ฅ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MysqlDatabase. ์ด ์œ ํ˜•์— ๋‘ ๊ฐœ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. name ะธ namespace.

apiVersion: example.com/v1alpha1
kind: MysqlDatabase
metadata:
  name: foo
  namespace: bar

MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‰˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MysqlDatabase, ์ด๋ฅผ MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์˜ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ๊ด€์ฐฐ๋œ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์˜ˆ 3: ํด๋Ÿฌ์Šคํ„ฐ ๋„คํŠธ์›Œํฌ ๋ชจ๋‹ˆํ„ฐ๋ง

์•„์‹œ๋‹ค์‹œํ”ผ ping์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” shell-operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์šฐ์„ , ๋…ธ๋“œ๋ฅผ ๊ตฌ๋…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‰˜ ์šด์˜์ž๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์ด๋ฆ„๊ณผ IP ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์„ ๋ฐ›์•„ ๊ทธ๋Š” ์ด๋Ÿฌํ•œ ๋…ธ๋“œ์— ํ•‘์„ ๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

configVersion: v1
kubernetes:
- name: nodes
  apiVersion: v1
  kind: Node
  jqFilter: |
    {
      name: .metadata.name,
      ip: (
       .status.addresses[] |  
        select(.type == "InternalIP") |
        .address
      )
    }
  group: main
  keepFullObjectsInMemory: false
  executeHookOnEvent: []
schedule:
- name: every_minute
  group: main
  crontab: "* * * * *"

๋งค๊ฐœ ๋ณ€์ˆ˜ executeHookOnEvent: [] ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต(์ฆ‰, ๋…ธ๋“œ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€, ์‚ญ์ œ์— ๋Œ€ํ•œ ์‘๋‹ต)์œผ๋กœ ํ›„ํฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ๋‹ฌ๋ฆด ๊ฒƒ์ด๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค) ์˜ˆ์ •๋Œ€๋กœ - ํ˜„์žฅ์—์„œ ๊ทœ์ •ํ•œ ๋Œ€๋กœ XNUMX๋ถ„๋งˆ๋‹ค schedule.

์ด์ œ ์งˆ๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค. ํŒจํ‚ท ์†์‹ค๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function __main__() {
  for i in $(seq 0 "$(context::jq -r '(.snapshots.nodes | length) - 1')"); do
    node_name="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.name')"
    node_ip="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.ip')"
    packets_lost=0
    if ! ping -c 1 "$node_ip" -t 1 ; then
      packets_lost=1
    fi
    cat >> "$METRICS_PATH" <<END
      {
        "name": "node_packets_lost",
        "add": $packets_lost,
        "labels": {
          "node": "$node_name"
        }
      }
END
  done
}

์šฐ๋ฆฌ๋Š” ๋…ธ๋“œ ๋ชฉ๋ก์„ ๋ฐ˜๋ณตํ•˜๊ณ , ๋…ธ๋“œ์˜ ์ด๋ฆ„๊ณผ IP ์ฃผ์†Œ๋ฅผ ์–ป์€ ํ›„, ํ•‘์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ Prometheus๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. Shell-operator๋Š” ๋ฉ”ํŠธ๋ฆญ์„ Prometheus๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์œ„์น˜ํ•œ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. $METRICS_PATH.

์—ฌ๊ธฐ ๊ทธ๋ ‡๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ฐ„๋‹จํ•œ ๋„คํŠธ์›Œํฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ์šด์˜์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฉ”์ปค๋‹ˆ์ฆ˜

์ด ๊ธฐ์‚ฌ๋Š” ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ์— ๋‚ด์žฅ๋œ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถˆ์™„์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ผ์ข…์˜ ํ›„ํฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”.

  • ๋™์‹œ์— ํด๋Ÿฌ์Šคํ„ฐ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ํ•˜๋‚˜ ๋” ์ด๋ฒคํŠธ?
  • ์‰˜ ์šด์˜์ž๊ฐ€ ํ›„ํฌ์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ?
  • ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์‹œ์— XNUMX๊ฐœ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
  • ์‰˜ ์šด์˜์ž๊ฐ€ ์ด๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
  • ๋ฉ”๋ชจ๋ฆฌ, CPU ๋“ฑ ์†Œ๋น„๋˜๋Š” ๋ฆฌ์†Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ shell-operator์—๋Š” ๋Œ€๊ธฐ์—ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฒคํŠธ๋Š” ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜์–ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฅผ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ํ›„ํฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ๋Š” ์ฒซ ๋ฒˆ์งธ ํ›„ํฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋Œ€๊ธฐ์—ด์ด ์•ž์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ ๊ฐœ์˜ ์ด๋ฒคํŠธ๋Š” ๋‘ ๋ฒˆ์งธ ํ›„ํฌ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐ๋˜์–ด "๋ฒˆ๋“ค"์— ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ํ›„ํฌ๋Š” ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. โ€” ๋˜๋Š” ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋ฐ”์ธ๋”ฉ ์ปจํ…์ŠคํŠธ์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋“ค ์ด๋ฒคํŠธ๋Š” ํ•˜๋‚˜์˜ ํฐ ์ด๋ฒคํŠธ๋กœ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. group ๋ฐ”์ธ๋”ฉ ๊ตฌ์„ฑ์—์„œ.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์›ํ•˜๋Š” ๋งŒํผ์˜ ๋Œ€๊ธฐ์—ด/ํ›„ํฌ์™€ ๋‹ค์–‘ํ•œ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ๋Œ€๊ธฐ์—ด์ด ๋‘ ๊ฐœ์˜ ํ›„ํฌ์™€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๊ทธ์— ๋”ฐ๋ผ ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. queue ๋ฐ”์ธ๋”ฉ ๊ตฌ์„ฑ์—์„œ. ํ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ›„ํฌ๋Š” ๊ธฐ๋ณธ ํ(default). ์ด ํ์ž‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›„ํฌ ์ž‘์—… ์‹œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” ์…ธ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ , ๊ทธ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์‰˜ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋น ๋ฅธ ํŠœํ† ๋ฆฌ์–ผ์€ ํ•ด๋‹น ํ•ญ๋ชฉ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. ํŠน๋ณ„ ์ƒ๋‹ด์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ณด ๊ทธ๋ฃน (๋Ÿฌ์‹œ์•„์–ด) ๋˜๋Š” ์ด ํฌ๋Ÿผ (์˜์–ด๋กœ).

๋งˆ์Œ์— ๋“œ์…จ๋‹ค๋ฉด GitHub์—์„œ ์ƒˆ๋กœ์šด ์ด์Šˆ/ํ™๋ณด/์Šคํƒ€๋ฅผ ๋งŒ๋‚˜๋ณด์‹ค ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ๋„ ์ฐพ์•„๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ํ”„๋กœ์ ํŠธ. ๊ทธ ์ค‘์—์„œ๋„ ๊ฐ•์กฐํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ์• ๋“œ์˜จ ์—ฐ์‚ฐ์ž, ์ด๋Š” Shell-Operator์˜ ํฐ ํ˜•์ž…๋‹ˆ๋‹ค.. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” Helm ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•˜๊ณ , ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ฐจํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜/๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ์ฐจํŠธ ์„ค์น˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ฐจํŠธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋‹ค? ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค! ์‰˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”(KubeCon EU'2020์˜ ๋ฆฌ๋ทฐ ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋น„๋””์˜ค ๋ฐ ์Šฌ๋ผ์ด๋“œ

๊ณต์—ฐ ์˜์ƒ(~23๋ถ„):


๋ณด๊ณ ์„œ ๋ฐœํ‘œ:

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€