Helm Templating 심화

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.yamlvolumes 리스트에 따라 자동으로 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.yamlreplicaCount가 없으면 2가 기본값으로 사용됩니다.

📌 특정 설정이 없을 경우 기본값 적용

service:
  type: {{ .Values.service.type | default "ClusterIP" }}
  • service.type 값이 설정되지 않았다면 "ClusterIP"을 기본값으로 사용합니다.
RSS Feed
마지막 수정일자