Helm

개요

Pasted image 20241017110839.png
헬름은 쿠버네티스를 위한 패키지 매니저이다.
쿠버네티스를 사용하다보면 라이프사이클을 같이 하는 주제에 군더더기 리소스는 어마무시하게 많아지는 경우가 더러 있다.
거기에 각종 설정을 할 때 버전을 관리하는 것이 하나의 또 까다로운 이슈가 되곤 한다.
이럴 때 사용하는 패키지 도구가 바로 헬름이다.

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를 지정한다.

참고