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 update

255. Helm 2 vs Helm 3

항목Helm 2Helm 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애플리케이션 패키지 (템플릿 + 기본값)
ReleaseChart를 클러스터에 배포한 인스턴스 (이름 부여)
RepositoryChart를 저장/배포하는 저장소
Values템플릿에 주입되는 설정값
RevisionRelease의 버전 (업그레이드/롤백 기록)

257. Helm Charts

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: 80

258. 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 web

259. 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

릴리즈 전체 흐름

  1. helm install (Revision 1)
  2. helm upgrade (Revision 2)
  3. helm rollback (Revision 3 ← Rev 1 복원)
  4. 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 pods

Chart 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기본 옵션으로. 실패 시 자동 롤백되어 어중간한 상태 방지.