안녕하세요, 오늘은 DevOps실 김용호 님이 작성해 주신 ‘Helm Chart 보다 완전 편한 Helm Operator’에 대해 알아봅니다.
쿠버네티스 클러스터를 운영하면서 서비스를 배포하다 보면 필연적으로 Helm Chart 를 이용한 배포를 하게 됩니다.
jenkins, minio, mysql 등과 같이 많은 사람들이 사용하는 서비스를 내 클러스터에서 사용하고 싶을 때, deployment, service, ingress, serviceaccount 등의 복잡한 여러 리소스들을 직접 하나 씩 설정하여 일일이 배포하는 것은 관리적인 측면에서도 굉장히 어렵습니다.
따라서 이런 문제점을 해결하고자 하나의 서비스를 패키지 형태로 묶어 배포할 수 있게 해 주는 것이 Helm Chart 입니다.
하지만 Helm Chart를 사용하려면 기본적으로 helm 이 설치되어야 하며, helm 명령어를 사용해야 합니다.
더불어 Helm Chart로 배포 시에는 디렉토리 단위로 따로 관리가 되어야 하는 단점이 있습니다.
예를 들어, 같은 서비스의 경우에도 운영용 Helm Chart, 개발용 Helm Chart, QA용 Helm Chart 등으로 나누어 관리해야 할 필요성이 생기게 됩니다. (물론 하나의 디렉토리에서 values.yaml 만 각각의 용도에 맞춰 변경 후 사용할 수도 있습니다.)
또한, helm 명령어를 사용해 배포를 해야 하는 단점이 있습니다.
이런 단점을 어느정도 해결하고, GitOps 에 맞춰 Helm Chart 를 하나의 파일로 관리하고자 나온 것이 “Helm Operator” 입니다.
(참고 : https://coffeewhale.com/kubernetes/gitops/helm/2020/05/13/helm-operator/)
쿠버네티스 클러스터 내에 “Helm Operator” 서비스를 설치하고 나면 Helm Controller 기능을 이용해 CRD(Custom Resource Definition) 인 “HelmRelease” 리소스를 사용할 수 있게 됩니다.
이렇게 되면 기본적으로 디렉토리 단위로 관리되는 Helm Chart 를 HelmRelease 라는 하나의 리소스 yaml 파일로 관리할 수 있는 장점이 있습니다. 또한 기존에 helm 명령어를 따로 공부하여 사용해야 했던 것과는 달리, kubectl 명령어를 그대로 사용하여 리소스를 조회 / 배포할 수 있습니다.
아래는 기본적인 HelmRelease 작성 방법입니다.
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
name: {배포할 HelmRelease 리소스 이름}
namespace: {배포할 namespace}
spec:
releaseName: {배포할 helm chart 의 이름}
chart:
repository: https://jupyterhub.github.io/helm-chart/
name: jupyterhub
version: 0.8.2
values:
...여기서 부터는 Helm Chart 의 values.yaml 에 있던 내용을 그대로 적음
이런 HelmRelease 리소스는 하나의 파일로 관리되기에 매우 큰 장점을 가졌으나,
아쉽게도 Helm Operator 가 쿠버네티스 1.24 클러스터까지만 지원하고 있습니다.
Helm Operator 를 제공하는 flux 회사에서
K8S 1.25 버전부터는 “fluxCD” 를 사용할 수 있도록 마이그레이션을 권장하고 있습니다.
따라서 아쉬운 부분이나
1.24 이하의 버전을 사용하신다면 Helm Operator를 사용한 쉬운 배포를 경험해 보시는 것도 좋을 것 같습니다.
감사합니다.
Written by 김 용호 / Yongho Kim
Software Engineer