헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.
가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.
개요
직전에 Unchaptered (Blog) | 차트 생성하기(Create Helm)를 배웠습니다. 이번 챕터에서는 헬름 차트의 고급 문법 및 사례들을 자세하게 파헤쳐 보겠습니다.
구성 요소
전체 구성은 아래의 4가지로 구성되어 있습니다.
Template Actions
Conditions
Loops
Variables
본문
탬플릿 액션(template action)
헬름에서는 템플릿 액션 문법
{{}}
을 사용해서 핼름의 고유한 문법을 부를 수 있습니다.이 안에서 하이픈
-
을 사용하는 경우에는 탬플릿 액션 외부에 있는 불필요한 공백(=스페이스바)를 제거하는 기능을 합니다.
예제 1
입력
{{ "hello" }} , {{ "world" }}
출력
"hello , world"
예제 2
입력
{{ "hello" - }} , {{ - "world" }}
출력
"hello,world"
탬플릿 파일만들기
apiVersion: apps/v1 kind: Deployment {{"Helm Templating is" -}} , {{- "Cool"}}
핼름 탬플릿 실행하기
명령어
helm template <CHART_NAME>
예제
helm template firstchart
예제 출력값
# Source: firstchart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment Helm Templating is,Cool
탬플릿 인포메이션(template information)
탬플릿 파일(template/*.yaml)에서 사용 가능한 모든 정보의 포함을 점
.
으로 표시합니다.
즉, 핼름 차트에서 많이 보이는.Values.~
은 인포메이션에 포함된 프로퍼티 중에 Values에 대한 엑세스입니다.
접속 가능한 탬플릿 인포메이션 유형은 다음과 같습니다.
인포메이션 종류 | 인포메이션 예시 |
---|---|
.Values | .Values |
.Chart | .Chart,Name .Chart.Version .Chart.AppVersion .Chart.Annotions |
.Release | .Release.Name .Release.NameSpace .Release.IsInstall .Release.IsUpgrade .Release.Service |
.Template | .Template.Name .Template.BasePath |
아래 예제에서는 template/*.yaml 파일에 사용하고자 하는 탬플릿 인포메이션은 작성하고 핼름 탬플릿 기능을 활용하여 조회하고 있습니다.
[예시]
values.yaml에 아래 값 추가
my: custom: data: "test"
templates/deployment.yaml에서 탬플릿 인포메이션 접근
apiVersion: apps/v1 kind: Deployment {{ .Values.my.custom.data }}
헬름 템플릿 실행
입력값
helm template firstchrat
출력값
# Source: firstchart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment test
파이프라인 문법
파이프라인 문법은 Ubuntu를 포함한 광범위한 운영체제에서 쓰이는 CLI 레벨의 문법입니다.
아래와 같이 사용할 수 있습니다.
{{ - include “firstchart.selectorLables” . | nindent 6 }}
구체적으로 templates/deployment.yaml에 아래 파일을 추가해서 결과를 보겠습니다.
명령어 | 설명 |
---|---|
default | 파이프라인 왼쪽의 표준 출력값이 null이면 “testdefault”를 할당 |
upper | 모든 문자열을 대문자로 교체 |
quote | 비문자열을 문자열로 포함 |
values.yaml에 아래 값 추가
my: custom: data: "test"
templates/deployment.yaml에서 탬플릿 인포메이션 접근
apiVersion: apps/v1 kind: Deployment {{ .Values.my.custom.data | default "testdefault" | upper | quote }}
헬름 템플릿 실행
입력값
helm template firstchrat
출력값
# Source: firstchart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment "test" "TEST"
함수(function)
함수(function)은 헬름 액션 안에서 복잡한 작업을 진행하기 위해서 지원되는 기능이다.
일반적으로 다음과 같은 구성을 가진다. 여기서는 윗(with) 문법이 동시에 쓰였다.{{ - with <VALUES> }} {{ -toYaml . | nident 8 }} {{ - end }}
지원되고 있는 함수 종류는 Helm (Docs) | Template Function List에서 확인할 수 있다.
명령어 | 예시 | 설명어 |
---|---|---|
nindent <NUMBER> | nindent 2 | 2칸 들여쓰기 |
toYaml . | {{ - with .Values.podAnnotations }} | .Values.podAnnotions에는 json 객체 {} 가 들어가있음 |
조건문 로직(conditional logic)
조건문 로직(conditional logic)은 특정한 액션(Action) 블럭을 조건부로 실행하고 싶을 때 주로 사용됩니다.
유형 | 예시 |
---|---|
if 문 | {{- if <BOOLEAN 값> }} {{ <ACTIONS> }} {{- end}} |
if else 문 | {{- if <BOOLEAN 값> }} {{ <ACTIONS> }} {{- else }} {{ <ACTIONS> }} {{- end}} |
if not 문 | {{- if not <BOOLEAN 값> }} {{ <ACTIONS> }} {{- end}} |
if and 문 | {{- if and <BOOLEAN 값> (<BOOLEAN 값>) }} {{ <ACTIONS> }} {{- end}} {{- if and <BOOLEAN 값> (not <BOOLEAN 값>) }} {{ <ACTIONS> }} {{- end}} |
values.yaml에 값 추가하기
my: flag: true
templates/deployment.yaml에서 탬플릿 인포메이션 접근
apiVersion: apps/v1 kind: Deployment {{- if .Values.my.flag }} {{"Output of if" | nindent 2}} {{- end}}
헬름 템플릿 실행
입력값
helm template firstchrat
출력값
# Source: firstchart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment Output of if
윗(with)
2024-05-09 추가
윗(with) 문법을 사용하면 코드를 조금 더 간결하게 작성 및 관리할 수 있습니다.
아래 사례를 보면 바로 그 이유를 이해할 수 있습니다.{{- with .Values.config }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .name }} data: username: {{ .username }} password: {{ .password }} {{- end }}
윗(with) 문법을 사용하여 동적으로 블럭을 생성하거나 생성하지 않을 수 있습니다.
{{- with .Values.my.values}} countriesOfDeployment: {{- toYaml . | nindent 2 }} {{- else }} # Empty {{- end}}
values.yaml에 값 추가하기
my: values: - usa - korea - india - maxico - uk
templates/deployment.yaml에서 탬플릿 인포메이션 접근
apiVersion: apps/v1 kind: Deployment {{- with .Values.my.values }} {{- toYaml . | nindent 2 }} {{- end }}
헬름 템플릿 실행
입력값
helm template firstchrat
출력값
# Source: firstchart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment - usa - korea - india - maxico - uk
변수 선언(define variables)
Golang 변수 선언식과 유사한 형태로 Helm에서도 변수를 사용할 수 있습니다.
변수 선언 :
$변수 := 값
변수 사용 :
$변수
변수 재할당 :
$선언된_변수 = 값
예제 코드
~/values.yaml
my: flag: false
~/templates/deployment.yaml
{{ $myFlag := .Values.my.flag }} {{ - if $myFlag }} {{ "Output of if" | nindent 2 }} {{ - else }} {{ "Output of else" | nindent 2 }} {{ - end }}
반복문(loop)
역시나 Golang과 유사한 형태로 반복문을 사용할 수 있습니다.
list[string] 혹은 list[object[string,string]]에 대해서 반복문을 사용할 수 있습니다.
예제 코드 1
~/values.yaml
my: values: - usa - india - uk
~/templates/deployment.yaml
{{ - range .Values.my.values }} countryOfDeployment: - {{ . | upper | quote }} {{ - end }}
OUTPUT
countryOfDeployment - "USA" - "INDIA" _ "UK"
예제 코드 2
~/values.yaml
image: repository: nginx pullPolicy: IfNotPresent tag: ""
~/templates/deployment.yaml
{{ - range $key,$value := .Values.images }} countryOfDeployment: - {{ $key }}: {{ $value | quote }} {{ - end }}
OUTPUT
countryOfDeployment - repository: "nginx" - pullPolicy: "IfNotPresent" - tag: ""
디버깅하기(debugging)
헬름 고급 명령어(Advanced Commands) # 헬름 드라이 런(helm ~ --dry-run)에서 배운 --dry-run 커맨드를 사용해서 디버깅을 할 수 있습니다.
helm install <RELEASE_NAME> <CHART_NAME> --dry-run
목적에 맞게 헬름 드라이 런(helm ~ --dry-run)과 헬름 탬플릿(helm template <CHART_NAME>)을 사용합시다.
핼름 탬플릿은 어떤 탬플릿이 생기는지는 볼 수 있지만 에러 탐지 측면에서는 드라이 런이 확실합니다.
핼름 겟 매니패스트
핼름 고급 명령어(Advanced Commands) # 헬름 갯(helm get)에서 배운 helm get manifest 문법에 대한 소개입니다.
해당 명령어를 입력하면 helm install이 완료되었을 때, 쿠버네티스로 보내지는 매니페스트 파일입니다. 이 파일은 Deployment, Service 등의 다양한 쿠버네티스 오브젝트들에 대한 정보가 기록되어 있습니다.
만약 헬름을 사용하지 않고 kubectl 등을 사용하면 설치 및 업그레이드 동안 사용된 것과 실제로 쿠버네티스 클러스터에 있는 것이 완전히 다를 수 있습니다.
helm get manifest로 탬플릿 정보를 조회하고 실제로 존재하는 파일들에 대한 비교를 진행할 수 있을 수도 있을 것입니다.
핼퍼(helper)
차트 생성하기(Create Helm) # templates/_helpers.tpl에서 핼퍼(helper) 파일에 대해서 간단하게 배웠습니다.
tpl은 template의 약자입니다.
이 파일은 여러 탬플릿 파일에 걸쳐서 사용할 수 있는 탬플릿(공용 탬플릿)을 정의합니다.
예제 코드 1
아래와 같이 모든 탬플릿의 시작에 주석을 포함할 수 있습니다.
{{/*
이 Helm Chart는 이런 목적으로 만들어진 것 같습니다.
*/}}
예제 코드 2
또한 아래와 같이 함수들도 포함할 수 있습니다.
{{ - define "fhratchart.name" - }}
{{ - default.Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{ - end }}
예제 코드 3
혹은 아래와 같이 헬퍼에서 선언한 변수를 사용할 수도 있습니다.
헬퍼
{{ - define "fhratchart.mytemplate" - }} {{ - default .Chart.Name .Values.myValue }} {{ - end }}
~/templates/deployment.yaml
apiVersion: apps/v1 kind: Deployment {{ template "firstchart.mytemplate" . }}
OUTPUT
apiVersion: apps/v1 kind: Deployment "test"