Kubernetes에서 Helm 완전 정복: 개발자를 위한 가장 쉬운 패키지 매니저 가이드
쿠버네티스(Kubernetes)로 서비스를 운영하다 보면, YAML 파일이 눈덩이처럼 불어나는 경험을 누구나 하게 됩니다.
서비스 하나 올리려 해도 Deployment, Service, ConfigMap, Secret, Ingress 등 수많은 리소스를 작성해야 하죠.
"이거 다 손으로 관리하다간 진짜 머리 터지겠다…" 하는 순간, 여러분을 구원해줄 슈퍼히어로가 등장합니다. 바로 Helm입니다. ????
✅ Helm이란 무엇인가?
Helm은 쿠버네티스의 패키지 매니저입니다.
✨ 쉽게 말해, Node.js 세계에서 npm, Linux에서 apt 같은 역할을 쿠버네티스에서 해주는 도구예요.
수십 개 YAML 파일을 하나의 패키지(Chart) 로 묶어 관리할 수 있음.
필요한 설정은 values.yaml에서 오버라이딩하면 끝.
설치, 업그레이드, 롤백까지 한 줄 명령어로 처리 가능.
즉, Helm을 쓰면 쿠버네티스 배포가 마법처럼 간단해집니다. ✨
✅ Helm Chart 구조 뜯어보기
Helm Chart는 프로젝트 템플릿과 비슷하게 폴더 구조를 가집니다.
mychart/ Chart.yaml # 차트 정보 (이름, 버전, 설명) values.yaml # 기본 설정값 (이미지, 환경 변수, 포트 등) templates/ # 쿠버네티스 리소스 템플릿 (Deployment, Service 등)
Chart.yaml
차트 이름, 버전, 설명 같은 메타데이터를 정의합니다.
values.yaml
사용자 설정 파일입니다.
예: 이미지 버전, replica 개수, 포트 번호 등.
실무에서 이 파일만 수정해도 배포 환경을 손쉽게 바꿀 수 있습니다.
templates/
실제 쿠버네티스 YAML 템플릿이 들어갑니다.
Go 템플릿 문법을 사용하여 변수({{ .Values.xxx }})를 삽입할 수 있습니다.
values.yaml 사용법 예제
Helm의 진짜 매력은 values.yaml을 통해 환경을 유연하게 바꿀 수 있다는 점입니다. 강의에서 사용한 코드를 예제로 살펴보겠습니다.
Deployment 템플릿 (templates/deployment.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-app labels: app: {{ .Release.Name }}-app spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Release.Name }}-app template: metadata: labels: app: {{ .Release.Name }}-app spec: containers: - name: {{ .Release.Name }}-container image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: {{ .Values.service.port }} env: - name: ENVIRONMENT value: "{{ .Values.environment }}"
values.yaml (사용자 정의 값)
replicaCount: 2 image: repository: nginx tag: latest service: port: 80 environment: "development"
이 구조 덕분에, values.yaml만 수정하면 같은 템플릿으로 개발/스테이징/운영 환경에 맞춰 쉽게 배포할 수 있습니다.
예를 들어 운영 환경에서는 replica를 5로 늘리고, 이미지 태그를 1.2.0으로 바꾸는 식이죠.
⚡ Helm이 주는 실무적 이점
반복 작업 자동화 → 동일한 애플리케이션을 여러 환경(dev, stage, prod)에 쉽게 배포.
재사용성 극대화 → YAML을 변수화해서 중복 제거.
안전한 운영 → helm rollback으로 이전 버전으로 즉시 되돌리기 가능.
커뮤니티 차트 활용 → Bitnami 같은 유명 저장소에서 검증된 차트를 받아 즉시 배포.
예를 들어, helm install mydb bitnami/mysql 한 줄이면 MySQL이 쿠버네티스 클러스터에 배포됩니다.
✅ 실무 적용: NestJS 마이크로서비스 + Helm
NestJS 마이크로서비스 아키텍처를 쿠버네티스에 배포한다고 생각해봅시다.
각 서비스(NestJS API, Auth, Redis, RabbitMQ, DB 등)를 각각의 차트로 관리.
values.yaml에서 이미지 버전과 자원 설정을 바꿔가며 다양한 환경에 맞춤 배포.
헬름 릴리즈 단위로 배포 관리가 되니, 특정 서비스만 롤백하는 것도 가능.
실무에서는 CI/CD 파이프라인에 Helm을 연결해 자동 배포를 구현하는 경우가 많습니다.
✅ Helm Repository 활용
Helm 차트는 GitHub처럼 저장소에 공유할 수 있습니다.
공식 저장소: Artifact Hub
예: helm repo add bitnami https://charts.bitnami.com/bitnami
이렇게 저장소를 등록하면, helm install로 원하는 차트를 바로 내려받아 배포할 수 있습니다.
Helm CLI 기능 - 배포
Helm을 사용하면 Kubernetes 애플리케이션을 아주 간단하게 배포할 수 있습니다.
실제로는 복잡한 매니페스트(YAML)를 작성해야 하지만, Helm 차트 덕분에 한 줄의 명령어로 모든 리소스를 관리할 수 있습니다.
1. 기본 배포 명령어
# 문법 helm install <release-name> <chart-directory> --values <values-file> # 예제 helm install my-app ./my-chart
release-name: 배포된 릴리스 이름 (ex: my-app)
chart-directory: Helm 차트가 위치한 디렉토리 (ex: ./my-chart)
--values: (선택) values.yaml 파일을 지정하여 원하는 설정 적용
즉, 위 명령은 my-chart라는 Helm 차트를 불러와 my-app이라는 이름으로 클러스터에 설치합니다.
2. 배포 결과 확인
배포가 성공하면 Helm은 릴리스 정보를 출력합니다:
NAME: my-app LAST DEPLOYED: Thu Nov 7 12:00:00 2024 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: 1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-app,app.kubernetes.io/instance=my-app" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:80
NAME: 릴리스 이름
STATUS: deployed → 정상 배포 완료
REVISION: 현재 릴리스 버전 (업데이트 시 증가)
NOTES: 헬름 차트에 포함된 사용 안내 메시지
여기서는 kubectl port-forward를 통해 로컬호스트 8080 포트에서 애플리케이션에 접근할 수 있습니다.
3. 실무 팁
release-name은 프로젝트 단위로 구분 지어주는 것이 좋습니다. (예: order-service, user-service)
Helm 차트 내부 NOTES.txt 파일에 사용자가 따라 해야 할 가이드를 작성해 두면 협업에 큰 도움이 됩니다.
배포 후에는 helm list 명령으로 현재 배포 상태를 관리할 수 있습니다.
Helm CLI 기능 - 업데이트 (Upgrade)
Helm에서 배포된 애플리케이션을 새로운 버전으로 교체하거나 설정 값을 변경할 때는 helm upgrade 명령어를 사용합니다.
helm upgrade <release-name> <chart-directory> --values <values-file>
예시:
helm upgrade my-app ./my-chart -f values.yaml
기존에 배포된 my-app을 새로운 차트 설정으로 업데이트합니다.
--values 옵션을 통해 수정된 설정 파일을 반영할 수 있습니다.
실무 팁: 업데이트하기 전에 helm diff 플러그인을 이용하면 변경 사항을 미리 확인할 수 있습니다.
Helm CLI 기능 - 릴리스 히스토리 확인 (History)
배포 및 업데이트가 여러 번 진행된 경우, 특정 릴리스의 이력을 확인할 수 있습니다.
helm history <release-name>
예시:
helm history my-app
출력 예시:
REVISION UPDATED STATUS CHART APP VERSION 1 2024-11-07 12:00:00 deployed my-chart-0.1.0 1.0 2 2024-11-07 15:30:00 superseded my-chart-0.1.1 1.1 3 2024-11-07 16:00:00 deployed my-chart-0.1.2 1.2
REVISION: 배포 버전 번호
STATUS: 배포 상태 (deployed, superseded, failed 등)
UPDATED: 배포된 시간
Helm CLI 기능 - 롤백 (Rollback)
업데이트가 실패하거나 문제가 발생했을 때는 이전 버전으로 쉽게 되돌릴 수 있습니다.
helm rollback <release-name> <revision>
예시:
helm rollback my-app 2
my-app 릴리스를 REVISION 2 버전으로 되돌립니다.
helm history로 확인한 버전을 지정하면 안전하게 복구할 수 있습니다.
⚠️ 주의: 롤백 시에도 새로운 REVISION 번호가 생성되므로, 변경 추적이 가능합니다.
Helm CLI 기능 - 현재 릴리스 확인 (List)
클러스터 내에 어떤 Helm 릴리스가 존재하는지 확인할 때는 helm list 명령어를 사용합니다.
helm list
출력 예시:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-app default 3 2024-11-07 16:00:00 deployed my-chart-0.1.2 1.2 another default 1 2024-11-08 10:00:00 deployed another-0.1.0 0.1
NAME: 릴리스 이름
NAMESPACE: 설치된 네임스페이스
REVISION: 현재까지의 배포 횟수
STATUS: 현재 상태 (예: deployed, failed)
✅ 핵심 정리
Helm은 쿠버네티스의 패키지 매니저다.
YAML 파일 뭉치를 차트(Chart) 로 묶어 관리한다.
values.yaml을 수정하여 손쉽게 환경에 맞게 배포 가능.
설치, 업그레이드, 롤백 모두 한 줄 명령어로 처리.
실무에서는 마이크로서비스 배포, DB 설치, 메시지 브로커 배포에 널리 사용.
helm upgrade: 애플리케이션 업데이트
helm history: 배포 이력 확인
helm rollback: 특정 버전으로 되돌리기
helm list: 현재 릴리스 전체 조회
실무에서는 이 네 가지 명령어를 조합해 무중단 배포, 장애 대응, 운영 모니터링을 효율적으로 할 수 있습니다.
✅ 추가 학습 포인트
Helm 고급 기능: Hook, Subchart, Helmfile
Helm과 ArgoCD, FluxCD 같은 GitOps 툴의 연계
Helm 차트 직접 작성하기 실습
댓글 ( 0)
댓글 남기기