데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
Helm은 Kubernetes 패키지 매니저입니다. 복잡한 K8s 리소스(YAML)를 하나의 패키지(Chart)로 묶어 손쉽게 배포·업그레이드·롤백할 수 있게 해 줍니다. 마치 apt나 pip처럼 K8s 생태계에서 표준 패키징 도구로 자리 잡았습니다.
Deployment, Service, ConfigMap 등을 하나의 Chart로 묶어 버전 관리. helm package로 재사용 가능한 아티팩트 생성.
helm install/upgrade/rollback으로 선언적 배포. 릴리스 히스토리를 자동 관리하여 문제 발생 시 즉시 복구.
Go 템플릿 + Values 파일로 환경별(dev/staging/prod) 차이를 코드로 분리. 인프라의 DRY 원칙 실현.
K8s에 직접 YAML을 적용하는 방식(kubectl apply)에 비해 Helm이 주는 이점은 명확합니다. 아래 비교표를 확인하세요.
| 기능 | Helm | Kustomize | kubectl apply |
|---|---|---|---|
| 패키지 버전 관리 | ✅ Chart 버전 + 릴리스 히스토리 | ❌ Git 기반 간접 관리 | ❌ 직접 관리 필요 |
| 표준 패키징 포맷 | ✅ Chart (tgz 아카이브) | ❌ 오버레이/패치 | ❌ 없음 |
| 롤백 | ✅ helm rollback (즉시) |
⚠️ Git revert + 재적용 | ⚠️ 수동 복구 |
| 환경별 설정 분리 | ✅ Values 파일 + 템플릿 | ✅ Overlay | ❌ 수동 |
| 의존성 관리 | ✅ Chart 의존성 (서브차트) | ❌ 없음 | ❌ 없음 |
팀 단위로 K8s 리소스를 공유하고, CI/CD 파이프라인에서 재현 가능한 배포를 원한다면 Helm이 가장 실용적인 선택입니다.
Helm을 이해하는 데 꼭 알아야 할 4가지 개념: Chart, Release, Repository, Values. 아래 다이어그램은 Helm의 동작 흐름을 한눈에 보여줍니다.
chart.tgz).values.yaml 또는 --set로 전달.Helm 2에서 사용하던 Tiller는 Helm 3에서 완전히 제거되었습니다. 클라이언트 전용 아키텍처로 보안과 단순성이 크게 개선되었습니다.
Helm을 설치하고 첫 번째 Chart를 배포해 봅니다. 예제는 Python 스크립트와 함께 Helm CLI를 사용하는 시나리오입니다.
macOS (Homebrew):
brew install helm
Linux (스크립트):
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
설치 확인:
helm version --short # v3.17.2+ (예시)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
Python에서 Helm 명령어를 실행하는 예제:
import subprocess
def helm_install(release_name, chart, namespace="default", values=None):
cmd = ["helm", "install", release_name, chart,
"--namespace", namespace]
if values:
cmd.extend(["-f", values])
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.returncode != 0:
print("Error:", result.stderr)
# 사용 예
helm_install("my-nginx", "bitnami/nginx",
values="custom-values.yaml")
CLI로 직접 배포:
helm install my-nginx bitnami/nginx --namespace demo --create-namespace
helm list -n demo
helm upgrade my-nginx bitnami/nginx --set replicaCount=3
helm rollback my-nginx 1 # 이전 리비전으로 복구
이제 http://localhost:8080 또는 Ingress를 통해 Nginx에 접근할 수 있습니다. helm get manifest my-nginx로 실제 렌더링된 YAML을 확인하세요.
Helm Chart에서 자주 사용하는 Values 키와 기본값 예시입니다. 실제 Chart마다 다를 수 있으므로 helm show values로 확인하세요.
| 키 | 설명 | 기본값 예시 |
|---|---|---|
replicaCount |
파드 복제본 수 | 1 |
image.repository |
컨테이너 이미지 주소 | nginx |
image.tag |
이미지 태그 | latest |
image.pullPolicy |
이미지 풀 정책 | IfNotPresent |
service.type |
서비스 타입 | ClusterIP |
service.port |
서비스 포트 | 80 |
ingress.enabled |
Ingress 활성화 여부 | false |
resources.limits.cpu |
CPU 최대 제한 | 500m |
persistence.enabled |
볼륨 영속성 | false |
커스텀 Values 파일 예제 (prod-values.yaml):
replicaCount: 3
image:
tag: "1.25.3"
service:
type: LoadBalancer
ingress:
enabled: true
hostname: myapp.example.com
| 문제 | 원인 | 해결책 |
|---|---|---|
helm install 실패: already exists |
동일 이름의 릴리스가 이미 존재 | helm uninstall <릴리스명> 또는 --name-template 사용 |
| 템플릿 에러: function "required" not defined | Helm 2 스타일 템플릿 함수 미지원 | Helm 3에서는 required를 fail로 대체하거나 required 함수를 올바르게 사용 |
| 릴리스 업그레이드가 적용 안 됨 | Values 변경 없이 동일 Chart 리비전 재배포 | --recreate-pods 플래그 또는 --reset-values 사용 |
| 네트워크 타임아웃: context deadline exceeded | Chart 다운로드 지연 또는 방화벽 | HELM_REPO_ATTEMPTS=3 환경변수 설정, 프록시 확인 |
helm lint + helm template로 문법과 렌더링을 먼저 확인하세요.helm history로 관리하고, 중요한 배포는 태그(annotation)를 남기세요.helm upgrade --install --atomic --timeout 5m을 권장합니다.