Helm Templating 심화
5️⃣ Helm Templating 심화
Helm은 Go 템플릿 엔진을 사용하여 Kubernetes 매니페스트를 동적으로 생성합니다. 이를 활용하면 환경별 설정 관리, 유연한 배포 구조, 중복 제거 등을 할 수 있습니다.
1 템플릿 문법 ({{ }}
구문)
Helm 템플릿에서 {{ }}
구문을 사용하여 변수, 조건문, 반복문 등을 적용할 수 있습니다.
📌 예제 (템플릿 사용법)
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
app_name: "{{ .Chart.Name }}"
environment: "{{ .Values.env }}"
위 코드에서 {{ .Release.Name }}
, {{ .Chart.Name }}
, {{ .Values.env }}
등은 Helm에서 제공하는 내장 객체입니다.
2 변수 사용 (.Values
)
values.yaml
파일에 정의된 값을 템플릿에서 불러올 수 있습니다.
✅ values.yaml
replicaCount: 3
image:
repository: nginx
tag: latest
✅ deployment.yaml
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
위처럼 values.yaml
값을 활용하면 환경별 설정 변경이 용이합니다.
3 조건문 (if
, else
, with
)
Helm 템플릿에서 조건문을 사용하여 특정 설정을 활성화하거나 비활성화할 수 있습니다.
📌 예제 (if
, else
)
{{- if .Values.service.enabled }}
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-service
spec:
type: {{ .Values.service.type }}
ports:
- port: 80
targetPort: 80
{{- else }}
# 서비스가 비활성화되었습니다.
{{- end }}
.Values.service.enabled
값이true
이면Service
가 생성됩니다.false
이면 해당 매니페스트가 생성되지 않습니다.
4 루프 (range
)
배열 데이터가 있을 때 range
문법을 사용하면 반복문을 적용할 수 있습니다.
✅ values.yaml
volumes:
- name: config
mountPath: /etc/config
- name: logs
mountPath: /var/logs
✅ deployment.yaml
(템플릿 적용)
spec:
template:
spec:
containers:
- name: app
image: my-app:latest
volumeMounts:
{{- range .Values.volumes }}
- name: {{ .name }}
mountPath: {{ .mountPath }}
{{- end }}
위 코드를 적용하면, values.yaml
의 volumes
리스트에 따라 자동으로 volumeMounts
가 생성됩니다.
5 함수 활용 (toYaml
, include
, tpl
)
Helm에는 다양한 내장 함수가 있으며, 특히 toYaml
, include
, tpl
함수는 템플릿을 다룰 때 유용합니다.
📌 toYaml
함수 (YAML 포맷 유지)
config: |-
{{ .Values.config | toYaml | indent 2 }}
toYaml
은 YAML 데이터 구조를 그대로 유지하는 데 사용됩니다.
📌 include
함수 (템플릿 재사용)
_helpers.tpl 파일에서 정의한 템플릿을 포함할 때 사용합니다.
✅ _helpers.tpl
{{- define "app.fullname" -}}
{{ .Release.Name }}-{{ .Chart.Name }}
{{- end -}}
✅ deployment.yaml
metadata:
name: {{ include "app.fullname" . }}
📌 tpl
함수 (동적 값 렌더링)
command:
- "/bin/sh"
- "-c"
- "{{ .Values.command | tpl . }}"
tpl
함수는values.yaml
내부에서도 템플릿을 렌더링할 때 사용됩니다.
6 _helpers.tpl을 활용한 템플릿 최적화
Helm에서는 _helpers.tpl
파일을 사용하여 반복되는 템플릿을 모듈화할 수 있습니다.
✅ _helpers.tpl
{{- define "app.labels" -}}
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
{{- end -}}
✅ deployment.yaml
metadata:
labels:
{{ include "app.labels" . | indent 4 }}
이렇게 하면 중복되는 레이블 정의를 하나의 템플릿으로 관리할 수 있습니다.
7 기본값 (default
) 및 사용자 입력값 적용
Helm에서는 default
함수를 사용하여 값이 없을 때 기본값을 설정할 수 있습니다.
📌 기본값 적용 예제
replicaCount: {{ .Values.replicaCount | default 2 }}
- 만약
values.yaml
에replicaCount
가 없으면2
가 기본값으로 사용됩니다.
📌 특정 설정이 없을 경우 기본값 적용
service:
type: {{ .Values.service.type | default "ClusterIP" }}
service.type
값이 설정되지 않았다면"ClusterIP"
을 기본값으로 사용합니다.