Helm
개요
헬름은 쿠버네티스를 위한 패키지 매니저이다.
쿠버네티스를 사용하다보면 라이프사이클을 같이 하는 주제에 군더더기 리소스는 어마무시하게 많아지는 경우가 더러 있다.
거기에 각종 설정을 할 때 버전을 관리하는 것이 하나의 또 까다로운 이슈가 되곤 한다.
이럴 때 사용하는 패키지 도구가 바로 헬름이다.
CNCF의 졸업 작품 중 하나로 이미 잘 관리되고 있으니 잘 활용하는 편이 좋다.
심지어 CKA에서는 이제 헬름 활용법도 문제로 나온다.
기능
- 복잡성 관리
- 쉬운 업데이트
- 간단한 공유
- 롤백
이게 문서에서 이야기하는 기능이다.
개념
이 부분을 봐야 헬름을 어떤 식으로 쓰는지 자세히 알 수 있다.
차트
헬름 패키지.
흔히 우리가 아는 apt, yum 등의 패키지 저장소 역할을 해주는 게 바로 헬름이고, 그러한 패키지 하나하나를 헬름에서는 차트라고 부른다.
저장소
그러한 차트들이 저장되는 저장소.
이것도 레포지토리라고 부른다.
릴리즈
클러스터에 구동되는 인스턴스.
차트는 클러스터에 여러 번 설치할 수 있다.
가령 mysql 디비 차트를 클러스터에 여러 개 두고 싶을 수도 있잖냐.
이때 각 차트를 나누는 기준이 된다.
사용법
사실 내용 자체가 많지는 않아서 사용법과 실습도 한꺼번에 정리하고자 한다.
설치
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
뚝딱 설치 가능!
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
sudo apt install helm
공식 레포지토리를 패키지 저장소에 등록해서 사용할 수도 있는데, 이렇게 하면 버전 업데이트가 조금 더 용이하다.
기본 흐름
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install bitnami/mysql --generate-name
헬름 허브에 있는 레포지토리를 로컬로 가져온다.
그 후 레포지토리 안에 있는 차트를 설치한다.
설치할 때는 릴리즈 이름을 명시한다.
이때 여러 커스텀 설정을 넣을 수 있다.
간단하게는 명령줄에서 바로 --set
을 이용해 넣는 것도 가능하고, 그렇게 넣어야 할 게 많다면 아예 릴리즈를 설치할 때 적용되는 values.yaml 파일을 따로 받아서 적용하는 것도 좋다.
helm show values -- > values.yaml
이런 식으로 레포지토리 주소에서 기본 values 템플릿을 가져오면 된다.
helm install bitnami/mysql -f values.yaml
양껏 커스텀하고, 이렇게 설치 시에 인자로 넣어주면 된다.
helm uninstall mysql-1612624192
삭제할 때는 이렇게..
사실 너무 간단해서 이렇다 저렇다 할 것도 없다.
차트 만들기
다른 사람들이 만든 차트를 사용하는 것도 간편하지만, 자신이 만든 어플리케이션을 차트로 만드는 것도 중요하다.
보통 사람들은 이걸 차트를 '만다'고 표현한다.
cd를 굽다 이렇게 표현하듯..
helm create [디렉]
디렉토리가 없으면 알아서 해당 이름으로 디렉토리가 만들어지며, 안 속에 기본적인 템플릿들이 추가된다.
자세한 건 헬름 문서를 봐도 충분할 것 같다.
함수들은 알아두는 게 좋을 것 같은데, 몇가지만 살짝 정리하겠다.
흐름제어
흐름제어문들은 전부 end로 끝난다.
if는 조건 제어.
with는 스코프 재정의를 한다.
안 속 블록에서는 with로 지정된 스코프만 접근할 수 있다.
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
range는 반복문이다.
이 녀석도 with처럼 스코프 재정의가 일어난다.
화이트 스페이스
{{- ㅇㄹㅇㄹ -}}
ee: test*
괄호에 -가 붙으면 붙은 방향의 공백을 없앤다.
뒤에 붙은 녀석은 줄바꿈도 지우니 주의하자.
일반 필드 끝에 *를 붙이면 줄바꿈을 지운다.
{{ indent 2 "ee: test" }}
이런 식으로 확실한 들여쓰기를 보장할 수도 있다.
변수
myvalue: "Hello World"
{{- $relname := .Release.Name -}}
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $relname }}
{{- end }}
$를 사용해서 변수를 지정할 수 있는데, 이러면 스코프 제어에서 자유로워진다.
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
반복문을 쓸 때 특히 유용한데, 이 경우 인덱스는 말그대로 숫자값으로 들어간다.
app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
이런 식으로, 굳이 변수 이름 지정하는 줄을 추가하지 않고 바로 앞에 $만 붙여서도 전역적인 값들을 가져올 수도 있다.
템플릿
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.labels" }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
define 구문을 이용하면 아예 템플릿을 두고두고 쓸 수도 있다.
이렇게도 쓸 수는 있지만, 웬만해선 템플릿들은 _helpers.tpl
에다가 빼서 관리하자.
{{- template "mychart.labels" . }}
이때 템플릿을 사용하는 곳에서 템플릿에 스코프를 전달해야 한다.
그래서 뒤에 이런 식으로 넣어주면 된다.
{{ include "mychart.app" . | indent 4 }}
템플릿은 단순히 구문을 삽입하는 역할만 한다.
그래서 들여쓰기가 원하는대로 적용되지 않을 때가 많다.
특히 템플릿이 여러 줄일 때 그럴 것이다.
이럴 때는 include를 쓰고 뒤에 indent를 지정한다.
참고
- 공식 문서
- 기본적인 템플릿을 만들 때 참고하면 좋을 양식