본문 바로가기
IT & Tech 정보

🚀 Kubernetes 헬름 차트 작성 & 배포

by 지식과 지혜의 나무 2025. 5. 25.
반응형


안녕하세요!
이번에는 Helm을 활용해 Kubernetes 애플리케이션을 패키징·배포·관리하는 과정을 단계별로 살펴보겠습니다.
차트 기본 구조 이해부터, helm install · helm upgrade · helm rollback 실습까지 모두 다룹니다.



📋 목차
1. Helm 차트란?
2. 프로젝트 초기 설정
3. Chart.yaml·values.yaml 구성
4. 차트 템플릿(Templates) 작성
5. 배포 및 릴리즈 관리 (install, upgrade)
6. 롤링 업데이트 전략
7. 롤백(Rollback)·버전 관리
8. 실전 팁 & 주의사항
9. 마무리



1️⃣ Helm 차트란?
• 정의: Kubernetes 리소스를 템플릿화하고, 값(values.yaml)을 분리해 재사용 가능한 패키지로 묶은 것
• 장점
• 버전 관리(Versions) → Chart.yaml에 명시
• 환경별 설정 분리 → values-{env}.yaml
• 템플릿 언어(Golang 템플릿) 지원 → 동적 리소스 생성



2️⃣ 프로젝트 초기 설정

# Helm 설치 확인
helm version  

# 새 차트 생성
helm create myapp-chart
cd myapp-chart

# 디렉터리 구조
# myapp-chart/
# ├─ Chart.yaml
# ├─ values.yaml
# ├─ charts/
# └─ templates/
#    ├─ deployment.yaml
#    ├─ service.yaml
#    └─ _helpers.tpl

• helm create 명령으로 기본 차트 구조 자동 생성
• templates/ 폴더에 Kubernetes 리소스 템플릿 배치



3️⃣ Chart.yaml·values.yaml 구성

# Chart.yaml
apiVersion: v2
name: myapp-chart
description: "MyApp Kubernetes 차트"
version: 0.1.0
appVersion: "1.0.0"

# values.yaml (기본값)
replicaCount: 2

image:
  repository: myrepo/myapp
  tag: "1.0.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

resources:
  limits:
    cpu: 200m
    memory: 256Mi
  requests:
    cpu: 100m
    memory: 128Mi

• Chart.yaml에 차트 메타정보·버전 설정
• values.yaml에 환경별 변경 가능한 파라미터 정의



4️⃣ 차트 템플릿(Templates) 작성

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp-chart.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "myapp-chart.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "myapp-chart.name" . }}
    spec:
      containers:
        - name: myapp
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.port }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

# templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "myapp-chart.fullname" . }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
  selector:
    app: {{ include "myapp-chart.name" . }}

• {{ .Values.xxx }} 로 values.yaml 값 참조
• toYaml · nindent 함수로 복잡한 블록 삽입



5️⃣ 배포 및 릴리즈 관리 (install, upgrade)

# 1) 네임스페이스 생성
kubectl create namespace myapp-ns

# 2) 초기 설치 (install)
helm install myapp-release ./myapp-chart \
  --namespace myapp-ns \
  --values values.yaml

# 3) 상태 확인
kubectl get all -n myapp-ns

# 4) 설정 변경 후 업그레이드 (upgrade)
helm upgrade myapp-release ./myapp-chart \
  --namespace myapp-ns \
  --set image.tag=1.1.0

• helm install 시 동시에 릴리즈 이름(myapp-release) 부여
• helm upgrade 로 값 변경·템플릿 수정 반영



6️⃣ 롤링 업데이트 전략
• 기본 전략: Kubernetes Deployment spec.strategy.type: RollingUpdate
• 튜닝 예시 (templates/deployment.yaml):

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

• maxSurge: 새 파드 초과 생성 수량
• maxUnavailable: 일시 비가용 파드 수량
• 무중단 배포를 위한 파라미터 조정



7️⃣ 롤백(Rollback)·버전 관리

# 릴리즈 히스토리 조회
helm history myapp-release --namespace myapp-ns

# 특정 리비전으로 롤백
helm rollback myapp-release <REVISION> --namespace myapp-ns

• helm history 로 버전별 변경 이력 확인
• helm rollback 으로 이전 상태로 되돌리기



8️⃣ 실전 팁 & 주의사항
• Environment별 values 파일:
• values-dev.yaml, values-prod.yaml로 분리 → -f 플래그로 지정
• 헬퍼 함수 활용:
• templates/_helpers.tpl에 반복 로직·네임 생성 함수 정의
• 차트 테스트:
• helm lint → 문법·구조 검사
• helm template → 렌더링 결과 확인
• 시크릿 관리:
• 암호·API 키는 helm secrets 플러그인·External Secrets 사용



9️⃣ 마무리

Helm 차트를 제대로 작성하면
• 표준화된 배포
• 버전별 관리
• 빠른 롤백
를 손쉽게 수행할 수 있습니다.
위 예제와 팁을 참고해 여러분의 Kubernetes 워크플로우를
더욱 안정적이고 효율적으로 만들어 보세요!

반응형