차트 탬플릿 딥다이브(Templates Deep Dive)

헬름 + 쿠버네티스 가이드북
이민석's avatar
May 01, 2024
차트 탬플릿 딥다이브(Templates Deep Dive)

헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.

가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.

개요

직전에 Unchaptered (Blog) | 차트 생성하기(Create Helm)를 배웠습니다. 이번 챕터에서는 헬름 차트의 고급 문법 및 사례들을 자세하게 파헤쳐 보겠습니다.

구성 요소

전체 구성은 아래의 4가지로 구성되어 있습니다.

  1. Template Actions

  2. Conditions

  3. Loops

  4. Variables

본문

탬플릿 액션(template action)

헬름에서는 템플릿 액션 문법 {{}} 을 사용해서 핼름의 고유한 문법을 부를 수 있습니다.

이 안에서 하이픈 - 을 사용하는 경우에는 탬플릿 액션 외부에 있는 불필요한 공백(=스페이스바)를 제거하는 기능을 합니다.

  • 예제 1

    • 입력

      {{ "hello" }} , {{ "world" }}
    • 출력

      "hello , world"
  • 예제 2

    • 입력

      {{ "hello" - }} , {{ - "world" }}
    • 출력

      "hello,world"

  1. 탬플릿 파일만들기

    apiVersion: apps/v1
    kind: Deployment
      {{"Helm Templating is" -}} , {{- "Cool"}}

  1. 핼름 탬플릿 실행하기

    1. 명령어

      helm template <CHART_NAME>
    2. 예제

      helm template firstchart
    3. 예제 출력값

      # Source: firstchart/templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
        Helm Templating is,Cool

탬플릿 인포메이션(template information)

탬플릿 파일(template/*.yaml)에서 사용 가능한 모든 정보의 포함을 점 . 으로 표시합니다.
즉, 핼름 차트에서 많이 보이는 .Values.~ 은 인포메이션에 포함된 프로퍼티 중에 Values에 대한 엑세스입니다.

접속 가능한 탬플릿 인포메이션 유형은 다음과 같습니다.

인포메이션 종류

인포메이션 예시

.Values

.Values

.Chart

.Chart,Name

.Chart.Version

.Chart.AppVersion

.Chart.Annotions

.Release

.Release.Name

.Release.NameSpace

.Release.IsInstall

.Release.IsUpgrade

.Release.Service

.Template

.Template.Name

.Template.BasePath

아래 예제에서는 template/*.yaml 파일에 사용하고자 하는 탬플릿 인포메이션은 작성하고 핼름 탬플릿 기능을 활용하여 조회하고 있습니다.

[예시]

  1. values.yaml에 아래 값 추가

      my:
        custom:
          data: "test"

  1. templates/deployment.yaml에서 탬플릿 인포메이션 접근

    apiVersion: apps/v1
    kind: Deployment
      {{ .Values.my.custom.data }}

  1. 헬름 템플릿 실행

    1. 입력값

      helm template firstchrat
    2. 출력값

      # Source: firstchart/templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
        test

파이프라인 문법

파이프라인 문법은 Ubuntu를 포함한 광범위한 운영체제에서 쓰이는 CLI 레벨의 문법입니다.

아래와 같이 사용할 수 있습니다.

{{ - include “firstchart.selectorLables” . | nindent 6 }}

구체적으로 templates/deployment.yaml에 아래 파일을 추가해서 결과를 보겠습니다.

명령어

설명

default

파이프라인 왼쪽의 표준 출력값이 null이면 “testdefault”를 할당

upper

모든 문자열을 대문자로 교체

quote

비문자열을 문자열로 포함

예)
values.yaml에 들어간 변수가 아래와 같을 때, 자동으로 쌍따옴표(”)를 붙여줌

- 입력값
```yaml
text: hello
```

- 접근구문
```yaml
{{ .Values.text | quote }}
```

- 출력값
```shell
“hello”
```

  1. values.yaml에 아래 값 추가

      my:
        custom:
          data: "test"

  1. templates/deployment.yaml에서 탬플릿 인포메이션 접근

    apiVersion: apps/v1
    kind: Deployment
      {{ .Values.my.custom.data | default "testdefault" | upper | quote }}

  1. 헬름 템플릿 실행

    1. 입력값

      helm template firstchrat
    2. 출력값

      # Source: firstchart/templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
        "test"
        "TEST"

함수(function)

함수(function)은 헬름 액션 안에서 복잡한 작업을 진행하기 위해서 지원되는 기능이다.
일반적으로 다음과 같은 구성을 가진다. 여기서는 윗(with) 문법이 동시에 쓰였다.

{{ - with <VALUES> }}
  {{ -toYaml . | nident 8 }}
{{ - end }}

지원되고 있는 함수 종류는 Helm (Docs) | Template Function List에서 확인할 수 있다.

명령어

예시

설명어

nindent <NUMBER>

nindent 2
nindent 4
nindent 6

2칸 들여쓰기
4칸 들여쓰기
6칸 들여쓰기

toYaml .

{{ - with .Values.podAnnotations }}
annotions:
{{ - toYaml . | nident 8 }}
{{ - end }}

.Values.podAnnotions에는 json 객체 {} 가 들어가있음
이 객체를 YAML 형식으로 변환

조건문 로직(conditional logic)

조건문 로직(conditional logic)은 특정한 액션(Action) 블럭을 조건부로 실행하고 싶을 때 주로 사용됩니다.

유형

예시

if 문

{{- if <BOOLEAN 값> }}

{{ <ACTIONS> }}

{{- end}}

if else 문

{{- if <BOOLEAN 값> }}

{{ <ACTIONS> }}

{{- else }}

{{ <ACTIONS> }}

{{- end}}

if not 문

{{- if not <BOOLEAN 값> }}

{{ <ACTIONS> }}

{{- end}}

if and 문

{{- if and <BOOLEAN 값> (<BOOLEAN 값>) }}

{{ <ACTIONS> }}

{{- end}}

{{- if and <BOOLEAN 값> (not <BOOLEAN 값>) }}

{{ <ACTIONS> }}

{{- end}}

  1. values.yaml에 값 추가하기

    my:
      flag: true

  1. templates/deployment.yaml에서 탬플릿 인포메이션 접근

    apiVersion: apps/v1
    kind: Deployment
    {{- if .Values.my.flag }}
    {{"Output of if" | nindent 2}}
    {{- end}}

  1. 헬름 템플릿 실행

    1. 입력값

      helm template firstchrat
    2. 출력값

      # Source: firstchart/templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      
        Output of if

윗(with)

2024-05-09 추가
윗(with) 문법을 사용하면 코드를 조금 더 간결하게 작성 및 관리할 수 있습니다.
아래 사례를 보면 바로 그 이유를 이해할 수 있습니다.

{{- with .Values.config }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .name }}
data:
  username: {{ .username }}
  password: {{ .password }}
{{- end }}

윗(with) 문법을 사용하여 동적으로 블럭을 생성하거나 생성하지 않을 수 있습니다.

{{- with .Values.my.values}}

countriesOfDeployment:
  {{- toYaml . | nindent 2 }}

{{- else }}

# Empty

{{- end}}
  1. values.yaml에 값 추가하기

      my:
        values:
          - usa
          - korea
          - india
          - maxico
          - uk

  1. templates/deployment.yaml에서 탬플릿 인포메이션 접근

    apiVersion: apps/v1
    kind: Deployment
    {{- with .Values.my.values }}
      {{- toYaml . | nindent 2 }}
    {{- end }}

  1. 헬름 템플릿 실행

    1. 입력값

      helm template firstchrat
    2. 출력값

      # Source: firstchart/templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
        - usa
        - korea
        - india
        - maxico
        - uk

변수 선언(define variables)

Golang 변수 선언식과 유사한 형태로 Helm에서도 변수를 사용할 수 있습니다.

  1. 변수 선언 : $변수 := 값

  2. 변수 사용 : $변수

  3. 변수 재할당 : $선언된_변수 = 값

예제 코드

  • ~/values.yaml

    my:
      flag: false
  • ~/templates/deployment.yaml

    {{ $myFlag := .Values.my.flag }}
    
    {{ - if $myFlag }}
    
    {{ "Output of if" | nindent 2 }}
    
    {{ - else }}
    
    {{ "Output of else" | nindent 2 }}
    
    {{ - end }}

반복문(loop)

역시나 Golang과 유사한 형태로 반복문을 사용할 수 있습니다.
list[string] 혹은 list[object[string,string]]에 대해서 반복문을 사용할 수 있습니다.

예제 코드 1

  • ~/values.yaml

    my:
      values:
        - usa
        - india
        - uk
  • ~/templates/deployment.yaml

    {{ - range .Values.my.values }}
    countryOfDeployment:
      - {{ . | upper | quote }}
    {{ - end }}
  • OUTPUT

    countryOfDeployment
      - "USA"
      - "INDIA"
      _ "UK"

예제 코드 2

  • ~/values.yaml

    image:
      repository: nginx
      pullPolicy: IfNotPresent
      tag: ""
  • ~/templates/deployment.yaml

    {{ - range $key,$value := .Values.images }}
    countryOfDeployment:
      - {{ $key }}: {{ $value | quote }}
    {{ - end }}
  • OUTPUT

    countryOfDeployment
      - repository: "nginx"
      - pullPolicy: "IfNotPresent"
      - tag: ""

디버깅하기(debugging)

헬름 고급 명령어(Advanced Commands) # 헬름 드라이 런(helm ~ --dry-run)에서 배운 --dry-run 커맨드를 사용해서 디버깅을 할 수 있습니다.

  • helm install <RELEASE_NAME> <CHART_NAME> --dry-run

목적에 맞게 헬름 드라이 런(helm ~ --dry-run)과 헬름 탬플릿(helm template <CHART_NAME>)을 사용합시다.

핼름 탬플릿은 어떤 탬플릿이 생기는지는 볼 수 있지만 에러 탐지 측면에서는 드라이 런이 확실합니다.

핼름 겟 매니패스트

핼름 고급 명령어(Advanced Commands) # 헬름 갯(helm get)에서 배운 helm get manifest 문법에 대한 소개입니다.

해당 명령어를 입력하면 helm install이 완료되었을 때, 쿠버네티스로 보내지는 매니페스트 파일입니다. 이 파일은 Deployment, Service 등의 다양한 쿠버네티스 오브젝트들에 대한 정보가 기록되어 있습니다.

  • 만약 헬름을 사용하지 않고 kubectl 등을 사용하면 설치 및 업그레이드 동안 사용된 것과 실제로 쿠버네티스 클러스터에 있는 것이 완전히 다를 수 있습니다.

  • helm get manifest로 탬플릿 정보를 조회하고 실제로 존재하는 파일들에 대한 비교를 진행할 수 있을 수도 있을 것입니다.

핼퍼(helper)

차트 생성하기(Create Helm) # templates/_helpers.tpl에서 핼퍼(helper) 파일에 대해서 간단하게 배웠습니다.

tpl은 template의 약자입니다.
이 파일은 여러 탬플릿 파일에 걸쳐서 사용할 수 있는 탬플릿(공용 탬플릿)을 정의합니다.

예제 코드 1

아래와 같이 모든 탬플릿의 시작에 주석을 포함할 수 있습니다.

{{/*
이 Helm Chart는 이런 목적으로 만들어진 것 같습니다.
*/}}

예제 코드 2

또한 아래와 같이 함수들도 포함할 수 있습니다.

{{ - define "fhratchart.name" - }}
{{ - default.Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{ - end }}

예제 코드 3

혹은 아래와 같이 헬퍼에서 선언한 변수를 사용할 수도 있습니다.

  • 헬퍼

    {{ - define "fhratchart.mytemplate" - }}
    {{ - default .Chart.Name .Values.myValue }}
    {{ - end }}
  • ~/templates/deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
      {{ template "firstchart.mytemplate" . }}
  • OUTPUT

    apiVersion: apps/v1
    kind: Deployment
      "test"

Share article

Unchaptered