helm과 helm chart 알아보기
helm chart 설정을 dev와 real로 분리하기 위해 검토하는데 ConfigMap 파일을 이해할수가 없어 chart template guide를 훑어보고, 나에게 필요한 내용만 뽑아서 정리했다.
빌트인 오브젝트는 사용자가 직접 생성하지 않아도 템플릿 엔진이 템플릿으로 전달해주는 오브젝트이다.
다음과 같은 빌트인 오브젝트들을 사용했다.
values.yaml 파일 및 사용자 제공 파일에서 템플릿으로 전달된 값. 기본적으로 비어있다.
차트 내 템플릿을 제외한 파일에 대해 접근할 수 있도록 하는 오브젝트이다.
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을 제공하기 때문에 생각보다 편리하다.
자세한 내용은 템플릿 함수 목록 을 참고하자.
사실 다른 내용은 대충 보면 알겠는데, 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을 사용하는 것도 괜찮은 방법이다.
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"
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
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 등에서 별도 분리된 설정파일의 값을 가져올 때 사용할 수 있다.
required 값을 지정하고, 없으면 설정한 메세지로 오류를 낸다.
value: {{ required "A valid .Values.who entry required!" .Values.who }}
위 예시에서는 .Values.who 값이 없는 경우 "A valid .Values.who entry required!" 라는 메세지로 오류를 발생시킨다.