포스트

Helm Chart 작성방법 (1)

Chart 구조와 Template 작성의 기본

Helm Chart 작성방법 (1)

Kubernetes 환경에서 애플리케이션 배포를 반복하다 보면, 결국 매니페스트 관리의 복잡성과 중복 문제에 직면하게 된다. Helm은 이러한 문제를 해결하기 위한 사실상의 표준 도구로, 매개변수화된 Kubernetes 리소스 정의와 배포 자동화를 가능하게 한다.

Helm Chart는 Kubernetes 리소스(YAML)를

  • 템플릿화
  • 버전 관리
  • 파라미터화(values.yaml)
  • 패키징/배포

하기 위한 애플리케이션 패키지 규격

기본 구조


1
2
3
4
5
6
7
8
9
10
11
12
13
my-app/
├── Chart.yaml          # 차트 메타데이터 (필수)
├── values.yaml         # 기본 설정값 (필수)
├── values.schema.json  # values 검증 (선택)
├── templates/          # Kubernetes 리소스 템플릿
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── configmap.yaml
│   ├── secret.yaml
│   ├── _helpers.tpl    # 공통 함수 정의
│   └── NOTES.txt       # helm install 후 출력 메시지
└── charts/             # 의존 차트 (서브차트)

Chart.yaml 작성


1
2
3
4
5
6
apiVersion: v2
name: my-app
description: My application Helm chart
type: application
version: 0.1.0           # Helm Chart 버전
appVersion: "1.2.3"      # 실제 애플리케이션 버전
필드의미
version차트 변경 시 증가 (semver)
appVersion컨테이너/앱 버전 (image tag)
typeapplication / library

CI에서 앱 버전 자동 감지 → appVersion 업데이트 패턴을 자주 사용함

values.yaml 설계


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
replicaCount: 1

image:
  repository: nginx
  tag: "1.27.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

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

설계 원칙

  • 논리 단위로 묶기
  • Kubernetes 리소스 구조와 유사하게
  • 값이 늘어나도 의미가 바로 보이도록

Template 작성법


deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:

  name: {{ include "my-app.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "my-app.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "my-app.name" . }}
    spec:
      containers:
        - name: app
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.port }}

_helpers.tpl

1
2
3
4
5
6
7
8
9
{{- define "my-app.name" -}}
{{ .Chart.Name }}
{{- end }}

{{- define "my-app.fullname" -}}
{{ printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}

  • 네이밍 규칙 통일
  • 중복 제거
  • 차트 재사용성 증가

조건부 리소스


1
2
3
ingress:
  enabled: true
  host: example.com

template/ingress.yaml

1
2
3
4
5
6
7
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
...
{{- end }}

ConfigMap / Secret 분리 패턴


1
2
3
config:
  SERVER_PORT: "14159"
  WORLD_NAME: "MyWorld"
1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: ConfigMap
metadata:

  name: {{ include "my-app.fullname" . }}
data:
{{- range $key, $value := .Values.config }}
  {{ $key }}: "{{ $value }}"
{{- end }}

values.schema.json


1
2
3
4
5
6
7
8
9
10
{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "replicaCount": {
      "type": "integer",
      "minimum": 1
    }
  }
}
  • helm install 시 값 검증
  • 잘못된 값 입력 차단
  • 사용자 경험 향상