_helpers.tpl
helpers.tpl은 각 templates 폴더에서 사용할 변수들을 정의할 수 있는 곳으로 이해할 수 있다.
└─my-chart
├─charts
│ └─child
│ ├─charts
│ └─templates <-- _helpers.tpl
│
└─templates <-- _helpers.tpl
위와 같은 차트 구조가 있다고 가정해보자. 각 templates 폴더 안에는 _helpers.tpl이라는 파일이 각각 존재한다. 이 _helpers.tpl 파일들은 각 templates 폴더 안에 존재하면서 각 template에서 사용할 수 있는 변수들을 선언하는 파일이다. _helpers.tpl 파일에 선언된 변수들은 templates 폴더 안에 있는 template들이 언제든지 참조해서 사용할 수 있다.
- _helpers.tpl 선언 : define 키워드를 이용해서 선언한다.
- 다른 template에서 참조 : template, include 키워드를 이용해서 참조한다.
_helpers.tpl에 선언하기
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end}}
_helpers.tpl에 변수(template)을 선언할 때는 {{- define }}을 이용해서 선언한다. 여기서 '-'는 앞의 공백을 모두 삭제하라는 명령어고 실제로는 define이면 충분한다. mychart.labels라는 template에 lables 부터를 선언하는 것이다. 따라서 다른 Template에서 mychart.labels를 참조하면 이 녀석이 그대로 사용된다.
_helpers.tpl 값 참조하기 (template / include 가능)
my_name:
{{- template "mychart.labels" }}
template이라는 명령어를 이용해서 _helpers.tpl에 있는 값을 참조한다. 이 때, template은 좀 특이하게 동작하는데 scope를 기준으로 동작한다.
├─charts
│ ├─child
│ │ ├─charts
│ │ └─templates
│ └─child2
│ ├─charts
│ └─templates
└─templates
- 부모/자식에게 동일한 필드가 있을 때 → 부모차트의 helpers.tpl이 부모 / 자식 차트에 모두 반영됨.
- 자식에게만 해당 필드가 있을 때 → 부모 차트가 참조할 수 있음.
- 부모에게만 해당 필드가 있을 때 → 자식 차트가 참조할 수 있음.
- 자식 차트끼리 동일한 이름을 가지고 있을 때 → 먼저 찾아지는 녀석
위와 같은 경우로 나눠 봤을 때 결과는 다음과 같다. 여기서 알 수 있는 것은 다음과 같다.
Helm은 template 명령어를 보면 해당 값으로 선언되어있는 값을 찾는 작업을 한다. 만약 경로를 지정해두지 않았다면 최상위 Scope부터 찾아서 내려온다. 이 때 가장 먼저 발견된 녀석이 들어가게 된다. 따라서 부모 차트에 값이 지정 되어있으면 가장 먼저 찾아지기 때문에 이 녀석이 사용된다. 반대로 자식 차트끼리만 가지고 있는 값이 있다면 'child'가 'child2'보다 더 빨리 찾아지기 때문에 child2의 값이 부모 / child / child2에게 들어가게 된다.
C:.
├─charts
│ ├─child
│ │ ├─charts
│ │ └─templates -> "child.labels", "child.name", "child.fullname" ...
│ └─child2
│ ├─charts
│ └─templates -> "child2.labels", "child2.name", "child2.fullname" ...
└─templates -> "parent.labels", "parent.name", "parent.fullname" ...
이런 이유 때문에 _helpers.tpl에 값을 선언한다면 각 Chart별로 고유한 값을 가질 수 있도록 하는 것이 좋다. 가장 일반적인 Convention은 각 차트의 이름을 Prefix로 가지는 것이다. 예를 들면 위와 같이 각각을 작성해 줄 수 있다.
template / include의 차이
template과 include는 동일하게 _helpers.tpl에 있는 값을 불러오는 명령어다. 둘은 거의 동일한 역할을 하지만, include를 쓰는 것이 더 권장된다고 한다. template은 불러온 값을 파이프 라인으로 전달할 수 없지만 include는 불러온 값을 파이프라인으로 전달이 가능하다. 따라서 include는 불러온 값의 가공이 가능하기 때문에 더 사용할 것이 권장된다.
# _helpers.tpl
{{- define "mychart.labels" }}
app_name: {{ .Chart.Name}}
app_version: "{{ .Chart.Version}}"
{{- end}}
_helpers.tpl에 다음과 같이 값이 선언되어있다고 가정해보자. 그리고 이것을 template, include로 불러올 때의 차이점을 살펴본다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name}}
labels:
{{- template "mychart.labels" . }}
먼저 template으로 값을 불러온다.
# Source: my-chart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-chart
labels:
app_name: my-chart
app_version: "0.1.0"
불러온 결과는 다음과 같다. yaml 파일에 맞도록 들어가기를 기대했는데, labels 하위로 들어가야 하는 녀석들은 template으로 불러왔을 때 오히려 이것을 무시하고 상위로 들어간다. template을 include로 바꾸어도 동일한 결과가 나온다. 그렇지만 include는 파이프라인을 이용할 수 있기 때문에 다시 한번 처리가 가능하다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name}}
labels:
{{- include "mychart.labels" . | indent 4 }}
include 값을 불러오고 난 다음에 파이프라인으로 indent 함수를 호출한다. indent 함수로 여백 4칸을 준 후의 결과를 살펴보면 다음과 같다.
# Source: my-chart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-chart
labels:
app_name: my-chart
app_version: "0.1.0"
원하는 형태로 깔끔하게 구현된 것을 볼 수 있다.
출처
'Dev-Ops > helm' 카테고리의 다른 글
Helm : Chart Dependency 관리 (0) | 2022.10.31 |
---|