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"을 기본값으로 사용합니다.