werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

27์›” 2019์ผ ํŽ˜์Šคํ‹ฐ๋ฒŒ์˜ ์ผํ™˜์œผ๋กœ ์—ด๋ฆฐ DevOpsConf XNUMX ์ปจํผ๋Ÿฐ์Šค ๋ฉ”์ธ ํ™€์—์„œ RIT++ 2019, "์ง€์†์  ์ „๋‹ฌ" ์„น์…˜์˜ ์ผ๋ถ€๋กœ "werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ"๋ผ๋Š” ๋ณด๊ณ ์„œ๊ฐ€ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค Kubernetes์— ๋ฐฐํฌํ•  ๋•Œ ๋ชจ๋‘๊ฐ€ ์ง๋ฉดํ•˜๋Š” ๋ฌธ์ œ์™€ ๊ณผ์ œ, ์ฆ‰์‹œ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ๋‰˜์•™์Šค์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ๋ถ„์„ํ•˜์—ฌ ์ด๊ฒƒ์ด ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์›Œํ”„.

ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ดํ›„ ์šฐ๋ฆฌ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ(์ด์ „์—๋Š” dapp์œผ๋กœ ์•Œ๋ ค์ง)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญ์‚ฌ์ ์ธ ์ด์ •ํ‘œ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. GitHub์˜ ๋ณ„ 1000๊ฐœ โ€” ์ ์  ๋Š˜์–ด๋‚˜๋Š” ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋งŽ์€ DevOps ์—”์ง€๋‹ˆ์–ด์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

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

Kubernetes์— ์ฝ”๋“œ ์ œ๊ณต

๊ฐ•์—ฐ์€ ๋” ์ด์ƒ werf์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Kubernetes์˜ CI/CD์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ Docker ์ปจํ…Œ์ด๋„ˆ์— ํŒจํ‚ค์ง€๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ์ด ์–˜๊ธฐ๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ 2016๋…„ ๋ณด๊ณ ์„œ), K8์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ 2017 ๋…„).

Kubernetes์—์„œ ์ „๋‹ฌ์€ ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”?

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

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์œ„์˜ Kubernetes ์ „๋‹ฌ ์ฒด๊ณ„๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ง ๊ทธ๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ฐœ๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ํŒจํ„ด์€ ์ด์ œ GitOps๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. (์šฉ์–ด์™€ ๊ทธ ๋’ค์— ์ˆจ์€ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—). ๊ณ„ํš์˜ ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ๋‹จ๊ณ„

๋ชจ๋‘๊ฐ€ Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” 2019๋…„์—๋Š” Docker ์ด๋ฏธ์ง€ ๊ตฌ์ถ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. docker build?.. ์ œ๊ฐ€ ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์€ ๋‰˜์•™์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ด๋Š” ๋ชจ๋‘๊ฐ€ ์ง๋ฉดํ•˜๋Š” ๋น™์‚ฐ์˜ ์ผ๊ฐ์— ๋ถˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋น„/๋นŒ๋“œํ‚ท โ€” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” Docker Inc(ํ˜„์žฌ Docker ๋ฒ„์ „์— ์ด๋ฏธ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Œ)์˜ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.
  • ์นด๋‹ˆ์ฝ” โ€” Docker ์—†์ด ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Google์˜ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.
  • Buildpacks.io โ€” ์ž๋™ ๋งˆ๋ฒ•์„ ๋งŒ๋“ค๋ ค๋Š” CNCF์˜ ์‹œ๋„, ํŠนํžˆ ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ํฅ๋ฏธ๋กœ์šด ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Buildah, ์ •ํ’ˆ ๋„๊ตฌ/img...

...GitHub์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณ„์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”. ์ฆ‰, ํ•œํŽธ์œผ๋กœ๋Š” docker build ์กด์žฌํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค - ์ด์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๋Š” ๊ฐ๊ฐ ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋Œ€์ฒด ์ˆ˜์ง‘๊ฐ€์˜ ๋ณ‘ํ–‰ ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค.

Werf์—์„œ ์กฐ๋ฆฝ

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์›Œํ”„ (์ด์ „ ์œ ๋ช…ํ•œ dapp์ฒ˜๋Ÿผ์š”) โ€” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜๋…„ ๋™์•ˆ ๋งŒ๋“ค์–ด์˜จ Flant ํšŒ์‚ฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ 5๋…„ ์ „ Dockerfiles ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” Bash ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ์ง€๋‚œ 3๋…„ ๋™์•ˆ ์ž์ฒด Git ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋ณธ๊ฒฉ์ ์ธ ๊ฐœ๋ฐœ์ด ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์ฒ˜์Œ์—๋Š” Ruby์—์„œ, ๊ทธ ๋‹ค์Œ์—๋Š” ๋‹ค์‹œ ์ผ๋‹ค Go, ๋™์‹œ์— ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋จ). werf์—์„œ๋Š” ์–ด๋–ค ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ๋ณ‘๋ ฌ ๋นŒ๋“œ๋Š” ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๋…ธ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ฌธ์ œ๋Š” ์—ฌ๋ฆ„ ๋ง๊นŒ์ง€ ์™„๋ฃŒ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋“ฑ๋ก์†Œ์— ๊ฒŒ์‹œ๋˜๋Š” ๋‹จ๊ณ„(๊ฒŒ์‹œ)

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

๊ทธ๊ฒŒ ๋ญ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํž˜๋“ ๋ฐ? ์žฌํ˜„์„ฑ ๋ณด์žฅ: ๋ณธ์งˆ์ ์œผ๋กœ ๋ถˆ๋ณ€์ธ Git์˜ ์ปค๋ฐ‹์—์„œ (๋ถˆ๋ณ€), ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” Docker ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ๋„ ์ค‘์š”ํ•ด์š” ์›์‚ฐ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋‹ค, Kubernetes์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ค ์ปค๋ฐ‹์—์„œ ๋นŒ๋“œ๋˜์—ˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ๋‹ค์Œ ๋น„๊ต ๋ฐ โ€‹โ€‹์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

ํƒœ๊ทธ ์ง€์ • ์ „๋žต

์ฒซ ๋ฒˆ์งธ๋Š” ๊ฐ„๋‹จํ•ด์š” ์ž์‹ ํƒœ๊ทธ. ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1.0. Kubernetes์—๋Š” ์ด ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋˜๋Š” ๋‹จ๊ณ„์™€ ํ”„๋กœ๋•์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. Git์—์„œ๋Š” ์ปค๋ฐ‹์„ ํ•˜๊ณ  ์–ด๋Š ์‹œ์ ์—๋Š” ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 2.0. ์ €์žฅ์†Œ์˜ ์ง€์นจ์— ๋”ฐ๋ผ ์ด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. 2.0. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋ฌด๋Œ€์— ์ถœ์‹œํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ฉด ํ”„๋กœ๋•์…˜์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์€ ๋จผ์ € ํƒœ๊ทธ๋ฅผ ๋„ฃ์€ ๋‹ค์Œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ถœ์‹œํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ? ์ฒซ์งธ, ์ด๋Š” ๋‹จ์ˆœํžˆ ๋น„๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์•„์ง ํ…Œ์ŠคํŠธ๋„ ํ•˜์ง€ ์•Š์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(ํ™•์ธํ•˜๋ ค๋ฉด ํƒœ๊ทธ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ฌ๋ฆฌ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค). ๋‘˜์งธ, ์ด ๊ฒฝ๋กœ๋Š” Gitflow์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ต์…˜ - git ์ปค๋ฐ‹ + ํƒœ๊ทธ. ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—๋Š” ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค 1.0; ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— - ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ์Šคํ…Œ์ด์ง• ์œค๊ณฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ Gitflow: ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(develop) ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•œ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. #c1. ์šฐ๋ฆฌ๋Š” ์ด ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค(#c1). ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์—๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. #c2 ะธ #c3.

๊ธฐ๋Šฅ์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Git์—์„œ ๋ธŒ๋žœ์น˜ ๋งŒ๋“ค๊ธฐ release_1.1 (๋ฒ ์ด์Šค์— #c3 ์œผ๋กœ develop). ์ด ๋ฆด๋ฆฌ์Šค๋ฅผ ์ˆ˜์ง‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ์ด๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํžˆ ์Šคํ…Œ์ด์ง•์œผ๋กœ ๋กค์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค #c4 ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ…Œ์ด์ง•์œผ๋กœ ๋กค์•„์›ƒํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์—, ๊ฐœ๋ฐœ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. develop, ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. release_1.1. ์–ด๋Š ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋˜์–ด ์Šคํ…Œ์ด์ง•์— ์—…๋กœ๋“œ๋œ ์ปค๋ฐ‹์„ ์–ป๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ๋งŒ์กฑ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค(#c25).

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜๋ฅผ (๋นจ๋ฆฌ ๊ฐ๊ธฐ๋กœ) ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค(release_1.1) ๋งˆ์Šคํ„ฐ์—์„œ. ์ด ์ปค๋ฐ‹์— ์ƒˆ ๋ฒ„์ „์ด ํฌํ•จ๋œ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(1.1). ํ•˜์ง€๋งŒ ์ด ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ˆ˜์ง‘๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๊ธฐ์กด ์ด๋ฏธ์ง€์— ๋‘ ๋ฒˆ์งธ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์ด์ œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค). #c25 ะธ 1.1). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฅผ ํ”„๋กœ๋•์…˜์— ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค.

์Šคํ…Œ์ด์ง•์—๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํ•˜๋‚˜๋งŒ ์—…๋กœ๋“œ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค(#c25), ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ข€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(1.1), ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด "๋ฌผ๋ฆฌ์ ์œผ๋กœ" ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์ง„์งœ ๋‹จ์ ์€ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋นจ๋ฆฌ ๊ฐ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ๊ฐ„๋‹จํ•œ Dockerfile์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

๋‹ค์Œ ์›์น™์— ๋”ฐ๋ผ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€ ์‹๋ณ„์ž์˜ SHA256(ruby:2.3 ะธ nginx:alpine)๋Š” ๋‚ด์šฉ์˜ ์ฒดํฌ์„ฌ์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํŒ€ (RUN, CMD ๋“ฑ๋“ฑ.);
  • ์ถ”๊ฐ€๋œ ํŒŒ์ผ์˜ SHA256์ž…๋‹ˆ๋‹ค.

... ๊ทธ๋Ÿฐ ํŒŒ์ผ์—์„œ ์ฒดํฌ์„ฌ(๋‹ค์‹œ SHA256)์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๊ฒƒ ์„œ๋ช… Docker ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์„ ์ •์˜ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋‹ค์‹œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์ปค๋ฐ‹ ๋Œ€์‹  ์ด๋Ÿฌํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค., ์ฆ‰. ์„œ๋ช…์œผ๋กœ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

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

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

werf์— ํƒœ๊ทธ ์ง€์ •

Werf์—์„œ๋Š” ๋” ๋‚˜์•„๊ฐ€ ํ•˜๋‚˜์˜ ๋จธ์‹ ์— ์ €์žฅ๋˜์ง€ ์•Š๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ ๋นŒ๋“œ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ๊ณ„ ะธ ์˜์ƒ.

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

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

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

๋”ฐ๋ผ์„œ ์Šคํ…Œ์ด์ง€ ์ด๋ฏธ์ง€๋Š” ๋ถ„์‚ฐ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์บ์‹œ์ด๋ฉฐ, ์ด๋ฏธ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋Š” Docker Registry์— ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฒญ์†Œ

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

์ฒญ์†Œ ์ „๋žต์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์— ์ด๋ฅด๋ €์Šต๋‹ˆ๊นŒ? ์›Œํ”„? ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค:

  1. Git ํ—ค๋“œ: ๋ชจ๋“  ํƒœ๊ทธ, ๋ชจ๋“  ๋ธŒ๋žœ์น˜ - ์ด๋ฏธ์ง€์˜ Git์— ํƒœ๊ทธ๋œ ๋ชจ๋“  ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Git ์ž์ฒด์—์„œ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).
  2. ํ˜„์žฌ Kubernetes๋กœ ํŽŒํ•‘๋˜๋Š” ๋ชจ๋“  ํฌ๋“œ
  3. ์ด์ „ ReplicaSet(์ตœ๊ทผ์— ๋ฆด๋ฆฌ์Šค๋œ ๊ฒƒ), ๊ทธ๋ฆฌ๊ณ  Helm ๋ฆด๋ฆฌ์Šค๋ฅผ ์Šค์บ”ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•  ๊ณ„ํš๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

... ๊ทธ๋ฆฌ๊ณ  ์ด ์„ธํŠธ์—์„œ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์ธ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์ •๋ฆฌํ•œ ํ›„ ๊ณ ์•„ ๋‹จ๊ณ„ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ ๋‹จ๊ณ„

์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ ์–ธ์„ฑ

๋ฐฐํฌ์—์„œ ๊ฐ€์žฅ ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์€ ์ ์€ ์„ ์–ธ์ ์œผ๋กœ ์„ ์–ธ๋œ ์—…๋ฐ์ดํŠธ๋œ ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ์˜ ๋กค์•„์›ƒ์ž…๋‹ˆ๋‹ค. Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์›๋ณธ YAML ๋ฌธ์„œ๋Š” ํ•ญ์ƒ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒฐ๊ณผ์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Kubernetes๊ฐ€ ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—:

  1. ์‹๋ณ„์ž;
  2. ์„œ๋น„์Šค ์ •๋ณด;
  3. ๋งŽ์€ ๊ธฐ๋ณธ๊ฐ’;
  4. ํ˜„์žฌ ์ƒํƒœ์˜ ์„น์…˜;
  5. ์Šน์ธ ์›นํ›…์˜ ์ผ๋ถ€๋กœ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ
  6. ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ(๋ฐ ์Šค์ผ€์ค„๋Ÿฌ)์˜ ์ž‘์—… ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

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

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–‘๋ฐฉํ–ฅ ๋ณ‘ํ•ฉ. ์˜ˆ๋ฅผ ๋“ค์–ด Helm์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋„ ์žˆ์Šต๋‹ˆ๋‹ค ์–‘๋ฐฉํ–ฅ ๋ณ‘ํ•ฉ, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • ๋น„๊ต ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ์šฉ๋œ ะธ , ์‚ญ์ œ๋œ ๋‚ด์šฉ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.
  • ๋น„๊ต ะธ ์‚ด๊ณ ์žˆ๋‹ค, ๋ฌด์—‡์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.
  • ํ•ฉ์‚ฐ๋œ ํŒจ์น˜๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ด๊ณ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Helm์„ ์‚ฌ์šฉํ•˜์—ฌ 1000๊ฐœ ์ด์ƒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ์–‘๋ฐฉํ–ฅ ๋ณ‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Helm์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ํŒจ์น˜๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์ถœ์‹œ ์ƒํƒœ

CI ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Kubernetes์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค. (์ ์šฉํ•˜๋‹ค) ํด๋Ÿฌ์Šคํ„ฐ์— - Helm ์‚ฌ์šฉ ๋˜๋Š” kubectl apply. ๋‹ค์Œ์œผ๋กœ, ์ด๋ฏธ ์„ค๋ช…ํ•œ N ๋ฐฉํ–ฅ ๋ณ‘ํ•ฉ์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด์— ๋Œ€ํ•ด Kubernetes API๋Š” CI ์‹œ์Šคํ…œ๊ณผ ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ ์Šน์ธ์ ์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

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

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

werf ์ˆ˜์ค€์—์„œ ์ด ์ถ”์ ๊ธฐ์˜ ๋™์ž‘์€ ๋ฐฐํฌ ๋˜๋Š” StatefulSet์— ๋ฐฐ์น˜๋œ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์ฃผ์„ - fail-mode - ๋‹ค์Œ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

  • IgnoreAndContinueDeployProcess โ€” ์šฐ๋ฆฌ๋Š” ์ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กค์•„์›ƒํ•˜๋Š” ๋ฐ ๋”ฐ๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋ฐฐํฌ๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  • FailWholeDeployProcessImmediately โ€” ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.
  • HopeUntilEndOfDeployProcess โ€” ๋ฐฐํฌ๊ฐ€ ๋๋‚  โ€‹โ€‹๋•Œ๊นŒ์ง€ ์ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์†Œ์Šค์™€ ์ฃผ์„ ๊ฐ’์˜ ์กฐํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. fail-mode:

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

์ฒ˜์Œ ๋ฐฐํฌํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MongoDB)๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ์ž‘๋˜๋Š” ์ˆœ๊ฐ„๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐฐํฌ๋Š” ๊ณ„์† ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

werf์—๋Š” kubedog์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ฃผ์„์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

  • failures-allowed-per-replica - ๊ฐ ๋ณต์ œ๋ณธ์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋œ ๋‚™ํ•˜ ํšŸ์ˆ˜
  • show-logs-until โ€” werf๊ฐ€ ๋กค์•„์›ƒ๋œ ๋ชจ๋“  ํฌ๋“œ์˜ ๋กœ๊ทธ๋ฅผ (stdout์—์„œ) ํ‘œ์‹œํ•  ๋•Œ๊นŒ์ง€์˜ ์ˆœ๊ฐ„์„ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ PodIsReady (ํŠธ๋ž˜ํ”ฝ์ด ํฌ๋“œ๋กœ ๋“ค์–ด์˜ค๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•ด) ๊ฐ’๋„ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ControllerIsReady ะธ EndOfDeploy.

๋ฐฐํฌ์—์„œ ๋˜ ๋ฌด์—‡์„ ์›ํ•ฉ๋‹ˆ๊นŒ?

์ด๋ฏธ ์„ค๋ช…ํ•œ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ ์™ธ์—๋„ ๋‹ค์Œ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒฐ๊ณผ

ํšŒ์‚ฌ๋กœ์„œ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋‹ค์–‘ํ•œ ์ œ๊ณต ๋‹จ๊ณ„(๊ตฌ์ถ•, ๊ฒŒ์‹œ, ๋ฐฐํฌ)์—์„œ ์„ค๋ช…๋œ ๋ชจ๋“  ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด CI ์‹œ์Šคํ…œ๊ณผ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์›Œํ”„.

๊ฒฐ๋ก  ๋Œ€์‹ :

werf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)

Werf์˜ ๋„์›€์œผ๋กœ ์šฐ๋ฆฌ๋Š” DevOps ์—”์ง€๋‹ˆ์–ด๋ฅผ ์œ„ํ•œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์œผ๋ฉฐ ๋” ๋„“์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ ์–ด๋„ ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ๊ป˜ํ•˜๋ฉด ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

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

PS

๋ธ”๋กœ๊ทธ์˜ Kubernetes์— ๋Œ€ํ•œ ๊ธฐํƒ€ ๋ณด๊ณ ์„œ:

์ถœ์ฒ˜ : habr.com

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