Helm Chart - 함수 & 파이프라인

함수와 파이프라인

차트 Template 생성

helm create mychart

test-vsalues.yaml

func:
  enabled: true
  
pipe:
  log: info

ConfigMap 추가

vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: function-and-pipeline
data:
  Function_Argument:
    quote: {{ quote .Values.func.enabled }}     # quote(arg1)
    include: {{ include "mychart.name" . }}  # include(arg1, arg2)

  Function_Quote:
    function_case1: {{ .Values.func.enabled }}
    function_case2: {{ quote .Values.func.enabled }}
    function_case3: "{{ .Values.func.enabled }}"

  Pipeline:
    upper: {{ .Values.pipe.log | upper }}
    upper.repeat: {{ .Values.pipe.log | upper | repeat 2 }}
    upper.repeat.quote: {{ .Values.pipe.log | upper | repeat 2 | quote }}

Template 명령어

helm template mychart ./../ -f ./../test-values.yaml

data 출력 결과

data:
  Function_Argument:
    quote: "true"     # quote(arg1)
    include: mychart  # include(arg1, arg2)

  Function_Quote:
    function_case1: true
    function_case2: "true"
    function_case3: "true"

  Pipeline:
    upper: INFO
    upper.repeat: INFOINFO
    upper.repeat.quote: "INFOINFO"

흐름 제어

test-values.yaml

dev:
  env: dev
  log: info

qa:
  env: qa
  log: info
  
prod:
  env: prod
  log: 
  
data:
  - a
  - b
  - c

if

if문 false 조건

Number:0
String: ""
List: []
Object: {}
Boolean: false
Null

if문 함수

함수의미
and&&
or||
ne!=
not!
eq=
ge>=
gt>
le<=
lt<
defaultdefault
emptyempty

cm2-2.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: flow-if
data:
  dev:
    env: {{ .Values.dev.env }}
    {{- if eq .Values.dev.env "dev" }}
    log: debug
    {{- else if .Values.dev.log }}
    log: {{ .Values.dev.log }}
    {{- else }}
    log: error
    {{ end }}

  qa:
    env: {{ .Values.qa.env }}
    {{- if eq .Values.qa.env "dev" }}
    log: debug
    {{- else if .Values.qa.log }}
    log: {{ .Values.qa.log }}
    {{- else }}
    log: error
    {{- end }}

  prod:
    env: {{ .Values.prod.env }}
    {{ if eq .Values.prod.env "dev" }}
    log: debug
    {{ else if .Values.prod.log }}
    log: {{ .Values.prod.log }}
    {{ else }}
    log: error
    {{ end }}

data 출력 결과

data:
  dev:
    env: dev
    log: debug

  qa:
    env: qa
    log: info

  prod:
    env: prod

    log: error
  • prod에서 공백이 생긴 이유는 위 yaml 파일에서 괄호 바로 뒤에 하이픈(-) 입력을 안해줬기 때문

With

cm2-3.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: flow-with
data:
  dev:
  {{- with .Values.dev }}
    env: {{ .env }}
    log: {{ .log }}
  {{- end }}

  qa:
  {{- with .Values.qa }}
    env: {{ .env }}
    log: {{ .log }}
  {{- end }}
  
  prod:
  {{- with .Values.prod }}
    env: {{ .env }}
    log: {{ .log }}
  {{- end }}

data 출력 결과

data:
  dev:
    env: dev
    log: info

  qa:
    env: qa
    log: info

  prod:
    env: prod
    log:

Range

cm2-4.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: flow-range
data:
  yaml:
  {{- .Values.data | toYaml | nindent 2 }}

  range:
  {{- range .Values.data }}
  - {{ . }}
  {{- end }}

  range-quote:
  {{- range .Values.data }}
  - {{ . | quote }}
  {{- end }}

  range-upper-quote:
  {{- range .Values.data }}
  - {{ . | upper | quote }}
  {{- end }}

data 출력 결과

data:
  yaml:
  - a
  - b
  - c

  range:
  - a
  - b
  - c

  range-quote:
  - "a"
  - "b"
  - "c"

  range-upper-quote:
  - "A"
  - "B"
  - "C"

여러 함수

  • helm의 템플릿 파일은 Golang 문법을 따름

test-values.yaml

print:
  a: "1"
  b: "2"

ternary: 
  case1: true
  case2: false
  
default:
  nil: 
  list: []
  object: {}
  number: 0
  string: ""
  boolean: false

cm3.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: string-func
data:
  print:
    print:  {{ print "Hard Cording" }}
    printf: {{ printf "%s-%s" .Values.print.a .Values.print.b }}

  ternary:
    case1: {{ .Values.ternary.case1 | ternary "1" "2" }}
    case2: {{ .Values.ternary.case2 | ternary "1" "2" }}

  indent:
    indent: 
{{ .Values.data | toYaml | indent 4 }}
    nindent1: {{ .Values.data | toYaml | nindent 4 }}
    nindent2:
    {{- .Values.data | toYaml | nindent 4 }}
          
  default: # Number:0, String: "", List: [], Object: {}, Boolean: false, Null
    nil:     {{ .Values.default.nil     | default "default" }}
    list:    {{ .Values.default.list    | default (list "default1" "default2") | toYaml | nindent 6}}
    object:  {{ .Values.default.object  | default "default:1" | toYaml | nindent 6 }}
    number:  {{ .Values.default.number  | default 1 }}
    string:  {{ .Values.default.string  | default "default" }}
    boolean: {{ .Values.default.boolean | default true }}

  trim:
    trim:       {{ trim "  hello " }}
    trimPrefix: {{ trimPrefix "-" "-hello" }}
    trimSuffix: {{ trimSuffix "-" "hello-" }}

  random:
    randAlphaNum: {{ randAlphaNum 5 }}   # 0-9a-zA-Z
    randAlpha:    {{ randAlpha 5 }}      # a-zA-Z
    randNumeric:  {{ randNumeric 5 }}    # 0-9
    randAscii:    {{ randAscii 5 }}      # ASCII characters

  trunc:    {{ trunc 5 "hello world" }}
  replace:  {{ "hello world" | replace " " "-" }}
  contains: {{ contains "cat" "catch" }}
  b64enc:   {{ b64enc "hello" }}

data 출력 결과

data:
  print:
    print:  Hard Cording
    printf: 1-2

  ternary:
    case1: 1
    case2: 2

  indent:
    indent:
    - a
    - b
    - c
    nindent1:
    - a
    - b
    - c
    nindent2:
    - a
    - b
    - c

  default: # Number:0, String: "", List: [], Object: {}, Boolean: false, Null
    nil:     default
    list:
      - default1
      - default2
    object:
      default:1
    number:  1
    string:  default
    boolean: true

  trim:
    trim:       hello
    trimPrefix: hello
    trimSuffix: hello

  random:
    randAlphaNum: Bfqxq   # 0-9a-zA-Z
    randAlpha:    MWCKm      # a-zA-Z
    randNumeric:  79598    # 0-9
    randAscii:    bsMqA      # ASCII characters

  trunc:    hello
  replace:  hello-world
  contains: true
  b64enc:   aGVsbG8=

지역변수

cm4-1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: variables-with
data:
  dev:
  {{- $relname := .Release.Name -}}
  {{- with .Values.dev }}
    env: {{ .env }}
    release: {{ $relname }}
    log: {{ .log }}
  {{- end }}
  • relname 지역변수에 Release.Name을 저장하는데 변수를 지정하지 않고 다음과 같이 작성하면 에러 발생
data:
  dev:
  {{- with .Values.dev }}
    release: {{ .Release.Name }}
  {{- end }}
  • 이유는 with를 쓰게 되면 with 안에서만 찾기 때문에 Release.Name을 찾을 수 없음

data 출력 결과

data:
  dev:
    env: dev
    release: mychart
    log: info

Range

cm4-2.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: variables-range
data:
  # for (int i ; i=list.length ; i++) { printf "i : list[i]" };
  index:
  {{- range $index, $value := .Values.data }}
    {{ $index }}: {{ $value }}
  {{- end }}

  # for (Map<key, value> map : list) { printf "map.key() : map.value()" };
  key-value:
  {{- range $key, $value := .Values.dev }}
    {{ $key }}: {{ $value | quote }}
  {{- end }}

data 출력 결과

data:
  # for (int i ; i=list.length ; i++) { printf "i : list[i]" };
  index:
    0: a
    1: b
    2: c

  # for (Map<key, value> map : list) { printf "map.key() : map.value()" };
  key-value:
    env: "dev"
    log: "info"

[참조]: 인프런 - 대세는 쿠버네티스 [Helm편]

끝!