Nodejs

 

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이 주는 실무적 이점

  1. 반복 작업 자동화 → 동일한 애플리케이션을 여러 환경(dev, stage, prod)에 쉽게 배포.

  2. 재사용성 극대화 → YAML을 변수화해서 중복 제거.

  3. 안전한 운영 → helm rollback으로 이전 버전으로 즉시 되돌리기 가능.

  4. 커뮤니티 차트 활용 → 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 설치, 메시지 브로커 배포에 널리 사용.

  1. helm upgrade: 애플리케이션 업데이트

  2. helm history: 배포 이력 확인

  3. helm rollback: 특정 버전으로 되돌리기

  4. helm list: 현재 릴리스 전체 조회

 실무에서는 이 네 가지 명령어를 조합해 무중단 배포, 장애 대응, 운영 모니터링을 효율적으로 할 수 있습니다.

 

✅ 추가 학습 포인트

  • Helm 고급 기능: Hook, Subchart, Helmfile

  • Helm과 ArgoCD, FluxCD 같은 GitOps 툴의 연계

  • Helm 차트 직접 작성하기 실습

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

배우는 바가 적은 사람은 들에서 쟁기를 끄는 늙은 소와 같이 몸에 살이 찔지라도 지혜는 늘지 않는다. -법구경

댓글 ( 0)

댓글 남기기

작성