Provisioning, Helm

Jeonghak Choยท2025๋…„ 5์›” 18์ผ

Provisioning

๋ชฉ๋ก ๋ณด๊ธฐ
27/44

๐Ÿ“— ํ”„๋กœ๋น„์ €๋‹ - Helm

๐Ÿณ๏ธโ€๐ŸŒˆ [๊ถ๊ธˆํ•œ์ ]

  • Helm ๊ฐœ์š”, ์•„ํ‚คํ…์ฒ˜

๐Ÿ”—[๋ชฉ์ฐจ]

Helm ์„ค์น˜

Helm ์ผ๋ฐ˜ ์„ค์น˜ ( v3.17.1 )

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

vagrant@slave1:~$ helm version
version.BuildInfo{Version:"v3.17.1", GitCommit:"980d8ac1939e39138101364400756af2bdee1da5", GitTreeState:"clean", GoVersion:"go1.23.5"}

Helm ๋ฒ„์ „ ์ง€์ • ์„ค์น˜ ( v3.8.0 )

export HELM_VERSION="v3.8.0"
wget https://get.helm.sh/helm-$HELM_VERSION-linux-amd64.tar.gz
tar -xzf helm-$HELM_VERSION-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

vagrant@slave4:~$ helm version
version.BuildInfo{Version:"v3.8.0", GitCommit:"d14138609b01886f544b2025f5000351c9eb092e", GitTreeState:"clean", GoVersion:"go1.17.5"}

Helm ์ฐจํŠธ ์ง์ ‘ ๋‚ด๋ ค๋ฐ›๊ธฐ

helm repo add trino https://trinodb.github.io/charts/
helm pull trino/trino --version 1.39.0 --untar
cd trino

Helm ๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ

Helm์€ Chart + values.yaml ์กฐํ•ฉ์œผ๋กœ Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ "๋ฆด๋ฆฌ์Šค(Release)"๋ผ๋Š” ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
๋ฆด๋ฆฌ์Šค(Release)๋ž€ Chart๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜ํ•œ ์ธ์Šคํ„ด์Šค๋กœ Chart ์ด๋ฆ„๊ณผ ์‚ฌ์šฉ์ž ๊ฐ’(values)์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

helm install myapp ./mychart -f prod-values.yaml

โ†’ ์ด๋•Œ myapp์ด ๋ฆด๋ฆฌ์Šค ์ด๋ฆ„์ด ๋จ

Helm ๋ฆด๋ฆฌ์Šค ์ €์žฅ ๋ฐฉ์‹

  • Helm์€ ๋ฆด๋ฆฌ์Šค ์ •๋ณด๋ฅผ Kubernetes ๋‚ด๋ถ€์— ์ €์žฅํ•จ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ Secret ๋˜๋Š” ConfigMap ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ
  • Namespace์— ๋”ฐ๋ผ ์ €์žฅ ์œ„์น˜๊ฐ€ ๋‹ค๋ฆ„
  • ๋ฆด๋ฆฌ์Šค์—๋Š” ์„ค์น˜๋œ Chart ๋ฒ„์ „, ์ ์šฉ๋œ values, ๋ Œ๋”๋ง๋œ ๋ฆฌ์†Œ์Šค, ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ (v1, v2, โ€ฆ ์—…๊ทธ๋ ˆ์ด๋“œ๋งˆ๋‹ค ์ฆ๊ฐ€)์ด ํฌํ•จ๋จ

Helm ์—…๊ทธ๋ ˆ์ด๋“œ/๋กค๋ฐฑ ํ๋ฆ„

  • helm upgrade โ†’ ์ƒˆ๋กœ์šด values ์ ์šฉ ํ›„ ๋ณ€๊ฒฝ๋œ ๋ฆฌ์†Œ์Šค๋งŒ diff ํ›„ ์—…๋ฐ์ดํŠธ
  • helm rollback โ†’ ์ด์ „ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆผ
  • Helm์ด 3-way merge๋ฅผ ์ด์šฉํ•ด ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ ์„ ๊ณ„์‚ฐํ•จ

Helm ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง ๊ตฌ์กฐ

Helm์˜ Chart๋Š” ๋‹จ์ˆœํ•œ YAML์ด ์•„๋‹ˆ๋ผ Go ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

Helm ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ

mychart/
โ”œโ”€โ”€ Chart.yaml          # Chart ๋ฉ”ํƒ€ ์ •๋ณด
โ”œโ”€โ”€ values.yaml         # ๊ธฐ๋ณธ ๊ฐ’ ์„ค์ •
โ””โ”€โ”€ templates/
    โ”œโ”€โ”€ deployment.yaml # Go ํ…œํ”Œ๋ฆฟ
    โ”œโ”€โ”€ service.yaml
    โ””โ”€โ”€ _helpers.tpl    # ๊ณตํ†ต ํ…œํ”Œ๋ฆฟ ์กฐ๊ฐ

Helm ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง ํ๋ฆ„

  • helm install ๋˜๋Š” helm template ๋ช…๋ น ์‹คํ–‰
  • CLI๊ฐ€ templates/*.yaml ํŒŒ์ผ์—์„œ Go ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ({{ }})์„ ์ฐพ์•„ ํŒŒ์‹ฑ
  • values.yaml, CLI๋กœ ๋„˜๊ธด -f ํŒŒ์ผ, --set ๊ฐ’๋“ค์„ ๋จธ์ง€
  • ํ…œํ”Œ๋ฆฟ ์•ˆ์— .Values. ๋˜๋Š” .Chart, .Release ๋“ฑ context ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉ
  • ์‹ค์ œ Kubernetes YAML ์ƒ์„ฑ
  • helm install ์‹œ API ์„œ๋ฒ„์— apply, helm template ์‹œ ์ถœ๋ ฅ๋งŒ

Helm ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ• ์˜ˆ์‹œ

apiVersion: v1
kind: Service
metadata:
  name: {{ include "mychart.fullname" . }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}

ํ…œํ”Œ๋ฆฟ์—์„œ .Values๋Š” values.yaml์˜ key์— ์ ‘๊ทผํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

Helm ์‚ฌ์šฉ๋ฒ•

Helm ๋ฆด๋ฆฌ์Šค ์ •๋ณด ํ™•์ธ ๋ช…๋ น์–ด

helm list
helm status <RELEASE_NAME>
helm get all <RELEASE_NAME>
helm get manifest <RELEASE_NAME>
helm get values <RELEASE_NAME>
helm history <RELEASE_NAME>
helm get manifest myapp

โ†’ Helm์ด ๋ Œ๋”๋งํ•˜์—ฌ Kubernetes์— ์ ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค€๋‹ค.

Kubernetes ๋‚ด ์ €์žฅ ๊ตฌ์กฐ (Secret ๋˜๋Š” ConfigMap)

Helm์€ ๋ฆด๋ฆฌ์Šค ์ •๋ณด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค

kubectl get secret -n <namespace> -l "owner=helm"

์ด๋ ‡๊ฒŒ ์ €์žฅ๋œ Secret์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ๋“ค์–ด ์žˆ๋‹ค

  • release name
  • version
  • chart ์ •๋ณด
  • values.yaml
  • ๋ Œ๋”๋ง๋œ ๋ฆฌ์†Œ์Šค

Secret ๋‚ด์šฉ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

kubectl get secret sh.helm.release.v1.myapp.v1 -n default -o json | jq '.data.release' | base64 -d | base64 -d | less
  • base64 -d๋ฅผ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” Helm์ด ์ด์ค‘์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Helm ํ…œํ”Œ๋ฆฟ ๋””๋ฒ„๊น… ๋ฐ ๊ฒ€์ฆ

๋ช…๋ น์–ด๋ชฉ์ ์„ค๋ช…ํด๋Ÿฌ์Šคํ„ฐ ์˜ํ–ฅ ์—ฌ๋ถ€
helm lint ./mychart์ •์  ๊ฒ€์ฆChart ๊ตฌ์กฐ ๋ฐ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์ฒดํฌ์•„๋‹ˆ์˜ค
helm template ./mychart -f values.yaml๋ Œ๋”๋ง ํ™•์ธHelm ํ…œํ”Œ๋ฆฟ์„ ์‹ค์ œ Kubernetes YAML๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅ์•„๋‹ˆ์˜ค
helm install RELEASE ./mychart --dry-run --debug -f values.yaml์‹œ๋ฎฌ๋ ˆ์ด์…˜์‹ค์ œ ์„ค์น˜ ์—†์ด ๋ Œ๋”๋ง, ๋ณ‘ํ•ฉ๋œ values, ๋ฆด๋ฆฌ์Šค ๋ฉ”ํƒ€ ํ™•์ธ์•„๋‹ˆ์˜ค
helm get manifest RELEASE์ ์šฉ ๊ฒฐ๊ณผ ํ™•์ธ์„ค์น˜๋œ Helm ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก์„ ์ถœ๋ ฅ์˜ˆ (์„ค์น˜ ํ›„ ์‚ฌ์šฉ)
helm get values RELEASE --all์ ์šฉ๋œ ๊ฐ’ ํ™•์ธ๋ฆด๋ฆฌ์Šค์— ์‚ฌ์šฉ๋œ ๋ชจ๋“  values ํ™•์ธ (๊ธฐ๋ณธ๊ฐ’ + override ํฌํ•จ)์˜ˆ
helm get all RELEASE์ „์ฒด ์ •๋ณด ํ™•์ธvalues, manifest, notes ๋“ฑ ์ „์ฒด ๋ฆด๋ฆฌ์Šค ์ •๋ณด ์ถœ๋ ฅ์˜ˆ

Helm ํ™œ์šฉ ํŒ ๋ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ๋ช…๋ น์–ด / ํ…œํ”Œ๋ฆฟ์„ค๋ช…
๋‹ค์ค‘ values ํŒŒ์ผ ๋ณ‘ํ•ฉ-f base.yaml -f dev.yaml์—ฌ๋Ÿฌ values.yaml ํŒŒ์ผ์„ ๊ณ„์ธต์ ์œผ๋กœ ์ ์šฉ (๋’ค์— ์žˆ๋Š” ๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„ ๋†’์Œ)
CLI ๊ฐ’ ์˜ค๋ฒ„๋ผ์ด๋“œ--set image.tag=1.2.3๋น ๋ฅด๊ฒŒ ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Œ
์กฐ๊ฑด๋ถ€ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ{{- if .Values.enabled }} ... {{- end }}ํŠน์ • ๊ฐ’์ด true์ผ ๋•Œ๋งŒ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ๋จ
ํ…œํ”Œ๋ฆฟ ์žฌ์‚ฌ์šฉ (_helpers.tpl){{ include "mychart.fullname" . }}๊ณตํ†ต ๋„ค์ด๋ฐ, ๋ผ๋ฒจ ๋“ฑ์„ ์ •์˜ํ•˜์—ฌ ๋ฐ˜๋ณต ์ œ๊ฑฐ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
ํŒŒ์ผ ํฌํ•จ (.Files.Get){{ .Files.Get "config/config.json" }}์™ธ๋ถ€ ์„ค์ • ํŒŒ์ผ์„ ConfigMap ๋“ฑ์— ์‚ฝ์ž… ๊ฐ€๋Šฅ
Hooks (์‚ฌ์ „/์‚ฌํ›„ ์ž‘์—…)annotations: "helm.sh/hook": pre-installJob ๋“ฑ์„ ์‚ฌ์šฉํ•ด DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์ดˆ๊ธฐํ™” ๋“ฑ์„ ์„ค์น˜ ์ „/ํ›„์— ์‹คํ–‰ ๊ฐ€๋Šฅ
๋ฆด๋ฆฌ์Šค๋ณ„ ๊ฐ’ ํ™•์ธhelm get values <RELEASE>์‹ค์ œ ๋ฐฐํฌ์— ์‚ฌ์šฉ๋œ ๋ชจ๋“  values ํ™•์ธ ๊ฐ€๋Šฅ
ํ…œํ”Œ๋ฆฟ ๋””๋ฒ„๊น…--dry-run --debug, helm templateํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง ๊ฒฐ๊ณผ ํ™•์ธ ๊ฐ€๋Šฅ
๋ฆด๋ฆฌ์Šค ๊ธฐ๋ก ํ™•์ธhelm history <RELEASE>์ด์ „ ๋ฐฐํฌ ๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ, ๋กค๋ฐฑ ๊ธฐ๋ฐ˜ ์ •๋ณด ํ™•๋ณด ๊ฐ€๋Šฅ
๋กค๋ฐฑhelm rollback <RELEASE> <REVISION>์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ, ์žฅ์•  ๋Œ€์‘์— ์œ ์šฉ

Helm ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ ์š”์†Œ

Helm CLI (helm)

์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์ค„ ๋„๊ตฌ์ด๋‹ค.

  • Chart ์„ค์น˜ (helm install)
  • ๋ฆด๋ฆฌ์Šค ์—…๊ทธ๋ ˆ์ด๋“œ (helm upgrade)
  • ๋ฆด๋ฆฌ์Šค ์ƒํƒœ ์กฐํšŒ (helm status)
  • ๋ฆด๋ฆฌ์Šค ์‚ญ์ œ (helm uninstall)
  • Chart๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ Kubernetes์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ(์˜ˆ: Deployment, Service) ์ƒ์„ฑ
  • Kubernetes API ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ๋ฆด๋ฆฌ์Šค๋ฅผ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ

Chart

  • Helm์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๋‹จ์œ„๋กœ, Kubernetes ๋ฆฌ์†Œ์Šค ํ…œํ”Œ๋ฆฟ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
mychart/
โ”œโ”€โ”€ Chart.yaml       # Chart ์ด๋ฆ„, ๋ฒ„์ „, ์„ค๋ช… ๋“ฑ์˜ ๋ฉ”ํƒ€ ์ •๋ณด
โ”œโ”€โ”€ values.yaml      # ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ •์˜ ๊ธฐ๋ณธ๊ฐ’
โ”œโ”€โ”€ templates/       # Go ํ…œํ”Œ๋ฆฟ ์—”์ง„ ๊ธฐ๋ฐ˜์˜ Kubernetes ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค
โ””โ”€โ”€ charts/          # ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ Chart๋“ค
  • Chart๋Š” GitHub, Helm repository ๋“ฑ์—์„œ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

Release

  • ํŠน์ • ์‹œ์ ์— ํŠน์ • Chart๊ฐ€ ํŠน์ • ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์„ค์น˜๋œ ๊ฒฐ๊ณผ
  • Helm์€ Chart + values.yaml ์กฐํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ
  • ๋™์ผํ•œ Chart๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค์น˜ํ•˜๋ฉด ๊ฐ๊ฐ ๋ณ„๊ฐœ์˜ Release๊ฐ€ ๋จ

Helm Repository

  • Chart๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” HTTP ๊ธฐ๋ฐ˜ ์ €์žฅ์†Œ
  • index.yaml ํŒŒ์ผ์„ ํ†ตํ•ด ์–ด๋–ค Chart๊ฐ€ ์–ด๋–ค ๋ฒ„์ „์œผ๋กœ ์ œ๊ณต๋˜๋Š”์ง€ ์ •์˜
  • ์‚ฌ์šฉ์ž๊ฐ€ helm repo add, helm repo update ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ €์žฅ์†Œ ์ถ”๊ฐ€ ๋ฐ ๋™๊ธฐํ™” ๊ฐ€๋Šฅ

Kubernetes API Server

  • Helm CLI๋Š” ์ง์ ‘ Kubernetes API Server์— ์—ฐ๊ฒฐํ•˜์—ฌ Chart๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌ/๊ด€๋ฆฌํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€