Helm이란 무엇 인가?
K8S의 Package Manager인, Helm에 대해 알아보자. 2024-03-01

Intro

안녕하세요! JustKode, 박민재입니다. 오늘은 K8S Package Manager인 Helm에 대해 알아 보도록 하겠습니다.

우리는 K8S로 서비스를 서빙하기 위해, k8s yaml 파일을 이용하여, K8S Resource (deployment, pod, configmap, secret, service, persistent volume 등)를 관리 하게 됩니다. 하지만, 우리는 실제 서비스를 운영 하는데 다음과 같은 상황을 마주치게 됩니다.

  • 여러 개의 K8S ResourceK8S Cluster에 등록 해야 하는데, 그 때 마다 직접 입력 하거나, Shell Script를 이용 해야 하는가?
  • Beta, Prod 환경을 구성하는 데 있어, 사실상 리소스의 일부 값만 다르게 사용하게 되는데, 이를 위해 똑같은 YAML File을 두개를 만들어서 관리 해야 하는가?
  • K8S에 서비스를 배포 할 시, Rollback이 필요 한 상황에는 어떻게 대응 해야 하는가?

그렇죠. K8S로 서비스를 서빙 하기 위해서는 많은 YAML 파일들을 등록 해 줘야 하는 과정들이 필요 합니다. 리소스별로 분리 되어 있는 여러 개의 YAML 파일들을 관리 하는 것은 매우 귀찮은 일입니다.

So, Use helm.

이를 위해, Helm이라는 친구가 등장 했습니다. HelmKubernetes를 위한 Package Manager입니다. 여러 개의 K8S Resource를 관리 하기 위해 이들을 helm chart 라는 개념으로 묶어, public 혹은 private repo에 push 하고, helm CLI를 통해서, helm chart에 있는 메타 데이터를 바탕으로, 여러 개의 K8S Resource를 한 번에 K8S Cluster 내에 배포 할 수 있습니다.

Helm은 큰 세 가지의 개념을 가지고 있습니다.

  • Chart: Chart는 Helm Package 입니다. Kubernetes Cluster 내에 적용할 Kubernetes Resource 정보들이 들어 가 있습니다. 어떤 Docker Image를 사용할 지, 얼마만큼의 Resource를 사용 할 지, 어떤 file을 Configmap, Secret에 등록 할 지 등의 정보를 가지고 있습니다.
  • Repository: Chart가 저장 되고, 공유 될 위치입니다. Docker Hub를 생각 하시면 편합니다. (Private 하게도, Public 하게도 운영 가능 합니다.)
  • Release: K8S Cluster에 배포 된 Chart의 Instance 입니다. 하나의 Chart여러 개의 Cluster, Namespace내에 install (Chart의 Metadata를 바탕으로 K8S Cluster에 K8S Resource를 적용 하는 것) 될 수 있는데요, install 시마다 Release가 생성 됩니다. 만약 Chart 내의 값을 변경하여 install 하였을 때 문제가 생겼다면, Helm의 기능을 이용하여 이전 Release로 Rollback 할 수도 있는 것이죠.

여러분이 helm이 설치되어 있는 상태로 helm create my_chart를 bash에 입력 한다면 다음과 같이 폴더가 생성 될 것 입니다. 개발자들은 templates 폴더 내에 k8s Resource의 Template을 작성 하고, values.yaml에 Template에 들어갈 Value들을 작성하는 형태로 Helm Chart를 사용할 수 있어요.

my_chart/
├── .helmignore   # Contains patterns to ignore when packaging Helm charts.
├── Chart.yaml    # Information about your chart
├── values.yaml   # The default values for your templates
├── charts/       # Charts that this chart depends on
└── templates/    # The template files
    └── tests/    # The test files

Feature of Helm

일단, Helm을 이용 하기 위해서는 다음이 필요 합니다.

  • Kubernetes Cluster가 구성 되어 있어야 합니다. (로컬 개발로는 minikube도 추천 드립니다.)
  • kubectl이 설치 되어 있어야 합니다.
  • (당연하게도) helm설치 되어야 합니다.

Helm에서 제공 해 주는 기능은 다음과 같습니다.

Template Engine

Helm에서는 Template Engine을 제공 합니다. 만약, 비슷한 설정을 공유하는 여러 개의 어플리케이션이 있다고 가정 하겠습니다. (백엔드 분들은 Microservice를, 데이터 엔지니어 분들은 Streaming Application을 상상해 보세요.)

예를 들어, 우리가 가동 하려고 하는 어떤 어플리케이션은 Beta, Prod 환경에서 동일한 로직으로 동작 하는 대신, 바라보는 DBMS 설정, Resource 설정이 다르다고 가정 하겠습니다. Helm이 없다면, Beta용 Resource YAML 파일과, Prod용 Resource용 YAML 파일, 두 벌을 만들어야 겠군요.

하지만, Helm은 Resource에 대해서 Template만 잘 만들어 놓는 다면, Value만 다르게 적용하여 K8S Resource를 배포 할 수 있습니다.

예를 들어, 다음과 같은 pod.yaml 파일이 있다고 가정 하겠습니다.

apiVersion: v1
kind: Pod
metadata:
  name: {{ .Values.name }}
spec:
  containers:
  - name: {{ .Values.container.name }}
	image: {{ .Values.container.image }}
	ports:
	  - containerPort: {{ .Values.container.port }}

만약 Beta 환경에는 Beta에 맞는 Resource를, Prod 환경에는 Prod에 맞는 Resource를 사용 하고 싶다면, Beta와 Prod별의 Value가 들어가 있는 YAML 파일을 적용하거나, CLI 상에서 Value를 적용 할 수 있습니다.

  • yaml에 Value를 적용하는 방식
$ helm install -f beta_values.yaml beta_chart ./chart
  • CLI에 Value를 적용하는 방식
$ helm install --set container.image=beta_image:1.0 ... beta_chart ./chart

유사한 K8S Resource에 대해서, 세부 Value만 다르게 여러 개의 Resource에 적용 했을 때

Release Managing

Helm은 Release Manging이라는 기능을 가지고 있는데요, 이를 통해서, K8S Cluster 내에 설치 되어 있는 Chart를 쉽게 Upgrade하고, Rollback을 수행 할 수 있습니다.

우선 install 된 Chart에 대해서 설정된 Value나 Template의 변화가 있을 경우, helm upgrade를 통해서 이를 K8S Cluster 내의 Helm Release에 적용 할 수 있습니다.

$ helm install -f beta_values.yaml beta_chart ./chart
$ helm upgrade --install -f beta_values.yaml beta_chart ./chart  # Release Name이 존재 하면 Upgrade, 없으면 Install

또한, Upgrade시 문제가 발생했다면, 빠르게 Rollback 하는 기능 또한 제공 해 주고 있습니다. helm history를 통해 Release를 확인 하고, helm rollback을 통해서 원하는 Revision으로 Rollback을 수행 할 수 있습니다.

$ helm history my_chart
REVISION	UPDATED                 	STATUS    	CHART        	APP VERSION	DESCRIPTION
1      	Mon May  9 00:00:00 2023	superseded	my_chart	2.2.1      	Upgrade complete
2      	Mon May  10 00:00:00 2023	superseded	my_chart	2.2.1      	Upgrade complete
3      	Mon May  11 00:00:00 2023	superseded	my_chart

$ helm rollback my_chart 2

Helm Repository

다른 사람들이 개발한 Helm Chart를 쉽게 나의 K8S Cluster에 적용 할 수 있습니다. 대표적으로 Apache Airflow에서는 Airflow를 K8S Cluster에 손쉽게 설치 할 수 있도록 Helm Chart를 제공 하고 있습니다.

$ helm repo add apache-airflow https://airflow.apache.org
$ helm upgrade --install airflow apache-airflow/airflow --namespace airflow --create-namespace

이렇게 Helm은 무엇이고, 왜 쓰는지, 그리고 Helm의 기능은 무엇이 있는지 간단하게 알아 보았습니다.

Reference