Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

8์›” XNUMX์ผ ์ปจํผ๋Ÿฐ์Šค์—์„œ ์„ธ์ธํŠธ ํ•˜์ด๋กœ๋“œ++ 2019, "DevOps ๋ฐ ์šด์˜" ์„น์…˜์˜ ์ผ๋ถ€๋กœ Flant ํšŒ์‚ฌ ์ง์› XNUMX๋ช…์ด ์ฐธ์—ฌํ•œ "Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„" ๋ณด๊ณ ์„œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๋Š” Kubernetes์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ๋ณด์™„ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์ง€ ๋ชปํ•œ ์ˆ˜๋งŽ์€ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ํ˜•ํƒœ๋กœ ํ•„์š”ํ•œ ์†”๋ฃจ์…˜์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์—ฐ์„ค๋„ ์ด์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „ํ†ต์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ ์˜์ƒ (50๋ถ„, ๊ธฐ์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์œ ์ตํ•จ) ๋ฐ ํ…์ŠคํŠธ ํ˜•์‹์˜ ์ฃผ์š” ์š”์•ฝ. ๊ฐ€๋‹ค!

K8s์˜ ํ•ต์‹ฌ ๋ฐ ์ถ”๊ฐ€ ์‚ฌํ•ญ

Kubernetes๋Š” ์—…๊ณ„์™€ ์˜ค๋žซ๋™์•ˆ ํ™•๋ฆฝ๋œ ๊ด€๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณ€ํ™”์‹œํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Kubernetes ์—ญ์‹œ ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์•ˆ๊ฒจ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ์•„๋‹ˆ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฐํ•ฉ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ Kubernetes๋Š” ๋‹ค์Œ์— ์กด์žฌํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ ์„ธํŠธ๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฌด๋ฆฌ:

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

Kubernetes ์ฝ”์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ทธ๋ฃนํ™”, ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ ๋“ฑ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋ณธ ์š”์†Œ ์„ธํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. 2๋…„ ์ „ ๋ณด๊ณ .

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

๋ฐ˜๋ฉด, K8s๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜์—ฌ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋‹ซ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ข‹์€ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠน์ •ํ•œ โ€” ์‚ฌ์šฉ์ž ์š”๊ตฌ. Kubernetes์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์‚ฌํ•ญ์€ [ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด] ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ "์˜ฌ๋ฐ”๋ฅธ ๋ชจ์–‘"์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ์˜ˆ

Kubernetes๋ฅผ ์„ค์น˜ํ•œ ํ›„ ๋…ธ๋“œ ๋‚ด๋ถ€์™€ ๋…ธ๋“œ ๊ฐ„ Pod์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๊ผญ ํ•„์š”ํ•œ ๋„คํŠธ์›Œํ‚น์ด ์ž์ฒด์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ์ปค๋„์€ ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค (CNI) ํƒ€์‚ฌ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ. ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

๊ฐ€๊นŒ์šด ์˜ˆ๋กœ๋Š” ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜(๋กœ์ปฌ ๋””์Šคํฌ, ๋„คํŠธ์›Œํฌ ๋ธ”๋ก ์žฅ์น˜, Ceph...)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ•ต์‹ฌ์— ์žˆ์—ˆ์ง€๋งŒ ์ถœํ˜„๊ณผ ํ•จ๊ป˜ CSI ์ƒํ™ฉ์€ ์ด๋ฏธ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” Kubernetes์— ์žˆ๊ณ  ํ•ด๋‹น ๊ตฌํ˜„์€ ํƒ€์‚ฌ ๋ชจ๋“ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž…๊ตฌ-์ปจํŠธ๋กค๋Ÿฌ (๊ทธ๋“ค์˜ ๋ฆฌ๋ทฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” ์šฐ๋ฆฌ์˜ ์ตœ๊ทผ ๊ธฐ์‚ฌ).
  • ์ธ์ฆ ๊ด€๋ฆฌ์ž:

    Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

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

    Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

  • ์ธก์ •ํ•ญ๋ชฉ - Kubernetes๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค(Metrics API)๋ฅผ ๊ตฌํ˜„(Prometheus ์–ด๋Œ‘ํ„ฐ, Datadog ํด๋Ÿฌ์Šคํ„ฐ ์—์ด์ „ํŠธ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ...)์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.
  • ์— ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ†ต๊ณ„, ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์™€ ๊ทธ๋ผํŒŒ๋‚˜, kube-state-metrics, node-exporter ๋“ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์˜คํ† ๋ฉ”์ด์…˜

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

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

๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์ผ์ƒ์ ์ธ ์ž‘์—…์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋ฉฐ ๋ฐ”๋ฅด๊ฒŒ ์ด๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช… ๋œ ๋ชจ๋“  ์ด์•ผ๊ธฐ๋ฅผ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. Kubernetes์—์„œ ํŽธ์•ˆํ•œ ์ž‘์—…์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ: ใ…) ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์„ค์น˜, ๋น„) ์šด์˜์ž๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค (์ผ์ƒ์ ์ธ ๊ด€๋ฆฌ ์ž‘์—…์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด)

Kubernetes์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑํ‘œ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

... ๊ทธ๋Ÿฐ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

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

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

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

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

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

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

์‰˜ ์šด์˜์ž๋Š” ์–ด๋–ค ์ด๋ฒคํŠธ์— ์–ด๋–ค ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”? ์ด ์ •๋ณด๋Š” ํ›„ํฌ ์ž์ฒด๋ฅผ ํ†ตํ•ด ์‰˜ ์šด์˜์ž์—๊ฒŒ ์ „์†ก๋˜๋ฉฐ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Bash ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๊ธฐํƒ€ ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. --config JSON์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ๊ฐœ์ฒด์™€ ์‘๋‹ตํ•ด์•ผ ํ•˜๋Š” ์ด๋ฒคํŠธ(์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•ด)๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

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

์—ฐ์Šต: 1. Hook ์ž‘์„ฑ

์šฐ์„  Hook์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. --config, ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ํŠนํžˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์ˆœ๊ฐ„์— ๊ด€์‹ฌ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

[[ $1 == "--config" ]] ; then
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF
โ€ฆ

๋…ผ๋ฆฌ๋Š” ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”? ๋˜ํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

โ€ฆ
else
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์–ด๋–ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. kubectl ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋น„๋ฐ€์ž…๋‹ˆ๋‹ค.

์—ฐ์Šต: 2. ์ด๋ฏธ์ง€ ์กฐ๋ฆฝํ•˜๊ธฐ

๋‚จ์€ ๊ฒƒ์€ ์ƒ์„ฑ๋œ ํ›„ํฌ๋ฅผ ์‰˜ ์šด์˜์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์…ธ ์—ฐ์‚ฐ์ž ์ž์ฒด๋Š” Docker ์ด๋ฏธ์ง€๋กœ ์ œ๊ณต๋˜๋ฏ€๋กœ ์šฐ๋ฆฌ์˜ ์ž‘์—…์€ ์ด ์ด๋ฏธ์ง€์˜ ํŠน์ˆ˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

๋‚จ์€ ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์กฐ๋ฆฝํ•˜๊ณ  ๋ฐ€์–ด๋‚ด๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

๋งˆ์ง€๋ง‰ ์ž‘์—…์€ ์ด๋ฏธ์ง€๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „๊ฐœ:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

์ฃผ์˜ํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ ํ‘œ์‹œ;
  2. ์ด๋Š” ์ตœ์†Œํ•œ Kubernetes์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋น„๋ฐ€์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฏ€๋กœ ํ›„ํฌ์— ๋Œ€ํ•œ ServiceAccount(๋ฐ ๊ทœ์น™ ์„ธํŠธ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ - ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค ์นœ์ฒ™๋“ค์—๊ฒŒ ๋น„๋ฐ€์„ ๋ถ„ํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Kubernetes๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์‰˜ ์—ฐ์‚ฐ์ž ๊ธฐ๋Šฅ

ํ›„ํฌ๊ฐ€ ์ž‘๋™ํ•  ์„ ํƒํ•œ ์œ ํ˜•์˜ ๊ฐœ์ฒด๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด, ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”, ํŠน์ • ๋ผ๋ฒจ์— ๋”ฐ๋ผ ์„ ํƒ(๋˜๋Š” matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     โ€ฆ
  }
]

์ œ๊ณต ์ค‘๋ณต ์ œ๊ฑฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜, jq ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฐ JSON ๊ฐœ์ฒด๋ฅผ ์ž‘์€ ๊ฐœ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‰˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์ด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋ฐ์ดํ„ฐ, ์–ด๋–ค ํ•„์š”์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์‰˜ ์—ฐ์‚ฐ์ž์˜ ๋‘ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋ณด๊ณ ์„œ์˜ ์ด ๋ถ€๋ถ„์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์„ค์น˜

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋กœ ํŽธ์•ˆํ•œ ์ž‘์—…์„ ์œ„ํ•ด์„œ๋Š” ์• ๋“œ์˜จ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰๋๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ€ ๊ฑธ์–ด์˜จ ๊ธธ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋œ ๊ฒƒ์€ Ingress๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์„ค์น˜ํ•ด์•ผ ํ–ˆ๊ณ , ๋ฒ ์–ด๋ฉ”ํƒˆ, AWS ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์—ฌ๋Ÿฌ YAML ๊ตฌ์„ฑ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๊ตฌ์„ฑ๋„ ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์ž์ฒด๋ฅผ ๊ฐœ์„ ํ–ˆ์œผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ ์ƒ๋‹นํžˆ ์ด์งˆ์ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

๋ชจ๋“  ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์Šคํฌ๋ฆฝํŠธ(install-ingress.sh)๋Š” ๋ฐฐํฌํ•  ํด๋Ÿฌ์Šคํ„ฐ ์œ ํ˜•์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ YAML ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Kubernetes์— ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ์šฐ๋ฆฌ์˜ ์ถ”๊ฐ€ ๊ฒฝ๋กœ์™€ ๊ทธ์™€ ๊ด€๋ จ๋œ ์ถ”๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • YAML ๊ตฌ์„ฑ์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ„๋‹จํ•œ sed์ž…๋‹ˆ๋‹ค).
  • ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ž๋™ ์—…๋ฐ์ดํŠธ์˜ ํ•„์š”์„ฑ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค(๊ฐ€์žฅ ์ดˆ๊ธฐ ์†”๋ฃจ์…˜์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ Git์— ๋„ฃ๊ณ  cron์„ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค).
  • Prometheus์—๋„ ์œ ์‚ฌํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค(install-prometheus.sh) ๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ์ €์žฅ ๊ณต๊ฐ„(์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ)์ด ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€ ๋ฐ์ดํ„ฐ(๋น„๋ฐ€๋ฒˆํ˜ธ)๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ฃผ๋ชฉํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค.

    Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

  • ์ ์  ๋” ๋งŽ์€ ์ˆ˜์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ์ž˜๋ชป๋œ ๊ฒƒ์„ ๋ฐฐํฌํ•  ์œ„ํ—˜์ด ์ง€์†์ ์œผ๋กœ ์ปค์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์„ค์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ (์ฆ‰, ๋‘ ๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ: Ingress ๋ฐ Prometheus์šฉ) ์ค€๋น„๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค(Git์˜ ์—ฌ๋Ÿฌ ๋ถ„๊ธฐ, ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ํฌ๋ก : ์•ˆ์ • ๋˜๋Š” ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ).
  • ั kubectl apply ์„ ์–ธ์ ์ด์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋งŒ ์žˆ๊ณ  ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
  • ๋‹น์‹œ ์ „ํ˜€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ์—…๋ฐ์ดํŠธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด,
    • ํด๋Ÿฌ์Šคํ„ฐ(๊ฒ€์ƒ‰)์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜(์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ž…๋ ฅ) ์ž๋™ ๊ฒฐ์ •,
    • ์ง€์†์ ์ธ ๋ฐœ๊ฒฌ์˜ ํ˜•ํƒœ๋กœ ๋…ผ๋ฆฌ์  ๋ฐœ์ „์„ ์ด๋ฃฌ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ์ถ•์ ๋œ ๊ฒฝํ—˜์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ํ‹€ ๋‚ด์—์„œ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์• ๋“œ์˜จ ์—ฐ์‚ฐ์ž.

์• ๋“œ์˜จ ์šด์˜์ž

์ด๋Š” ์ด๋ฏธ ์–ธ๊ธ‰๋œ ์‰˜ ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‰˜ ์—ฐ์‚ฐ์ž ํ›„ํฌ์— ๋‹ค์Œ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์น˜ ์ €์žฅ,
  • ํˆฌ๊ตฌ ์ฐจํŠธ,
  • ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ€์น˜ ์ €์žฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  - ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ - Helm์—๊ฒŒ ์ฐจํŠธ๋ฅผ ๋‹ค์‹œ ๋กค๋งํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

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

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

๋งŽ์€ ๋ชจ๋“ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๊ธ€๋กœ๋ฒŒ ํ›„ํฌ, ๊ธ€๋กœ๋ฒŒ ๊ฐ’ ์ €์žฅ์†Œ ๋ฐ ์ด ๊ธ€๋กœ๋ฒŒ ์ €์žฅ์†Œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Kubernetes์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ธ€๋กœ๋ฒŒ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์— ๋ฐ˜์‘ํ•˜๊ณ  ๊ธ€๋กœ๋ฒŒ ์ €์žฅ์†Œ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜์–ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์ด ๋กค์•„์›ƒ๋ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

์ด ๊ตฌ์„ฑํ‘œ๋Š” ์œ„์— ๋ช…์‹œ๋œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์„ค์น˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์ „์ฒด ์‹œ์Šคํ…œ์€ Go์—์„œ addon-operator๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋” ๋‹จ์ˆœํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Kubernetes ํ™•์žฅ ๋ฐ ๋ณด์™„(๊ฐœ์š” ๋ฐ ๋™์˜์ƒ ๋ณด๊ณ ์„œ)

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

"ํ”Œ๋žœํŠธ"๋Š” ์• ๋“œ์˜จ ์—ฐ์‚ฐ์ž 70๊ฐœ ์ด์ƒ์˜ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ. ํ˜„์žฌ ์ƒํƒœ - ์•ŒํŒŒ ๋ฒ„์ „. ์ด์ œ ๋ฒ ํƒ€ ์ถœ์‹œ๋ฅผ ์œ„ํ•œ ๋ฌธ์„œ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ˆ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ๋งŒ์˜ ์• ๋“œ์˜จ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

addon-operator ๋ชจ๋“ˆ์€ ์–ด๋””์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์šฐ๋ฆฌ ๋„์„œ๊ด€ ์ถœํŒ์€ ์šฐ๋ฆฌ์˜ ๋‹ค์Œ ๋‹จ๊ณ„์ด๋ฉฐ ์—ฌ๋ฆ„์— ์ถœํŒํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

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

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

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

PS

์šฐ๋ฆฌ ๋ธ”๋กœ๊ทธ์˜ ๋‹ค๋ฅธ ๋ณด๊ณ ์„œ:

๋‹ค์Œ ์ถœํŒ๋ฌผ์—๋„ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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