Helm : 지명 template (named template) / helpers.tpl

     

    _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

    댓글

    Designed by JB FACTORY