Helm Chart 구성하기

Helm Chart 구조와 주요 파일

sample_chart/
 ├─ Chart.yaml          # 차트 메타데이터
 ├─ values.yaml         # 기본값 정의
 ├─ charts/             # 의존성 차트 저장소
 ├─ templates/          # 쿠버네티스 리소스 템플릿
 │   └─ _helpers.tpl    # 템플릿 헬퍼 함수 (선택)
 ├─ templates/NOTES.txt # 설치 후 안내 메시지 (선택)
 └─ README.md           # 설명 파일 (선택)
  • Chart.yaml 차트의 이름, 버전, API 버전, 설명 등을 정의하는 메타데이터 파일.

apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
version: 0.1.0
  • values.yaml 차트에서 사용할 기본 변수 값. --set이나 -f 옵션으로 덮어쓸 수 있음.

replicaCount: 2
image:
  repository: nginx
  tag: "1.21"
  • charts/ 서브 차트(의존성 차트)를 저장하는 디렉토리. helm dependency update 실행 시 다운로드됨.

  • templates/ 실제 쿠버네티스 매니페스트 템플릿이 위치.

    • _helpers.tpl: 재사용 가능한 템플릿 함수 모음.

    • NOTES.txt: 차트 설치 후 사용자에게 표시할 메시지.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: nginx
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
  • README.md 차트에 대한 설명 문서.

Helm Chat 설치 및 디렉토리 구성하기

1. Install Helm

  • MacOS: brew install helm

  • Linux:

    curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

helm version

2. Create Chart

# create helm chart
helm create mychart
# Local Render & Validate
helm lint mychart                     # 정적 점검
helm template myrelease mychart -f ./mychart/values.yaml  # 렌더링 결과 미리보기

---
# Source: mychart/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myrelease-mychart
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: myrelease
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
automountServiceAccountToken: true
---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myrelease-mychart
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: myrelease
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: myrelease
# Package
helm package mychart
# 출력: mychart-0.1.0.tgz (Chart.yaml의 version 사용)

Helm Chart Repository 구성하기

Helm 레포지토리는 차트(.tgz 패키지)들의 인덱스 목록(index.yaml) 과 바이너리 파일(.tgz)을 HTTP/OCI 프로토콜로 제공하는 저장소 (~ Docker Registry)

  • 클래식(HTTP) 레포: 정적 호스팅으로 index.yaml + *.tgz 제공

# Make index.yaml file
helm repo index . --url https://example.github.io/charts-repo
helm repo index . --url https://example.github.io/charts-repo --merge index.yaml
  • OCI 레포: 컨테이너 레지스트리를 기반으로 차트를 push/pull

소스 타입
저장 위치
핵심 파일/개념
장점
주의점

클래식 Helm 레포

정적 웹(예: GitHub Pages)

index.yaml + *.tgz

간단·보편적, Argo/Helm 즉시 호환

index 병합/URL 관리 필요

OCI 레포

컨테이너 레지스트리

oci://…/chart:version

권한/감사 일원화, index 불필요

레지스트리 인증/권한 셋업

Git(원시 차트)

GitHub 등

Chart.yaml/templates/

패키징 無, PR 워크플로우 친화

“Helm 레포”는 아님(Argo가 Git 읽음)

** ArgoCD 에서는 패키징하지않고 깃헙 레포의 구조만으로 배포가 가능 (ArgoCD 쪽 문서 참조)

Last updated

Was this helpful?