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) |
| type | application / 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 시 값 검증- 잘못된 값 입력 차단
- 사용자 경험 향상