내 차트 만들기2

함수와 파이프라인, 제어 흐름, 여러가지 함수들, 지역변수



1. 함수와 파이프라인


Function and Pipeline for Helm.

1-1) Chart Template 생성

helm create mychart

templates 폴더 안에 불필요한 파일 삭제

rm -rf deployment.yaml hpa.yaml ingress.yaml serviceaccount.yaml service.yaml tests

1-2) test-values.yaml에 해당 속성 추가

func:
  enabled: true
  
pipe:
  log: info

1-3) configmap 추가

vi 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


2. 흐름 제어


Controller Flow with if, with, range for Helm.

2-1) test-values.yaml에 해당 속성 추가

dev:
  env: dev
  log: info

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

If 문에서 False 인 조건들

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

If 문에 쓰이는 함수들

  and(&&), or(||), ne(!=), not(!), eq(=), ge(>=), gt(>), le(<=), lt(<), default, empty 

2-2) IF 사용

vi 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 }}

2-3) WITH 사용

vi 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 }}

2-4) RANGE 사용

vi 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 }}


3. 여러가지 함수들


Functions1 for Helm.
Functions2 for Helm.

3-1) test-values.yaml에 해당 속성 추가

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

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

3-2) Functions 사용 configmap 추가

vi 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" }}


4. 지역변수


Local values with WITH for Helm.

4-1) with 내부에서 사용할 경우

vi 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 }}



Local values with RANGE for Helm.

4-2) range와 함께 사용

vi 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 }}


Referenece


Helm