Kubernetes를 이제 막 배우거나 활용하기 시작하신 분이라면, 애플리케이션을 Kubernetes 클러스터에 배포하는 yaml 파일(Manifest라고도 합니다)들을 관리하는 것이 여간 힘든 일이 아님을 느끼실 겁니다.

웹 서비스 하나를 Kubernetes 클러스터에 배포한다고 하더라도, Deployment부터 Service, Configmap, Secret 등 서비스 운영에 필요한 갖가지 리소스들의 Manifest 파일을 만들고 관리하게 되니 부담감도 커지는데요.

거기다 이미 만들어진 Manifest 파일을 누군가로부터 전달받거나, 누군가에게 공유해줘야 한다면… 올바른 Manifest가 공유되었는지 확인하는 작업만해도 손이 많이 가겠죠.

이런 문제점을 해결하기 위해 나온 것이 바로, Helm입니다.

Helm는 릴리즈 후 금방 인기를 얻어 현재 널리 사용 중인 툴인데요. 이번 소식지에서 함께 알아보겠습니다.


Manifest 파일들을 템플릿으로 관리하는 Helm chart

Helm은 Kubernetes 배포를 위한 패키지 매니저 툴입니다.

Helm은 Kubernetes에 배포되는 프로젝트의 각 리소스의 Manifest를 Command-Line 환경에서 생성하거나 공유, 버전 관리까지 해주는 Kubernetes 패키지 매니저 툴입니다. 

Helm의 주요 컨셉은 Chart와 ConfigRelease인데요.

  • Chart는 Kubernetes 리소스 배포에 필요한 Manifest 템플릿 등의 소스코드의 모음을 의미합니다.
  • Config는 Kubernetes 리소스 배포에 필요한 Configuration 값들이 명시되는 파일을 의미합니다. Helm으로 Chart가 배포될 때 Config의 값이 Chart와 결합됩니다.
  • Release는 Helm의 배포 단위입니다. Chart와 Config가 결합되어 Kubernetes 클러스터상에 배포 및 실행되는 상태를 하나의 Release라고 봅니다.

Chart는 리소스 배포에 필요한 파일들이 포함된 디렉토리 개념이며, Chart에 포함되는 파일들은 아래와 같습니다.

  • Chart.yaml: Chart에 대한 정보를 명시하는 yaml 파일
  • values.yaml: Chart와 결합되는 기본 Configuration 값이 명시된 yaml 파일
  • templates: values.yaml의 값들과 결합되는 Kubernetes 리소스 Manifest 템플릿이 위치하는 폴더

좀 더 명확하고 쉬운 설명을 위해, fluentd라는 오픈소스 프로젝트에서 제공하는 fluentd 배포용 공식 Helm Chart를 예시로 설명해보겠습니다. fluentd는 로그 데이터를 수집해주는 툴인데, 가볍게 사용하기 좋아서 이번 실습의 예시로 활용했습니다.

fluentd 공식 Github에서 제공하는 Helm chart입니다. (https://github.com/fluent/helm-charts/tree/main/charts/fluentd)

위 이미지를 보면 fluentd의 Chart 디렉토리 내에도 위에서 설명한 Chart.yaml과 values.yamltemplates 폴더가 포함되어 있음을 알 수 있는데요.

Helm이 무엇이고 어떻게 구성되는지 알았으니, 이제 Helm으로 어떻게 Kubernetes에 리소스를 배포할 수 있는지 알아볼까요?


CLI 환경에서 Helm Chart 배포하기

Helm은 Kubernetes 클러스터에 원하는 프로젝트를 쉽게 배포해주는 툴이기 때문에, 실습을 위해선 Kubernetes 클러스터가 필요합니다.

(참고로 저는 로컬에서 테스트하기 위해 minikube라는 툴로 가상 Kuberntes 환경을 구축했는데요. minikube에 대해서 궁금하신 분들이 계시다면 추후 아티클에서 다뤄보도록 하겠습니다.😀 minikube 설치와 사용법에 대해 다룬 아티클을 작성했습니다! - 미래의 Aiden)

또한 Helm 역시 설치를 해야 하는데요. 운영체제별 자세한 설치 방법은 공식 사이트 링크에서 확인하실 수 있습니다.

로컬에 실습 환경 구축을 마친 뒤, 위에서 예시로 든 fluentd의 Helm Chart를 실제로 로컬 Kubernetes 클러스터에 배포해보겠습니다.

가장 먼저 fluentd의 Helm Chart가 저장된 레파지토리를 로컬 환경에 추가합니다. CLI에서 helm repo add 명령어를 사용하면 아래 이미지처럼 원하는 레파지토리를 추가할 수 있습니다.

fluent의 Helm chart 레파지토리가 추가되었다고 표시됩니다.

그 다음 helm search repo 명령어로 추가한 레파지토리에 포함된 Chart를 아래와 같이 확인할 수 있습니다.

우리가 추가한 fluent 레파지토리엔 3가지 Helm chart가 포함되어 있음을 알 수 있습니다.

우리가 추가한 fluent 레파지토리엔 3가지 Helm chart가 포함되어 있음을 알 수 있습니다.

위 이미지를 보면 fluent라는 레파지토리 안에 여러 Helm Chart가 포함되어 있는 구조인데요. 그 중 우리가 사용할 fluentd의 Chart를 아래와 같이 helm install 명령어로 Kubernetes 클러스터에 배포해보겠습니다. 참고로 helm install 명령어가 받는 인자는 {배포하는 Release의 이름}과 {배포 대상 Helm chart의 이름}입니다.

helm install로 fluentd가 설치되었고, 해당 Release의 정보가 표시됩니다.

위와 같이 Helm Release의 정보가 표시되고, 상태(STATUS)가 deployed라면 Helm Chart가 배포되었다는 뜻인데요. helm list 명령어을 사용하면 현재 Helm으로 배포된 모든 Release를 확인할 수 있습니다.

현재 제가 Helm으로 배포한 Release는 fluentd입니다.

물론 우린 지금까지 Helm으로 Kubernetes에 fluentd를 배포한 것이기 때문에, 아래와 같이 kubectl로 실제 배포된 fluentd의 pod도 확인 가능합니다.

Helm으로 배포한 fluentd의 Pod가 잘 동작하는 것을 알 수 있습니다.

만약 Helm으로 배포한 프로젝트(Helm Release)를 제거하고 싶다면, helm uninstall 명령어를 사용합니다.

helm uninstall 명령어를 사용하면 helm release를 간편하게 제거할 수 있습니다.


마무리

지금까지 Helm이 무엇인지 알아보고, 어떻게 사용하는지 fluentd라는 오픈소스를 함께 활용해서 간단한 예제로 알아봤습니다.

Helm에 대해 알아가는 중이시거나 궁금하신 분들도 많으실 거란 생각이 들어 이번 아티클에서 알아봤는데요.

혹시 이번 내용 관련해서 더 궁금한 점이 있으시다면 아래 피드백 페이지에 의견 남겨주세요.

그럼, 다음 아티클에서 더욱 유익하고 흥미로운 내용으로 찾아오겠습니다.

감사합니다😸


참고 자료