쿠버네티스 (Kubernetes) 주요 용어 Helm
Helm 개요
Helm은 쿠버네티스 애플리케이션 패키징·설치·업그레이드를 간편하게 관리하는 패키지 매니저다. Helm의 패키지 단위를 차트(Chart)라 부르며, 차트는 관련된 쿠버네티스 리소스들의 집합을 정의하는 파일 모음이다. 예를 들어, Chart.yaml
, 템플릿(templates/
디렉터리), 기본값(values.yaml
) 등이 포함된 디렉터리 구조로 구성된다. Helm CLI(helm
)를 사용하여 차트 저장소에 등록된 애플리케이션을 검색하고 설치할 수 있다. Helm은 CNCF 정식 프로젝트로 커뮤니티에서 활발히 관리되고 있으며, Helm Charts를 통해 복잡한 애플리케이션을 정의·설치·업그레이드할 수 있다.
Helm이 필요한 이유
쿠버네티스에서는 서비스마다 여러 리소스를 정의해야 하므로 YAML 파일 관리가 복잡하고 실수하기 쉽다. Helm은 이러한 반복 작업을 템플릿과 패키지화로 자동화하여 재사용성과 일관성을 제공한다. Helm 차트는 복잡한 애플리케이션도 정의할 수 있어, 여러 리소스를 한 묶음으로 관리하며 배포를 반복 가능하게 만든다. 또한 차트는 버전 관리와 공유가 쉬워, 안정된 배포 히스토리를 유지하고 필요시 helm rollback
으로 손쉽게 이전 버전으로 되돌릴 수 있다. 이 밖에도 Helm을 사용하면 배포 절차를 코드화해 CI/CD 파이프라인에 통합할 수 있어 자동화 수준을 높이고, 쿠버네티스 리소스 정의의 복제·오류 위험을 줄일 수 있다.
-
복잡성 관리: Helm 차트로 복잡한 앱을 단일 패키지로 관리해 배포 프로세스를 재사용 가능하게 한다.
-
일관성·버전관리: 차트 버전과
values.yaml
덕분에 동일한 구성으로 여러 환경에 배포하거나 이전 상태로 롤백할 수 있다. -
자동화:
helm install/upgrade
명령 한 줄로 다수의 리소스를 생성·변경할 수 있어, 수동 kubectl 적용 대비 실수를 줄이고 배포 속도를 높인다.
Helm 구성요소 설명
-
차트(Chart): Helm 패키지의 기본 단위로, 쿠버네티스 클러스터에 설치할 리소스 집합의 정보를 담는다.
Chart.yaml
(메타데이터),templates/
(리소스 템플릿),values.yaml
(기본 값) 등이 포함된다. -
저장소(Repository): 차트를 저장해 둔 HTTP 서버다. Helm은
helm repo add
로 외부 저장소(예: Artifact Hub)를 등록한 뒤,helm repo list
로 확인하고helm search repo
로 원하는 차트를 검색할 수 있다. -
릴리스(Release): 특정 네임스페이스에 차트를 설치한 인스턴스다. 같은 차트를 여러 번 설치하면 서로 다른 릴리스가 생성되며, 각 릴리스는
helm upgrade
때마다 버전 번호가 증가하고 필요시helm rollback
으로 이전 버전으로 되돌릴 수 있다. -
Values 파일: 차트의 기본 설정을 담은 YAML 파일로,
helm install/upgrade -f values.yaml
또는--set
옵션으로 값을 오버라이드할 수 있다. 예를 들어, 차트별로 노출한 환경변수, 이미지 태그, 리소스 개수 등을values.yaml
에 정의해 배포 시 원하는 값으로 조절할 수 있다.
Helm 기본 사용법
실제 사용 시 Helm은 다음과 같은 단계로 운영한다.
1. Helm 설치
Helm은 바이너리로 설치해 사용할 수 있다. 예를 들어 Linux나 macOS에서는 공식 설치 스크립트를 이용한다:
$ curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
설치 후 helm version
명령으로 클라이언트 버전을 확인한다.
2. 차트 저장소 추가 및 검색
차트는 공식/서드파티 저장소에 공개되어 있다. 원하는 저장소를 추가한 뒤 차트명을 검색한다. 예를 들어 NGINX Ingress Controller 차트는 공식 저장소에 있으므로 다음과 같이 추가 및 검색할 수 있다:
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm search repo ingress-nginx
위 명령어로 저장소를 등록하고 최신 인덱스를 가져온 뒤, helm search repo
로 차트 이름과 설명을 조회할 수 있다.
3. 차트 설치
helm install
로 차트를 클러스터에 배포한다. 설치 시에는 릴리스 이름, 차트 위치(저장소명/차트명), 네임스페이스, 값 파일 등을 지정할 수 있다. 예를 들어 ingress-nginx
차트를 ingress-nginx
네임스페이스에 설치하려면:
$ helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
공식 문서에 따르면 helm install [릴리스명] [저장소명/차트명]
형식으로 차트를 설치할 수 있다. 이때 --namespace
옵션으로 네임스페이스를 지정하고 --create-namespace
를 추가하면 네임스페이스가 없을 경우 자동 생성한다.
사용자 값 적용
기본 설정을 변경하고 싶다면 별도의 values.yaml
파일을 만들어 -f
옵션에 전달한다. 예를 들어 NGINX Ingress 컨트롤러의 복제 개수를 2로 늘리고 싶다면:
$ cat <<EOF > nginx-values.yaml
controller:
replicaCount: 2
EOF
$ helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace -f nginx-values.yaml
이렇게 하면 차트에 정의된 기본값 대신 nginx-values.yaml
의 설정을 적용해 설치한다.
4. 업그레이드·롤백·삭제
설치된 릴리스는 helm upgrade
로 차트를 재설치하거나 설정을 변경할 수 있다. 예를 들어 위에서 생성한 ingress-nginx
릴리스에 값을 업데이트하려면:
$ helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx -f nginx-values.yaml
업그레이드 전 helm history <릴리스명>
으로 이전 배포 히스토리를 확인하고, 문제가 있을 때는 helm rollback <릴리스명> <이전버전번호>
로 이전 상태로 쉽게 되돌릴 수 있다. 릴리스 삭제는 helm uninstall <릴리스명>
을 사용한다:
$ helm uninstall ingress-nginx -n ingress-nginx
실무 예시
NGINX Ingress Controller
NGINX Ingress Controller는 Helm 차트로 널리 사용된다. 위에서처럼 저장소를 추가한 뒤 차트를 설치하면 자동으로 Ingress 관련 리소스가 생성된다. 예를 들어:
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
이후 필요에 따라 values 파일을 만들어 컨트롤러 설정을 조정할 수 있다. 예를 들어 서비스 타입을 NodePort
로 변경하거나, 컨트롤러 설정에 주석을 추가하려면:
$ cat <<EOF > ingress-values.yaml
controller:
service:
type: NodePort
externalTrafficPolicy: Local
config:
use-forwarded-headers: "true"
EOF
$ helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx -f ingress-values.yaml
이처럼 Helm을 활용하면 복잡한 Ingress 리소스를 간편히 배포하고, 설정을 쉽고 일관되게 관리할 수 있다.
Prometheus
Prometheus 모니터링 툴도 Helm으로 자주 설치한다. 공식 커뮤니티 차트를 예로 들면:
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prometheus prometheus-community/prometheus \
--namespace monitoring --create-namespace
기본값 외에 영구저장소(PVC) 크기나 스크랩 간격 같은 설정을 커스터마이징하려면 values 파일을 사용한다:
$ cat <<EOF > prometheus-values.yaml
server:
global:
scrape_interval: 15s
persistentVolume:
enabled: true
size: 20Gi
EOF
$ helm upgrade prometheus prometheus-community/prometheus \
-n monitoring -f prometheus-values.yaml
Prometheus 차트의 복잡한 설정도 values 파일로 분리 관리하면 운영이 훨씬 수월해진다.
장단점 및 실무 팁
-
장점: 패키지화된 차트를 재사용함으로써 다양한 환경에 반복 배포가 가능하다. 차트 버전을 관리하기 쉬워 동일한 애플리케이션을 일관된 상태로 배포/롤백할 수 있다. 또한 Artifacts Hub 같은 공용 레포지토리에서 검증된 차트를 내려받아 빠르게 환경을 구축할 수 있다.
-
단점: Helm은 설치 후 리소스의 실시간 상태를 모니터링하지 않는다. 예를 들어
helm status
는 리소스가 삭제되거나 문제가 생겨도 계속deployed
로 표시할 수 있어, 실제 장애를 파악하기 어렵다. 또한 차트 내부에 수십 개의 템플릿이 복잡하게 얽혀 있어, 문제가 생길 때 디버깅이 어렵다. -
실무 팁:
-
helm lint
로 차트 문법과 값의 무결성을 검사한다. -
--dry-run --debug
옵션으로 변경 전 Helm이 생성할 리소스를 미리 확인한다. -
환경별로 values 파일을 분리 관리하되(
values-dev.yaml
,values-prod.yaml
등), 깃 레포에 별도로 보관하여 설정 변경 이력을 추적한다. -
민감 정보(패스워드, 토큰 등)는
helm-secrets
같은 플러그인을 사용해 암호화 관리하거나, 쿠버네티스 시크릿을 직접 관리한다. -
차트 업데이트 시, 기존 릴리스와 충돌하지 않도록
helm diff
플러그인으로 변경점을 비교해보고 롤백 전략을 검토한다. -
커스텀 차트를 개발할 때는
values.schema.json
을 작성해 올바른 값 구조를 강제하고,helm test
나NOTES.txt
를 활용해 배포 후 작업을 자동화하는 것이 도움이 된다.
-
Helm은 복잡한 K8s 애플리케이션 배포를 대폭 단순화해 주지만, 차트 설계와 디버깅에는 주의를 기울여야 한다. 위의 팁과 같이 충분히 테스트하고 정책을 마련하면 Helm을 통해 실무에서 효율적이고 안정적으로 운영할 수 있다.
댓글남기기