혼돈의 helm chart 해독

햄도·2022년 4월 11일
1

혼돈의 helm chart 해독하기

helm과 helm chart 알아보기

helm chart 설정을 dev와 real로 분리하기 위해 검토하는데 ConfigMap 파일을 이해할수가 없어 chart template guide를 훑어보고, 나에게 필요한 내용만 뽑아서 정리했다.

Built-in Objects

빌트인 오브젝트는 사용자가 직접 생성하지 않아도 템플릿 엔진이 템플릿으로 전달해주는 오브젝트이다.
다음과 같은 빌트인 오브젝트들을 사용했다.

Values

values.yaml 파일 및 사용자 제공 파일에서 템플릿으로 전달된 값. 기본적으로 비어있다.

Files

차트 내 템플릿을 제외한 파일에 대해 접근할 수 있도록 하는 오브젝트이다.

Template Functions And Pipelines

helm은 template function이라는 기본 함수들을 제공한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ quote .Values.favorite.drink }}
  food: {{ quote .Values.favorite.food }}

위에서 {{ quote .Values.favorite.drink }} 이 부분이 template function을 사용한 부분이다. cli와 비슷하게 명령어 뒤에 인자들이 오는 구조이다.

command chaining을 위해 파이프라인도 사용할 수 있다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | quote }}
  food: {{ .Values.favorite.food | quote }}

이렇게 하면 인자를 파이프 뒤의 함수로 보낼 수 있다.
아래와 같이 여러 함수를 엮는 것도 가능하다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

60여가지의 template function을 제공하기 때문에 생각보다 편리하다.
자세한 내용은 템플릿 함수 목록 을 참고하자.

Flow Control

controlling white space

사실 다른 내용은 대충 보면 알겠는데, yaml 파일 곳곳에 있는 {{--}} 가 무엇을 의미하는지 알 수가 없어 이 문서를 뒤지기 시작했다.

{{- 는 왼쪽의 공백을, -}} 는 오른쪽의 공백을 제거하는 역할을 한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}
    mug: "true"
  {{ end }}

위 템플릿은 아래와 같이 생성된다.

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eyewitness-elk-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
    mug: "true"

mug 앞에 공백이 있는 것을 확인할 수 있다.
그러면 mug를 아래와 같이 한번 들여쓰기하면 어떻게 될까?

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}
  mug: "true"
  {{ end }}
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: telling-chimp-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

  mug: "true"

이것 역시 의도했던 모양은 아니다.
이런 상황에서 {{--}} 를 사용할 수 있다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{- if eq .Values.favorite.drink "coffee" }}
  mug: "true"
  {{- end }}

이렇게 하면 {{- if 앞의 공백(줄바꿈)과 {{- end 앞의 공백이 사라져 아래와 같이 정상적으로 나오는 것을 확인할 수 있다.

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: clunky-cat-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  mug: "true"

이 때 엉뚱한 곳에서 공백 제거를 해서 포맷을 깨뜨리지 않도록 주의해야 한다.

food: {{ .Values.favorite.food | upper | quote }}
  {{- if eq .Values.favorite.drink "coffee" -}}
  mug: "true"
  {{- end -}}

위 내용은 food: "PIZZA"mug: "true"와 같은 결과를 만든다.

또한 - 은 다른 variable들과 한 칸 띄어쓰기를 해야 공백 제거로 인식된다.
예를 들어, {{- 3 }} 은 왼쪽 공백을 제거하고 3을 출력하지만, {{-3 }} 은 -3을 의미한다.

그냥 {{ indent 2 "mug:true" }} 이렇게 indent function을 사용하는 것도 괜찮은 방법이다.

Looping with the range action

range function을 이용해 list(여기에서는 slice라고 부른다)를 순회할 수도 있다.
values.yaml 파일에 아래와 같은 내용이 정의되어 있다고 하자.

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  toppings: |-
    {{- range .Values.pizzaToppings }}
    - {{ . | title | quote }}
    {{- end }}

{{- range .Values.pizzaToppings }} 부터가 .Values.pizzaToppings라는 slice 안에 들어있는 원소들을 순회하는 부분이다.

그 아래의 {{ . | title | quote }} 는 현재 원소를 의미하며, title과 quote function에 차례대로 전달된다.

그리고 toppings: |- 에서 |- 은 multi-line string을 의미한다.
multi-line string은 ConfigMap 등에서 여러 줄의 key:value로 구성된 데이터를 가져와 data entry 하나에 넣어주는 데에 적합하다.

결과적으로 위 템플릿은 아래와 같이 생성된다.

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: edgy-dragonfly-configmap
data:
  myvalue: "Hello World"
  toppings: |-
    - "Mushrooms"
    - "Cheese"
    - "Peppers"
    - "Onions"

Variables

helm template에서는 $name 과 같은 형태로 변수를 선언할 수 있다. 이 변수는 다른 객체에 대한 참조이다.
할당은 := 연산자를 사용한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

위와 같이 제한된 scope 안에서도 scope 밖의 객체를 사용하기 위해 사용할 수 있다.
아래와 같이 반복문 안에서도 사용할 수 있다.

toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
      {{ $index }}: {{ $topping }}
    {{- end }}

위 템플릿은 아래와 같이 생성된다.

toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions

Accessing Files Inside Templates

built-in object 중 Files를 이용하여 파일 관련 작업들을 수행할 수 있다.
아래는 Get과 Glob를 이용한 예시이다.

{{ range $path, $_ :=  .Files.Glob  "**.yaml" }}
      {{ $.Files.Get $path }}
{{ end }}

Files.Glob(pattern string) 는 pattern string과 일치하는 경로의 파일들을 Files 타입으로 반환한다.
Files.Get(filename) 은 filename에 해당하는 파일의 내용을 그대로 가져온다. ConfigMap 등에서 별도 분리된 설정파일의 값을 가져올 때 사용할 수 있다.

기타

template function - required

required 값을 지정하고, 없으면 설정한 메세지로 오류를 낸다.

value: {{ required "A valid .Values.who entry required!" .Values.who }}

위 예시에서는 .Values.who 값이 없는 경우 "A valid .Values.who entry required!" 라는 메세지로 오류를 발생시킨다.

profile
developer hamdoe

0개의 댓글