IT/DevOps
[DevOps] helm template 다루기
kimdragon
2022. 9. 8. 08:44
반응형
Intro
kubernetes를 운영하는 엔지니어들은 helm 사용이 필수불가피 합니다. 일부 helm template을 커스터마이징하여 사용하게되는 경우도 빈번하게 됩니다. 따라서 helm template을 잘 다룰 수 있어야하겠죠. hlem은 리소스파일들을 템플릿화하기위해 go template을 사용합니다. 오늘은 go template으로 구성되어있는 helm에서 가장 많이 사용하는 문법에 대해 정리해보도록 하겠습니다.
공백(whitespace) 제거
{{-
: 줄바꿈 포함한 왼쪽 공백 모두 제거
-}}
: 줄바꿈 포함한 오른쪽 공백 모두 제거
whitespace 제거 구문 사용하지 않은 렌더링 예시
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 }}
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: "true"
whitespace 제거 구문 사용한 렌더링 예시
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{- if eq .Values.favorite.drink "coffee" }}
mug: "true"
{{- end }}
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: "true"
조건문 - IF
오퍼레이션 : eq, ne, lt, gt, and, or, not
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 }}
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: "true"
조건이 여러개일 경우 괄호 ()
를 사용
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{ if eq (.Values.favorite.drink "coffee")(.Values.favorite.drink "donut") }}
mug: "true"
{{ end }}
반복문 - Range
for문과 비슷하며 list, tuple, map, dict을 반복하는 데 사용 가능
- list
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
toppings: |-
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"
- dict, map
toppings: |-
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
toppings: |-
0: mushrooms
1: cheese
2: peppers
3: onions
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
Scope
.Values.image.name
을 참조 할때with
이용해 해당 범위안에서는 특정 범위로 스코프를 변경 가능
{{ with .Values.image }} // .Values.image 로 스코프 지정
{{ .name }} // .Values.image.name이 아닌 .name 으로 참조 가능
{{ end }}
- 만약 스코프 내부에서 외부 값을 참조하고 싶다면, 스코프 외부에서 변수 선언하여 참조해야 함.
{{ $temp := .Release.Name }}
{{ with .Values.image }}
{{ $temp }} // 외부 스코프 값 참조
{{ end }}
Define
_
로 시작하는 파일 또는 template 에서 특정 항목들을 정의할 수 있다.- 전역으로 선언되어,여러 template 에서
include
해 참조 가능
{{ define "MY.NAME" }} // 외부에서 "MY.NAME" 으로 참조하므로, 고유한 prefix 사용할 것
# body of template here
{{ end }}
Template
define
으로 선언한 'mychart.labels' 을 추가template
은 pipeline(”|”)으로 함수 호출 안되기 때문에 indent 에 유의 (정의하는 쪽에서 indent 를 설정, 사용하는 측은 변경 어려움)template
보다는include
를 권장함template
두 번째 인자(.
) 는 "mychart.labels" 내부에서의 스코프 지정
{{ template "mychart.labels" . }}
Include
template
과 유사 하나 pipeline 이용해 다중으로 함수 호출 가능하여, 사용측에서 indent 설정 가능include
두 번째 인자(.
) 는 "mychart.labels" 내부에서의 스코프 지정
{{ include "mychart.labels" . | nindent 4 }}
지원하는 함수들
주석
{{/* a comment */}}
quote
문자열 데이터를 사용할 때에는 문자열로 그대로 두기보다 쌍따옴표로 값을 묶는 것이 안전함
name: {{ .Values.MyName | quote }}
하지만 integer는 쿠버네티스에서 파싱에러가 발생할 수 있으니 쌍따옴표를 사용하지 않는것을 권고함
port: {{ .Values.Port }}
toYaml
.Values.image
값을 yaml 형식으로 변경toJson
도 가능함
{{ toYaml .Values.image }}
default
- 'temp' 디폴트값 설정
{{ default 'temp' }}
nindent
- indent 4 로 설정
{{ nindent 4 }}
pipeline
- 함수를 연속적으로 사용해야 하는 경우
|
이용
{{ .Values.image.name | upper | default 'temp' | nindent 4 }}
repeat
- .Values.image.name 값을 3번 반복해 추가
{{ .Values.image.name | repeat 3 }}
참고 URL
https://helm.sh/ko/docs/chart_template_guide/getting_started/
반응형