템플릿
이 부분은 모범사례 가이드의 일부로서 템플릿을 자세히 알아본다.
templates/
의 구조
templates/
디렉토리는 다음과 같이 구조화되어야 한다.
- YAML을 만드는 템플릿 파일들은 확장자가
.yaml
이어야 한다. 형식이 정해지지 않은 컨텐츠를 만드는 템플릿 파일에는.tpl
확장자를 쓸 수 있다. - 템플릿 파일 이름은 대시 표기법(
my-example-configmap.yaml
)을 따라야 하며, 카멜 표기법이 아니다. - 각 리소스 정의는 자체 템플릿 파일 내에 있어야 한다.
- 템플릿 파일 이름은 이름 내에 리소스 종류를 반영해야 한다. 예 :
foo-pod.yaml
,bar-svc.yaml
정의된 템플릿의 이름
정의된 템플릿 ({{ define }}
지시문 내에 생성된 템플릿)은
전역에서 접근가능하다. 즉, 차트와 그 모든 하위 차트는
{{ define }}
으로 생성된 모든 템플릿에 접근할 수 있다.
위와 같은 이유로, 모든 정의된 템플릿 이름은 네임스페이스별로 구분되어야 한다.
올바른 경우:
{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}
잘못된 경우:
{{- define "fullname" -}}
{{/* ... */}}
{{ end -}}
이 모범 사례에 따라 템플릿 이름이 자동으로 정의되므로,
helm create
명령을 통해 새 차트를 생성하는 것이 좋다.
템플릿 형식
템플릿은 스페이스 2개 (탭 아님)를 사용하여 들여쓰기 해야 한다.
템플릿 지시문에서 여는 중괄호 뒤와 닫는 중괄호 앞에는 공백을 두어야 한다.
올바른 경우:
{{ .foo }}
{{ print "foo" }}
{{- print "bar" -}}
잘못된 경우:
{{.foo}}
{{print "foo"}}
{{-print "bar"-}}
템플릿은 가능한 경우 공백을 줄여야 한다.
foo:
{{- range .Values.items }}
{{ . }}
{{ end -}}
블록 (예 : 제어 구조)은 템플릿 코드의 흐름을 나타내기 위해 들여쓰기 할 수 있다.
{{ if $foo -}}
{{- with .Bar }}Hello{{ end -}}
{{- end -}}
하지만, YAML은 공백 지향 언어이기 때문에, 규칙에 따른 코드 들여쓰기가 불가능한 경우가 많다.
생성된 템플릿의 화이트스페이스
생성된 템플릿의 공백을 최소로 유지하는 것이 좋다. 특히, 많은 수의 빈 줄이 서로 인접해 있으면 안된다. 그러나 가끔씩 나오는 빈 줄(특히 논리 섹션 사이)은 무방하다.
가장 좋은 경우:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
괜찮은 경우:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
지양해야 할 경우:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
주석 (YAML 주석 vs. 템플릿 주석)
YAML과 헬름 템플릿 모두 주석 마커가 있다.
YAML 주석:
# This is a comment
type: sprocket
템플릿 주석:
{{- /*
This is a comment.
*/}}
type: frobnitz
정의된 템플릿 설명과 같이 템플릿의 기능을 문서화할 때는, 템플릿 주석을 사용해야 한다.
{{- /*
mychart.shortname 은 릴리스 이름에서 6자만 자른 것을 제공한다.
*/}}
{{ define "mychart.shortname" -}}
{{ .Release.Name | trunc 6 }}
{{- end -}}
템플릿 내에서, YAML 주석은 헬름 사용자가 디버깅 중에 주석을 볼 때 유용하게 사용될 수 있다.
# 값이 100Gi를 넘으면 문제가 발생할 수 있다
memory: {{ .Values.maxMem | quote }}
위의 주석은 사용자가 helm install --debug
를 실행할 때 표시되는데,
{{-/ * * /-}}
섹션에 지정된 주석은 표시되지 않는다.
템플릿과 템플릿 출력에서 JSON 사용하기
YAML은 JSON의 상위집합이다. 경우에 따라서는, JSON 구문을 사용하는 것이 다른 YAML 표현보다 더 읽기 쉬울 수 있다.
예를 들어, 이 YAML은 목록을 표현하는 일반적인 YAML 방법에 더 가깝다.
arguments:
- "--dirname"
- "/foo"
그러나 JSON 목록 스타일로 축약하면 읽기가 더 쉽다.
arguments: ["--dirname", "/foo"]
가독성을 높이기 위해 JSON을 사용하는 것은 좋다. 하지만, 더 복잡한 구조를 나타내는 데에 JSON 구문을 사용해서는 안된다.
YAML (예를 들어 init 컨테이너 설정)에 포함된 순수 JSON을 다룰 때에는, 당연히 JSON 형식을 사용하는 것이 적절하다.