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

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

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

NB: ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ Skaffold์— ๋Œ€ํ•ด ์ „๋ฐ˜์ ์œผ๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๊ฒ€ํ† , ๊ทธ์˜ ์‚ถ์€ Kubernetes์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ 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๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ด๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ์„ฑ. Skaffold๋Š” ๋…๋ฆฝํ˜• ์ˆ˜ํ™•๊ธฐ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํŠน์ • ์ž‘์—…์— ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์ด๋‚˜ ๊ธฐ์กด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ํ›„์ž์˜ ์˜ˆ์‹œ:

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

๋•๋ถ„์— Skaffold๋Š” ๋…ํŠนํ•œ ์ œํ’ˆ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CI/CD ๊ตฌ์ถ•์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ. ๋‹ค์Œ์€ ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์˜ˆ์‹œ ์›Œํฌํ”Œ๋กœ์ž…๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ์ฐธ์กฐ).

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

Skaffold์˜ ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”?

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

Kubernetes ๊ฐœ๋ฐœ์šฉ Skaffold ๊ฐœ์š”
Skaffold ์ž‘๋™์˜ ์ฃผ์š” ๋‹จ๊ณ„์— ๋Œ€ํ•œ ๊ทธ๋ฆผ

๊ด€ํ–‰. ๋น„๊ณ„ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

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

๋น„๊ณ„ ์„ค์น˜:

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-app)๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ(leeroy-web)์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ด…์‹œ๋‹ค:

~/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 ์ฝ”๋“œ์™€ ๊ฐ„๋‹จํ•œ Dockerfile์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

~/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, Skaffold์— ์ด ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•˜๋ผ๋Š” ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋กœ์ปฌ ํฌํŠธ โ€‹โ€‹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์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. GoogleContainer๋„๊ตฌ โ€” ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์•ž์œผ๋กœ๋„ ๊ณ„์† ํ–‰๋ณตํ•˜๊ฒŒ ๋ฐœ์ „ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ๋งŒํ•œ ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

PS

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

์ถœ์ฒ˜ : habr.com

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