Helm์œผ๋กœ ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•

Helm์œผ๋กœ ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•

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

Helm์œผ๋กœ ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•

Kubernetes์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ์—๋Š” ์„œ๋น„์Šค ์ž์ฒด์™€ ๋ฐฐํฌ ๋„๊ตฌ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ๋Š” ์—…๋ฐ์ดํŠธ ํŠธ๋ž˜ํ”ฝ์„ ์ œ๊ณตํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์™€ ํ†ต์‹ ํ•˜๋Š” ๋‹จ์ผ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค ์ค‘ ํ•˜๋‚˜๋Š” "canary" ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์•ˆ์ •์ ์ธ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์œ ์ง€ ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ์–‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์นด๋‚˜๋ฆฌ์•„ ๋ฒ„์ „ ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Yaml์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ Kubernetes์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

kind: Deployment
metadata:
  name: app-canary
  labels:
    app: app
spec:
  replicas: 1
  ...
    image: myapp:canary
---
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  replicas: 5
  ...
    image: myapp:stable
---
kind: Service
selector:
  app: app # Selector will route traffic to both deployments.

kubectl์—์„œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ์ƒ์ƒํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฌธ์„œ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์ „์ฒด ์ž์Šต์„œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์ฃผ์š” ์งˆ๋ฌธ์€ Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ ์ž๋™ํ™”

๋จผ์ € ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋Š” Helm ์ฐจํŠธ ๋งต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

~/charts/app
โ”œโ”€โ”€ Chart.yaml
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ templates
โ”‚   โ”œโ”€โ”€ NOTES.txt
โ”‚   โ”œโ”€โ”€ _helpers.tpl
โ”‚   โ”œโ”€โ”€ deployment.yaml
โ”‚   โ””โ”€โ”€ service.yaml
โ””โ”€โ”€ values.yaml

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

selector:
  app.kubernetes.io/name: myapp

"์นด๋‚˜๋ฆฌ์•„" ๋ฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ ๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋‘ ๋ชจ๋“ˆ์— ์ด ๋ ˆ์ด๋ธ”์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜๋ฉด Helm ์ฐจํŠธ ๋งต์˜ ์นด๋‚˜๋ฆฌ์•„ ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋Š” ๋™์•ˆ ํŠธ๋ž˜ํ”ฝ์ด ์ƒˆ๋กœ ๋ฐฐํฌ๋œ ๋ชจ๋“ˆ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์˜ ์•ˆ์ •์ ์ธ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

helm upgrade
  --install myapp 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v1       # Goes into app.kubernetes.io/version
  --set image.tag=stable 
  --set replicaCount=5

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

helm upgrade
  --install myapp-canary 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v2       # Goes into app.kubernetes.io/version
  --set image.tag=canary 
  --set replicaCount=1

์‚ฌ์‹ค ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค! ์„œ๋น„์Šค๋ฅผ ํ•‘ํ•˜๋ฉด ์นด๋‚˜๋ฆฌ์•„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ๋ถ€ ์‹œ๊ฐ„์—๋งŒ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…๋œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐํฌ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๋”œ๋ฆฌ๋ฒ„๋ฆฌ๋ด‡ ๊ณผ GitHub์˜ Helm ์ž๋™ํ™” ๋„๊ตฌ. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” Helm ์ฐจํŠธ๋Š” Github์— ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…๊ณผ ์˜ˆ๋ฅผ ํ†ตํ•ด ์นด๋‚˜๋ฆฌ์•„ ๋ฒ„์ „์˜ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด๋ก ์  ๊ฐœ์š”์˜€์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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