IT/DevOps

[DevOps] helm template 다루기

반응형

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/

반응형