252. Helm - Introduction
공식문서: Helm Docs / What is Helm?
Helm이란?
- Kubernetes용 패키지 매니저 — apt/yum의 Kubernetes 버전
- 복잡한 애플리케이션(수십 개의 YAML)을 하나의 Chart로 묶어 배포/관리
- 릴리즈 버전 관리, 업그레이드, 롤백 지원
Helm이 등장한 배경
“애플리케이션 하나 배포하려면 YAML 수십 개가 필요한 현실”
WordPress 배포에 필요한 것들을 생각해보면:
- Deployment (wordpress 앱) + Service
- Deployment (mysql) + Service + PVC + Secret (DB 패스워드)
- ConfigMap (wp-config), Ingress, HPA…
이걸 매번 수작업으로 관리하면:
- 환경별 반복: dev/staging/prod 폴더에 거의 동일한 YAML 복사 → 유지보수 지옥
- 업그레이드 복잡도: “버전 올리려면 어떤 YAML을 어떤 순서로 바꿔야 하지?”
- 재사용 불가: 좋은 설정도 내 프로젝트에만 머묾
Helm이 해결하는 것:
-
수십 개 YAML을 하나의 Chart로 묶어 배포/관리
-
values.yaml로 환경별 설정만 분리 → 템플릿은 한 벌
-
helm rollback 한 줄로 이전 상태로 복원
-
ArtifactHub에서 공유 차트 가져다 쓰기 (nginx, prometheus, redis 등)
-
Helm 없이:
kubectl apply여러 번 (Deployment, Service, ConfigMap, Secret, PVC…) -
Helm 사용:
helm install my-app ./my-chart한 번에 전부 배포
253. Installation and Configuration
# Helm 설치 (공식 스크립트)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 또는 패키지 매니저
sudo snap install helm --classic
# 버전 확인
helm version
# Helm 저장소 추가 (ArtifactHub에서 확인)
helm repo add stable https://charts.helm.sh/stable
helm repo add bitnami https://charts.bitnami.com/bitnami
# 저장소 목록 확인
helm repo list
# 저장소 업데이트
helm repo update255. Helm 2 vs Helm 3
| 항목 | Helm 2 | Helm 3 |
|---|---|---|
| 서버 컴포넌트 | Tiller 필요 (클러스터 내 설치) | Tiller 제거 (클라이언트만) |
| 보안 | Tiller의 광범위한 권한 (보안 취약) | 사용자 RBAC 그대로 사용 |
| 릴리즈 저장 | Tiller가 ConfigMap에 저장 | Secret으로 저장 (네임스페이스별) |
| 삭제 후 재설치 | 릴리즈 이름 재사용 불가 | 가능 |
| 현재 상태 | 지원 종료 | 표준 (사용 권장) |
256. Helm Components
핵심 개념
- Chart (패키지):
templates/(YAML 템플릿) +values.yaml(기본 설정값) +Chart.yaml(메타데이터) - Release (배포 인스턴스): 같은 Chart로
my-nginx (v1),my-nginx (v2)등 여러 버전 운영 가능 - Chart Repository (ArtifactHub / 사설 저장소) →
helm install→ Chart → Release 생성
| 개념 | 설명 |
|---|---|
| Chart | 애플리케이션 패키지 (템플릿 + 기본값) |
| Release | Chart를 클러스터에 배포한 인스턴스 (이름 부여) |
| Repository | Chart를 저장/배포하는 저장소 |
| Values | 템플릿에 주입되는 설정값 |
| Revision | Release의 버전 (업그레이드/롤백 기록) |
257. Helm Charts
공식문서: Charts / Chart Template Guide
Chart 디렉토리 구조
my-chart/
├── Chart.yaml # 차트 메타데이터 (이름, 버전, 설명)
├── values.yaml # 기본 설정값
├── charts/ # 의존 차트 (sub-charts)
├── templates/ # Kubernetes 매니페스트 템플릿
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # 재사용 가능한 템플릿 함수
│ └── NOTES.txt # 설치 후 출력되는 안내 메시지
└── .helmignore # 패키징 제외 파일
Chart.yaml
apiVersion: v2
name: my-app
description: A Helm chart for my application
type: application # application 또는 library
version: 0.1.0 # Chart 버전 (SemVer)
appVersion: "1.16.0" # 애플리케이션 버전템플릿 예시
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment # 릴리즈 이름 동적 삽입
labels:
app: {{ .Chart.Name }}
spec:
replicas: {{ .Values.replicaCount }} # values.yaml에서 값 참조
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}values.yaml
replicaCount: 1
image:
repository: nginx
tag: "1.21"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80258. Working With Helm - Basics
공식문서: Helm Quickstart / Using Helm
# ── Chart 검색 ──────────────────────────────────────────────
# ArtifactHub에서 검색
helm search hub wordpress
# 로컬 저장소에서 검색
helm search repo bitnami/nginx
# ── 설치 ────────────────────────────────────────────────────
# 기본 설치
helm install my-nginx bitnami/nginx
# 네임스페이스 지정
helm install my-nginx bitnami/nginx -n web --create-namespace
# 로컬 Chart 설치
helm install my-app ./my-chart
# ── 릴리즈 관리 ─────────────────────────────────────────────
# 설치된 릴리즈 목록
helm list
helm list -n web # 네임스페이스 지정
helm list --all-namespaces
# 릴리즈 상태 확인
helm status my-nginx
# ── 제거 ────────────────────────────────────────────────────
helm uninstall my-nginx
helm uninstall my-nginx -n web259. Customizing Chart Parameters
# ── 방법 1: --set 플래그 (CLI에서 직접 값 지정) ──────────────
helm install my-nginx bitnami/nginx \
--set replicaCount=2 \
--set service.type=NodePort
# ── 방법 2: --values / -f 플래그 (커스텀 values 파일) ────────
# custom-values.yaml
# replicaCount: 3
# service:
# type: LoadBalancer
helm install my-nginx bitnami/nginx -f custom-values.yaml
# ── 기본값 확인 ──────────────────────────────────────────────
helm show values bitnami/nginx
helm show values bitnami/nginx > my-values.yaml # 파일로 저장 후 수정
# ── 우선순위 ─────────────────────────────────────────────────
# values.yaml < -f custom.yaml < --set (높을수록 우선)261. Lifecycle Management With Helm
공식문서: Helm Upgrade / Helm Rollback
업그레이드
# Chart 버전 업그레이드
helm upgrade my-nginx bitnami/nginx
# 값 변경과 함께 업그레이드
helm upgrade my-nginx bitnami/nginx --set replicaCount=3
# 업그레이드 + 실패 시 자동 롤백
helm upgrade my-nginx bitnami/nginx --atomic --timeout 5m
# 리비전 이력 확인
helm history my-nginx
# REVISION STATUS CHART DESCRIPTION
# 1 superseded nginx-13.2.0 Install complete
# 2 deployed nginx-13.2.1 Upgrade complete롤백
# 이전 버전으로 롤백
helm rollback my-nginx
# 특정 리비전으로 롤백
helm rollback my-nginx 1
# 롤백 후 이력 확인
helm history my-nginx
# REVISION STATUS DESCRIPTION
# 1 superseded Install complete
# 2 superseded Upgrade complete
# 3 deployed Rollback to 1드라이런 (변경사항 미리 보기)
# 실제 배포 없이 렌더링된 YAML 출력
helm install my-app ./my-chart --dry-run
# 또는 템플릿만 렌더링
helm template my-app ./my-chart릴리즈 전체 흐름
helm install(Revision 1)helm upgrade(Revision 2)helm rollback(Revision 3 ← Rev 1 복원)helm uninstall
262. Lab - Upgrading a Helm Chart
# 현재 설치된 릴리즈 확인
helm list
# 저장소 업데이트
helm repo update
# 사용 가능한 버전 확인
helm search repo bitnami/nginx --versions
# 특정 버전으로 업그레이드
helm upgrade my-nginx bitnami/nginx --version 14.0.0
# 업그레이드 결과 확인
helm status my-nginx
helm history my-nginx
kubectl get podsChart Dependencies (의존 차트)
왜 필요한가?
“내 앱이 Redis를 쓸 때, Redis 차트를 직접 복사하지 않고 의존성으로 불러오기 위함”
# Chart.yaml
apiVersion: v2
name: my-app
version: 1.0.0
dependencies:
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled # 조건부 설치# 의존성 다운로드 (charts/ 폴더에 저장됨)
helm dependency update ./my-chart
# 의존성 목록 확인
helm dependency list ./my-chart
# 설치 시 의존 차트도 함께 배포됨
helm install my-app ./my-chart
condition필드로postgresql.enabled=false같이 선택 설치 가능. 사용자가 외부 DB를 쓴다면 끌 수 있음.
Helm 운영 실수와 복구
흔한 실수 시나리오
| 실수 | 결과 | 복구 |
|---|---|---|
helm uninstall 후 PVC 같이 날아감 | 데이터 손실 가능 | --keep-history, 또는 Retain ReclaimPolicy |
--values 순서 잘못 지정 | 예상과 다른 값 적용 | helm get values 로 실제 적용값 확인 |
| 같은 이름으로 재설치 시도 | 이미 존재 에러 | helm uninstall 먼저 |
| 업그레이드 중 타임아웃 | 중간 상태 | --atomic 플래그로 자동 롤백 |
유용한 복구 명령
# 현재 적용된 values 확인 (chart 기본값과 내가 오버라이드한 값)
helm get values my-nginx
helm get values my-nginx --all # 모든 값 (기본값 포함)
# 실제 클러스터에 배포된 YAML 확인
helm get manifest my-nginx
# 릴리즈 이력 보존 상태로 uninstall (복원 가능)
helm uninstall my-nginx --keep-history
# 실패한 설치 복구
helm uninstall my-nginx # 깨끗이 제거
helm install my-nginx bitnami/nginx # 재설치
# 모든 리비전 strategy 확인
helm history my-nginx --max=10프로덕션에서는
helm upgrade --atomic --timeout 5m을 기본 옵션으로. 실패 시 자동 롤백되어 어중간한 상태 방지.