Helm & Package Management
K8s의 apt/yum — 복잡한 매니페스트를 패키지로 관리
1. Helm이란
1.1 왜 Helm인가
K8s 앱 배포에는 Deployment, Service, ConfigMap, Ingress, PVC 등 여러 YAML 파일이 필요함. Helm은 이를 **하나의 패키지(Chart)**로 묶어 설치/업그레이드/롤백을 관리함.
1.2 핵심 개념
| 개념 | 설명 | 비유 |
|---|---|---|
| Chart | K8s 매니페스트의 템플릿 묶음 | apt 패키지 (.deb) |
| Release | Chart를 설치한 인스턴스 | apt install 한 결과 |
| Repository | Chart를 저장/배포하는 서버 | apt 저장소 |
| values.yaml | Chart의 설정 오버라이드 | apt의 설정 파일 |
2. Helm 기본 사용
# 저장소 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# Chart 검색
helm search repo nginx
# 설치
helm install my-nginx bitnami/nginx -n web --create-namespace
# values 오버라이드
helm install my-nginx bitnami/nginx -f custom-values.yaml
# 업그레이드
helm upgrade my-nginx bitnami/nginx -f custom-values.yaml
# 롤백
helm rollout history my-nginx
helm rollback my-nginx 1
# 삭제
helm uninstall my-nginx -n web
# 설치된 Release 목록
helm list -A
3. values.yaml
Chart의 기본값을 오버라이드하는 설정 파일.
# custom-values.yaml
replicaCount: 3
image:
repository: nginx
tag: "1.25"
service:
type: LoadBalancer
port: 80
ingress:
enabled: true
hostname: web.example.com
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
환경별 values:
values/
├── values-dev.yaml
├── values-staging.yaml
└── values-prod.yaml
helm upgrade my-app ./my-chart -f values/values-prod.yaml
4. 커스텀 Chart 작성
# Chart 스캐폴딩
helm create my-app
my-app/
├── Chart.yaml # 메타데이터 (이름, 버전)
├── values.yaml # 기본 설정값
├── templates/ # K8s 매니페스트 템플릿
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # 공통 템플릿 함수
│ └── NOTES.txt # 설치 후 메시지
└── charts/ # 의존 Chart
템플릿 문법 (Go template):
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
resources:
{{- toYaml .Values.resources | nindent 10 }}
5. Kustomize
Helm의 대안. 패치 기반으로 매니페스트를 환경별로 커스터마이즈.
kustomize/
├── base/ # 기본 매니페스트
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── patch-replicas.yaml
└── prod/
├── kustomization.yaml
└── patch-replicas.yaml
# kubectl에 내장
kubectl apply -k overlays/prod/
| Helm | Kustomize | |
|---|---|---|
| 방식 | 템플릿 (Go template) | 패치 (JSON Merge Patch) |
| 복잡도 | 중간~높음 | 낮음~중간 |
| 패키지 공유 | ✅ Repository | ❌ 디렉토리 기반 |
| 의존성 관리 | ✅ | ❌ |
| kubectl 내장 | ❌ (별도 설치) | ✅ |
| 커뮤니티 Chart | ✅ Artifact Hub | ❌ |
다음 글
→ #12 CI/CD & GitOps