Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

Dailymotion์ด Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

Dailymotion์—์„œ๋Š” 3๋…„ ์ „๋ถ€ํ„ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ๋„๊ตฌ์™€ ์ž‘์—… ํ๋ฆ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด ์™”์Šต๋‹ˆ๋‹ค.

์–ด๋””์„œ ์‹œ์ž‘๋˜์—ˆ๋‚˜์š”?

์—ฌ๊ธฐ์—์„œ๋Š” ์ „ ์„ธ๊ณ„ ์—ฌ๋Ÿฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ Kubernetes ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‚ค, ๋ชจ๋“  ์ฐจํŠธ๋Š” ํ•˜๋‚˜์˜ git ์ €์žฅ์†Œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์œ„ ์š”์•ฝ ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Š” ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๊ณ  ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ API์™€ ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ฐจํŠธ์ž…๋‹ˆ๋‹ค.

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

์š”์ ์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ. ์ด ๊ธ€์„ ์ฝ์œผ๋ฉด์„œ Helm 3์˜ ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด๊ฐ€ ์ด๋ฏธ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋ฒ„์ „์—๋Š” ๊ณผ๊ฑฐ์— ๊ฒช์—ˆ๋˜ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐจํŠธ ๊ฐœ๋ฐœ ์ž‘์—… ํ๋ฆ„

์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฐจํŠธ์—๋„ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚˜๋ญ‡๊ฐ€์ง€ DEV ๊ฐœ๋ฐœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ฐจํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Pull Request๊ฐ€ ์ œ์ถœ๋˜๋ฉด ์„์‚ฌ, ์Šคํ…Œ์ด์ง•์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹ํ•˜๊ธฐ ์œ„ํ•œ ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฐŒ๋ฅด๋‹ค ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ”„๋กœ๋•์…˜์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํ™˜๊ฒฝ์—๋Š” ์ฐจํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž์ฒด ๊ฐœ์ธ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ฐจํŠธ๋ฐ•๋ฌผ๊ด€ ๋งค์šฐ ์œ ์šฉํ•œ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๋•์…˜์—์„œ ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ™˜๊ฒฝ๊ณผ ์‹ค์ œ ์ฐจํŠธ ํ…Œ์ŠคํŠธ ๊ฐ„์˜ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์˜ ์ฐจํŠธ ์ €์žฅ์†Œ

๊ฐœ๋ฐœ์ž๊ฐ€ dev ๋ธŒ๋žœ์น˜๋ฅผ ํ‘ธ์‹œํ•˜๋ฉด ์ฐจํŠธ ๋ฒ„์ „์ด ์ž๋™์œผ๋กœ dev Chartmuseum์œผ๋กœ ํ‘ธ์‹œ๋œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” ๋™์ผํ•œ ๊ฐœ๋ฐœ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฐจํŠธ ๋ฒ„์ „์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์šฐ๋ฆฌ์˜ ์ž‘์€ Python ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes OpenAPI ์‚ฌ์–‘์— ๋Œ€ํ•ด Kubernetes ๊ฐ์ฒด๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ํ๋ธŒ๋ฐœ, Chartmusem์— ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์—.

์ฐจํŠธ ๊ฐœ๋ฐœ ์ž‘์—… ํ๋ฆ„์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์„ค๋ช…

  1. ์‚ฌ์–‘์— ๋”ฐ๋ผ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—… ์„ค์ • gazr.io ํ’ˆ์งˆ ๊ด€๋ฆฌ(๋ฆฐํŠธ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ)๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” Python ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Docker ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์œผ๋กœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. Kubeval์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes yaml ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  5. ์ฐจํŠธ ๋ฐ ์ƒ์œ„ ์ฐจํŠธ(๋ณ€๊ฒฝ๋˜๋Š” ์ฐจํŠธ์— ์˜์กดํ•˜๋Š” ์ฐจํŠธ)์˜ ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ๋†’์ž…๋‹ˆ๋‹ค.
  6. ํ™˜๊ฒฝ์— ๋งž๋Š” Chartmuseum์— ์ฐจํŠธ ์ œ์ถœ

ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ์ฐจ์ด์  ๊ด€๋ฆฌ

ํด๋Ÿฌ์Šคํ„ฐ ์—ฐํ•ฉ

์‚ฌ์šฉํ•˜๋˜ ์‹œ์ ˆ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ํŽ˜๋”๋ ˆ์ด์…˜, Kubernetes ๊ฐ์ฒด๋Š” ๋‹จ์ผ API ์—”๋“œํฌ์ธํŠธ์—์„œ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ Kubernetes ๊ฐœ์ฒด๋Š” ํŽ˜๋”๋ ˆ์ด์…˜ ์—”๋“œํฌ์ธํŠธ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฐœ๋ณ„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ํŽ˜๋”๋ ˆ์ด์…˜ ๊ฐœ์ฒด ๋ฐ ๊ธฐํƒ€ ๊ฐœ์ฒด๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ํŽ˜๋”๋ ˆ์ด์…˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์ง€๋ฆฌ์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ํ”Œ๋žซํผ

์šฐ๋ฆฌ ํ”Œ๋žซํผ์€ ํ˜„์žฌ 6๊ฐœ ์ง€์—ญ(๋กœ์ปฌ 3๊ฐœ, ํด๋ผ์šฐ๋“œ 3๊ฐœ)์— ๋ฐฐํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


๋ถ„์‚ฐ ๋ฐฐํฌ

๊ธ€๋กœ๋ฒŒ ํˆฌ๊ตฌ ๊ฐ€์น˜

4๊ฐœ์˜ ์ „์—ญ Helm ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฐจํŠธ์—๋Š” ๊ธฐ๋ณธ ์ตœ์†Œ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค.

global:
  cloud: True
  env: staging
  region: us-central1
  clusterName: staging-us-central1

๊ธ€๋กœ๋ฒŒ ๊ฐ€์น˜

์ด๋Ÿฌํ•œ ๊ฐ’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ๋ชจ๋‹ˆํ„ฐ๋ง, ์ถ”์ , ๋กœ๊น…, ์™ธ๋ถ€ ํ˜ธ์ถœ, ํ™•์žฅ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • "ํด๋ผ์šฐ๋“œ": ํ•˜์ด๋ธŒ๋ฆฌ๋“œ Kubernetes ํ”Œ๋žซํผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด API๋Š” GCP ์˜์—ญ๊ณผ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • "env": ๋น„ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์†Œ์Šค ์ •์˜ ๋ฐ ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • "์ง€์—ญ": ์ด ์ •๋ณด๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ์™ธ๋ถ€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ทผ์ฒ˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "clusterName": ๊ฐœ๋ณ„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ •์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ.

๊ตฌ์ฒด์ ์ธ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}

ํˆฌ๊ตฌ ํ…œํ”Œ๋ฆฟ ์˜ˆ

์ด ๋…ผ๋ฆฌ๋Š” Kubernetes YAML์ด ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋„๋ก ๋„์šฐ๋ฏธ ํ…œํ”Œ๋ฆฟ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์›์„œ ๋ฐœํ‘œ

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

releases:
  - foo.world

foo.world:                # Release name
  services:               # List of dailymotion's apps/projects
    foobar:
      chart_name: foo-foobar
      repo: [email protected]:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

์„œ๋น„์Šค ์ •์˜

์ด๋Š” ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชจ๋“  ๋‹จ๊ณ„์˜ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ์ž‘์—…์ž ํด๋Ÿฌ์Šคํ„ฐ์— ๋™์‹œ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.


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

๋น„๋ฐ€์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋ณด์•ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์žฅ์†Œ์˜ ๋ชจ๋“  ๋น„๋ฐ€์„ ์ถ”์ ํ•˜์—ฌ ๊ณ ์œ ํ•œ ์ €์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘ฅ๊ทผ ์ฒœ์žฅ ํŒŒ๋ฆฌ์—์„œ.

์šฐ๋ฆฌ์˜ ๋ฐฐํฌ ๋„๊ตฌ๋Š” Vault์—์„œ ๋น„๋ฐ€ ๊ฐ’์„ ์ถ”์ถœํ•˜๊ณ  ๋ฐฐํฌ ์‹œ๊ฐ„์ด ์˜ค๋ฉด ์ด๋ฅผ Helm์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Vault์˜ ๋น„๋ฐ€๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋น„๋ฐ€ ๊ฐ„์˜ ๋งคํ•‘์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

secrets:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       contexts:                                                                                                                                                                                                   
         - name: "default"                                                                                                                                                                                         
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"                                                                                                                                                                                    
         - name: "cluster1"                                                                                                                                                                           
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"

  • Vault์— ๋น„๋ฐ€์„ ๊ธฐ๋กํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ์ผ๋ฐ˜ ๊ทœ์น™์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€์ด ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์ปจํ…์ŠคํŠธ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—, ํŠน์ • ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„œ ํด๋Ÿฌ์Šคํ„ฐ1 ์ปจํ…์ŠคํŠธ์—๋Š” ๋น„๋ฐ€ stack-app1-password์— ๋Œ€ํ•œ ์ž์ฒด ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค).
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ.
  • ์ด ๋ชฉ๋ก์˜ ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋น„๋ฐ€ ํ‚ค-๊ฐ’ ์Œ์ด ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฐจํŠธ์˜ ๋น„๋ฐ€ ํ…œํ”Œ๋ฆฟ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
  {{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
  name: "{{ .Chart.Name }}"
  labels:
    chartVersion: "{{ .Chart.Version }}"
    tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque

๋„์ „๊ณผ ํ•œ๊ณ„

์—ฌ๋Ÿฌ ์ €์žฅ์†Œ ์ž‘์—…

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

์ผ๋ฐ˜ํ™”๋œ ์ฐจํŠธ ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›€

์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด ์ผ๋ฐ˜ ์ฐจํŠธ๋Š” ์ข…์†์„ฑ์„ ์‹๋ณ„ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ ์†ํ•˜๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” --reuse-values์ด ์ผ๋ฐ˜ํ™”๋œ ์ฐจํŠธ์˜ ์ผ๋ถ€์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ ์–ธ, ๋น„๋ฐ€ ๋ชฉ๋ก, ์ผ๋ฐ˜ํ™”๋œ ์ฐจํŠธ์— ํฌํ•จ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Jenkins ๊ถŒํ•œ์ด Vault์—์„œ ๋„ˆ๋ฌด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ์•ฑ ์—ญํ• , Vault์—์„œ ๋ชจ๋“  ๋น„๋ฐ€์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋กค๋ฐฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๋™ํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋กค๋ฐฑํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „ ID๊ฐ€ ์ง€์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” GitOps๋กœ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ

๋ฐฐํฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ €์žฅ์†Œ๋กœ ์ฐจํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

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

XNUMX๋‹จ๊ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

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

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์„ค์ •์„ ์œ„ํ•ด ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ DailymotionRelease๋ผ๋Š” ๋‹จ์ผ ๊ฐœ์ฒด์— ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
  name: "app1.ns1"
  environment: "dev"
  branch: "mybranch"
spec:
  slack_channel: "#admin"
  chart_name: "app1"
  scaling:
    - context: "dev-us-central1-0"
      replicas:
        - name: "hermes"
          count: 2
    - context: "dev-europe-west1-0"
      replicas:
        - name: "app1-deploy"
          count: 2
  secrets:
    - secret_id: "app1"
      contexts:
        - name: "default"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"
        - name: "dev-europe-west1-0"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹น ๋ฆด๋ฆฌ์Šค 1๊ฐœ(์ผ๋ฐ˜ํ™”๋œ ์ฐจํŠธ ์ œ์™ธ)
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ git ์ €์žฅ์†Œ์— ์žˆ๋Š” ์ฐจํŠธ์ž…๋‹ˆ๋‹ค.

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

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

์ถœ์ฒ˜ : habr.com

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