Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”

Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”

5๋…„ ๋ฐ˜ ์ „์ธ 2018๋…„ XNUMX์›” XNUMX์ผ, Google์€ ์˜คํ”ˆ ์†Œ์Šค CI/CD ํ”„๋กœ์ ํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์•ŒํŒŒ ๋ฒ„์ „์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ณ„๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌ๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก "๊ฐ„๋‹จํ•˜๊ณ  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ Kubernetes ๊ฐœ๋ฐœ"์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šค์บํด๋“œ์— ๋Œ€ํ•ด ํฅ๋ฏธ๋กœ์šด ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์•Œ๊ณ  ๋ณด๋‹ˆ ์ด ๋„๊ตฌ์—๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋ฌผ๋ก , ์šด์˜ ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ๋„ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋น„๋ฐ€์ด ์ˆจ๊ฒจ์ ธ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์™€ ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

NB: ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ์˜ ์ผ๋ฐ˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ Skaffold์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๋ฆฌ๋ทฐ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ์‚ถ์ด ์—ฐ๊ฒฐ๋œ ์‚ฌ๋žŒ๋“ค.

์ด๋ก . ๋ชฉ์ ๊ณผ ์—ญ๋Ÿ‰

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

Skaffold์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ์ž ๋ฌด๋ฃŒ Apache License 2.0(GitHub) ์กฐ๊ฑด์— ๋”ฐ๋ผ.

์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ํŠน์ง•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Skaffold๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์ž๋™ํ™”๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋ฅผ Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ฒŒ์‹œํ•˜๊ณ , Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์˜ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์™€ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „๋‹ฌ ํฌํŠธ.
  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • Java, Node.js, Python, Go๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ฒ„๊น…์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Skaffold ์ž์ฒด์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ธก ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.. ์ฆ‰, ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Kubernetes๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ท€ํ•˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํŒŒ์ดํ”„๋ผ์ธ. ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ๋กœ์ปฌ Minikube์— ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•œ ๋‹ค์Œ ์Šคํ…Œ์ด์ง•์ด๋‚˜ ํ”„๋กœ๋•์…˜์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์น˜๊ฐ€ ์ทจํ•ด์ง„๋‹ค. ะฟั€ะพั„ะธะปะธ ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CLI. ์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ YAML ๊ตฌ์„ฑ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์—์„œ ์ด๋ฅผ ๋งŒ๋“ค๋ ค๋Š” ์‹œ๋„์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ—˜์  GUI, ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„  ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ํ•„์š”ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํฌ๊ฒŒ ํ•„์š”ํ•˜์ง€๋Š” ์•Š๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ์„ฑ. ์Šค์บํด๋“œ๋Š” ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜ํ™•๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํŠน์ • ์ž‘์—…์— ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์ด๋‚˜ ๊ธฐ์กด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ทธ๋ฆผ:

  • ์กฐ๋ฆฝ ๋‹จ๊ณ„์—์„œ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • docker๋Š” ๋กœ์ปฌ์—์„œ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜, kaniko๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜, Google Cloud Build์—์„œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ”์ ค์€ ์ง€์—ญ์ ์œผ๋กœ;
    • Jib Maven๊ณผ Jib Gradle์€ ๋กœ์ปฌ ๋˜๋Š” Google Cloud Build์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ. ๋‹ค๋ฅธ (๋” ์œ ์—ฐํ•˜๊ณ  ์ต์ˆ™ํ•œ/...) ๋นŒ๋“œ ์†”๋ฃจ์…˜์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Skaffold๊ฐ€ ์ด๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์Šคํฌ๋ฆฝํŠธ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.๋ฌธ์„œ์˜ ์˜ˆ). ์ด๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋ฏธ ์–ธ๊ธ‰๋œ ๊ฒƒ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ ํ…Œ์ŠคํŠธ;
  • ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
    • ์ฟ ๋ฒกํ‹€;
    • ์ง€๋ฐฐ;
    • ๋งž์ถค์„ค์ •.

์ด๊ฒƒ์ด Skaffold๋ฅผ ๋…ํŠนํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค CI/CD ๊ตฌ์ถ•์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์›Œํฌํ”Œ๋กœ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ ์„ค๋ช…์„œ์—์„œ ๋ฐœ์ทŒ):

Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”

์Šค์บํด๋“œ์˜ ์ž‘์—…์€ ์ „๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”?

  1. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์†Œ์Šค ์ฝ”๋“œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด ํ•ด๋‹น ์ˆ˜์ • ์‚ฌํ•ญ์€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ์™€ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ์กฐ๋ฆฝ๋ฉ๋‹ˆ๋‹ค.
  2. ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋Š” container-structure-test๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋˜๊ณ , ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  3. ์ดํ›„ ์ด๋ฏธ์ง€๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  4. ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ด ์ดˆ๊ธฐํ™”๋œ ๊ฒฝ์šฐ skaffold dev๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  Skaffold๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋‹ค๋ ค ๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”
์Šค์บํด๋“œ ์ž‘์—…์˜ ์ฃผ์š” ๋‹จ๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ฆผ

๊ด€ํ–‰. ์Šค์บํด๋“œ ์‹œ๋„

Skaffold์˜ ์‚ฌ์šฉ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ GitHub ์ €์žฅ์†Œ. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ibid ๋‹ค์–‘ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•œ ๋‹ค๋ฅธ ์˜ˆ๋„ ๋งŽ์ด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž‘์—…์€ Minikube์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋ช‡ ๋ถ„ ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ, ์‹œ์ž‘ํ•˜๋ ค๋ฉด kubectl์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Skaffold๋ฅผ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

ํ•„์š”ํ•œ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Skaffold์˜ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

์ €๋Š” ๋‘ ๊ฐœ์˜ ํฌ๋“œ๊ฐ€ ์žˆ๋Š” ์˜ˆ๋ฅผ ์„ ํƒํ–ˆ๋Š”๋ฐ, ๊ฐ๊ฐ์€ ์ž‘์€ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ•˜๋‚˜์”ฉ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”„๋ŸฐํŠธ์—”๋“œ(leeroy-web)์ด๊ณ , ๋‘ ๋ฒˆ์งธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐฑ์—”๋“œ(leeroy-app)์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

~/skaffold/examples/microservices # tree
.
โ”œโ”€โ”€ leeroy-app
โ”‚   โ”œโ”€โ”€ app.go
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ””โ”€โ”€ kubernetes
โ”‚       โ””โ”€โ”€ deployment.yaml
โ”œโ”€โ”€ leeroy-web
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ”œโ”€โ”€ kubernetes
โ”‚   โ”‚   โ””โ”€โ”€ deployment.yaml
โ”‚   โ””โ”€โ”€ web.go
โ”œโ”€โ”€ README.adoc
โ””โ”€โ”€ skaffold.yaml
 
4 directories, 8 files

leeroy-app๊ณผ leeroy-web์—๋Š” ์ด ์ฝ”๋“œ์˜ ๋กœ์ปฌ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์œ„ํ•œ Go ์ฝ”๋“œ์™€ ๊ฐ„๋‹จํ•œ Dockerfiles๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
 
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .

๋‚˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ ์•Œ์•„๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. leeroy-web ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์ด๋ฅผ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค. leeroy-app. ๋”ฐ๋ผ์„œ ํŒŒ์ผ์—์„œ Deployment.yaml ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. app (๋‚ด๋ถ€ ๋ผ์šฐํŒ…์šฉ). ํฌ๋“œ ํฌํŠธ web ์šฐ๋ฆฌ๋Š” ์‹ ์ฒญ์„œ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋‚ด์šฉ์„ ์šฐ๋ฆฌ ์ž์‹ ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ์–‘ skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

์œ„์— ์–ธ๊ธ‰๋œ ๋ชจ๋“  ๋‹จ๊ณ„๊ฐ€ ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ์™ธ์—๋„ ๊ธ€๋กœ๋ฒŒ ์„ค์ •์ด ํฌํ•จ๋œ ํŒŒ์ผ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ~/.skaffold/config. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” CLI๋ฅผ ํ†ตํ•ด ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

skaffold config set --global local-cluster true

์ด ๋ช…๋ น์€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. local-cluster ์˜๋ฏธ์ƒ true๊ทธ๋Ÿฌ๋ฉด Skaffold๋Š” ์›๊ฒฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ์—์„œ๋„ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ์•„ ๊ฐ€๊ธฐ skaffold.yaml:

  • ๋ฌด๋Œ€ ์œ„์— build ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•œ ํ›„์—๋Š” ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    // ั‚.ะบ. Minikube ัะพะทะดะฐะตั‚ ะบะปะฐัั‚ะตั€ ะฒ ะพั‚ะดะตะปัŒะฝะพะน ะฒะธั€ั‚ัƒะฐะปัŒะฝะพะน ะผะฐัˆะธะฝะต,
    // ะฟั€ะธะดะตั‚ัั ะฟั€ะพะฝะธะบะฝัƒั‚ัŒ ะฒะฝัƒั‚ั€ัŒ, ั‡ั‚ะพะฑั‹ ะฝะฐะนั‚ะธ ะพะฑั€ะฐะทั‹
    # minikube ssh
    $ docker images
    REPOSITORY                                TAG                                                                IMAGE ID            CREATED             SIZE 
    leeroy-app                                7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e   7d55a5080359        4 hours ago         13MB 
    leeroy-app                                v0.37.1-171-g0270a0c-dirty                                         7d55a5080359        4 hours ago         13MB
    leeroy-web                                5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681   5063bfb29d98        5 hours ago         13.1MB
    leeroy-web                                v0.37.1-171-g0270a0c-dirty                                         5063bfb29d98        5 hours ago         13.1MB

    ๋ณด์‹œ๋‹ค์‹œํ”ผ, Skaffold๊ฐ€ ์ง์ ‘ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒœ๊ทธ ์ •์ฑ…์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ์—์„œ ๋” ๋‚˜์•„๊ฐ€์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค context: ./leeroy-app/์ฆ‰, ์ด๋ฏธ์ง€๊ฐ€ ์กฐ๋ฆฝ๋˜๋Š” ๋งฅ๋ฝ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ๋Š” kubectl๊ณผ ํ•„์ˆ˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋Œ€ํ•œ ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • PortForward: ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. kubectl port-forward, ์šฐ๋ฆฌ๋Š” ์Šค์บํด๋“œ์—๊ฒŒ ์ด ๋ช…๋ น์„ ํ˜ธ์ถœํ•˜๋ผ๊ณ  ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋กœ์ปฌ ํฌํŠธ โ€‹โ€‹9000์€ ๋ฐฐํฌ์—์„œ 8080์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. leeroy-web.

์ด์ œ ์ถœ์‹œํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค skaffold dev: ํŒ€์€ ์ง€์†์ ์ธ "ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„"๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜์ง‘ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์•Œ๋ฆฌ๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ํฌ๋“œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋ฐœ์‚ฌ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. skaffold dev --port-forward ๋‹ค์‹œ ์กฐ๋ฆฝํ•  ๋•Œ:

Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”

์ฒซ์งธ, ์บ์‹œ๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋นŒ๋“œ๋˜๊ณ  ๋ฐฐํฌ๋˜๋ฉฐ ํฌํŠธ๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ --port-forward, Skaffold๋Š” ํ•ญ๊ตฌ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. web, ๊ทธ๊ฐ€ ์š”์ฒญํ•œ ๋Œ€๋กœ, ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ app ๊ทธ๋Š” ์ž์‹ ์˜ ํŒ๋‹จ์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ์„ ๋˜์กŒ์Šต๋‹ˆ๋‹ค(๊ทธ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌด๋ฃŒ ๊ฒƒ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ ํ›„ ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด ๋ณผ๊นŒ์š”?

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-6998dfcc95-2nxvf   1/1     Running   0          103s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

ํŒŒ์ผ ์ˆ˜์ • leeroy-app/app.go โ€” ๋ช‡ ์ดˆ๊ฐ€ ์ง€๋‚˜๊ณ ...

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-ffd79d986-l6nwp    1/1     Running   0          11s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

๋™์‹œ์— Skaffold ์ž์ฒด๋Š” ์ด์ „๊ณผ ๋™์ผํ•œ ๋‚ด์šฉ์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ–ˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. leeroy-app, ๊ทธ๋ฆฌ๊ณ  ํ•œ๊บผ๋ฒˆ์— ๋‹ค ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์—ฐ์Šต

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

์นดํƒ€์ฝ”๋‹ค์— ํ•˜๋‚˜ ์žˆ์–ด์š” ์ง€๋„๋ ฅ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๋ฉด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Kubernetes, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, Skaffold๊ฐ€ ํฌํ•จ๋œ ๊ธฐ์„ฑ ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์„ ์ง์ ‘ ์‹œ๋„ํ•ด ๋ณด๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ ์— ์ด ๊ฐ„ํ–‰๋ฌผ Weaveworks์—์„œ ์ƒ์‚ฐ์„ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“œ๋Š” ์˜ˆ๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Skaffold๋Š” Kubernetes์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๋กœ, ์ฃผ๋กœ ๊ฐœ๋ฐœ ์š”๊ตฌ ์‚ฌํ•ญ์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ๊ธฐ๋ณธ์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์—ฌ "์งง์€" ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ์›ํ•œ๋‹ค๋ฉด ๋” ํฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. CI/CD ํ”„๋กœ์„ธ์Šค์—์„œ Skaffold ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค๋ช…์  ์˜ˆ ์ค‘ ํ•˜๋‚˜๋กœ ์ฃผ์–ด์ง„๋‹ค ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ Kubernetes, gRPC, Istio ๋ฐ OpenCensus Tracing์„ ํ™œ์šฉํ•˜๋Š” 10๊ฐœ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

Skaffold๋Š” ์ด๋ฏธ GitHub์—์„œ 8000๊ฐœ ์ด์ƒ์˜ ๋ณ„์ ์„ ๋ฐ›์•˜์œผ๋ฉฐ Google์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‹ค์Œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. Google ์ปจํ…Œ์ด๋„ˆ ๋„๊ตฌ โ€” ์ „๋ฐ˜์ ์œผ๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์œผ๋กœ ํ–‰๋ณตํ•˜๊ฒŒ ๋ฐœ์ „ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฏฟ์„ ๋งŒํ•œ ์ด์œ ๊ฐ€ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

PS

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

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster