안녕하세요! JustKode, 박민재입니다. 오늘은 K8S Package Manager인 Helm에 대해 알아 보도록 하겠습니다.
우리는 K8S로 서비스를 서빙하기 위해, k8s yaml 파일을 이용하여, K8S Resource (deployment
, pod
, configmap
, secret
, service
, persistent volume
등)를 관리 하게 됩니다. 하지만, 우리는 실제 서비스를 운영 하는데 다음과 같은 상황을 마주치게 됩니다.
그렇죠. K8S로 서비스를 서빙 하기 위해서는 많은 YAML 파일들을 등록 해 줘야 하는 과정들이 필요 합니다. 리소스별로 분리 되어 있는 여러 개의 YAML 파일들을 관리 하는 것은 매우 귀찮은 일입니다.
이를 위해, Helm이라는 친구가 등장 했습니다. Helm은 Kubernetes를 위한 Package Manager입니다. 여러 개의 K8S Resource를 관리 하기 위해 이들을 helm chart
라는 개념으로 묶어, public 혹은 private repo에 push 하고, helm
CLI를 통해서, helm chart
에 있는 메타 데이터를 바탕으로, 여러 개의 K8S Resource를 한 번에 K8S Cluster 내에 배포 할 수 있습니다.
Helm은 큰 세 가지의 개념을 가지고 있습니다.
여러분이 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
일단, Helm을 이용 하기 위해서는 다음이 필요 합니다.
kubectl
이 설치 되어 있어야 합니다.helm
이 설치 되어야 합니다.Helm에서 제공 해 주는 기능은 다음과 같습니다.
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를 적용 할 수 있습니다.
$ helm install -f beta_values.yaml beta_chart ./chart
$ helm install --set container.image=beta_image:1.0 ... beta_chart ./chart
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 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의 기능은 무엇이 있는지 간단하게 알아 보았습니다.