이번 포스팅에서는 GitLab의 Helm 패키지 레지스트리에 대해서 설명하고자 합니다. Kubernetes는 리눅스재단 산하의 CNCF에서 제공하고 있는 오픈소스 기반의 컨테이너 오케스트레이션 도구로써, 현재 다양한 오케스트레이션 도구 중 가장 높은 점유율과 인기를 자랑하고 있습니다. 그에 따라 GitLab에서는 애플리케이션 배포 플랫폼으로 Kubernetes를 연동하여 지원하고 있습니다. Kubernetes의 패키지 매니저 역할을 하는 Helm과 GitLab이 Helm 차트 리포지토리를 지원하는 방법에 대해 알아보겠습니다.

Kubernetes란?

Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 기능을 제공하며, Docker를 포함하여 일련의 컨테이너 도구들과 함께 동작합니다.
쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했습니다. K8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기입니다. 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화했으며, 현재는 현재 리눅스 재단(Linux Foundation)에 의해 관리되고 있습니다.

Helm이란?

Helm은 Kubernetes용 패키지 매니저입니다. Helm을 사용하면 버전 관리, 공유 및 공동 작업이 가능한 차트에 애플리케이션 정의를 저장하여 복잡한 애플리케이션을 관리할 수 있습니다.

Kubernetes에 애플리케이션을 배포하려면, 쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML이나 JSON으로 기술한 매니페스트(manifest) 파일을 작성해야 합니다. 이러한 매니페스트 파일에는 DB 정보와 같이 배포 환경에 따라 달라지는 정보가 포함되어 있습니다. 그렇다면 모든 환경마다 매니페스트를 작성해야 할까요?

Helm은 매니페스트 파일들을 생성하는 템플릿과 변경되는 값을 정의하는 Helm 차트로 YAML 파일 컬렉션을 패키징하고 Helm 리포지토리로 배포할 수 있는 편리한 기능을 제공합니다.

Helm Charts

Helm 차트는 kubernetes 클러스터 내에서 애플리케이션을 실행하는 데 필요한 Kubernetes 리소스 정의가 포함된 Helm 패키지입니다. 차트는 특정한 디렉터리 구조를 가진 파일들로 생성됩니다. 이 파일들은 배포할 버전이 지정된 아카이브로 패키지화 될 수 있습니다.

Helm CLI가 설치되어 있으면, helm create 명령을 실행하여 새로운 차트를 생성할 수 있습니다.

helm create hello-helm

다음은 Helm Chart의 기본 구조입니다.

$ tree ./hello-helm
./hello-helm
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│   └── test-connection.yaml
└── values.yaml

3 directories, 10 files
디렉토리/파일설명
.helmignore헬름 차트에 포함시키고 싶지 않은 파일들을 지정
Chart.yaml차트에 대한 정보를 포함하는 YAML 파일
charts이 차트가 의존하는 차트를 포함하는 디렉토리
templates값과 결합하여 유효한 Kubernetes manifest 파일을 생성하기 위한 템플릿 디렉토리
templates/NOTES.txt차트의 "도움말". helm install을 실행할 때 사용자에게 표시
templates/_helpers.tpl차트 전체에서 다시 사용할 수 있는 템플릿 헬퍼를 지정하는 공간
values.yaml이 차트의 기본 구성 값

Helm chart 리포지토리

Helm은 Helm 차트를 저장하고 공유하는 데 사용할 수 있는 차트 리포지토리를 지원합니다.

분산형 커뮤니티 Helm 차트 저장소는 Artifact Hub에 있습니다. Artifact Hub는 공개적으로 사용 가능한 분산형 Helm 차트를 포함하여 CNCF(Cloud Native Computing Foundation) 프로젝트에 대한 패키지 및 구성을 찾고, 설치하고, 게시할 수 있는 웹 기반 응용 프로그램입니다.

Helm을 사용하면 자체의 차트 저장소를 만들고 실행할 수도 있습니다.
Helm 차트를 생성한 다음 다른 사람들이 쉽게 재사용할 수 있도록 공유할 수 있습니다. 공유는 차트를 Helm 리포지토리에 저장하여 수행됩니다. 이 리포지토리를 다른 사람들과 공유하면 차트를 사용하여 애플리케이션을 배포할 수 있습니다.

Helm 워크플로우

다음은 Helm Chart를 이용한 kubernetes 배포에 대한 간략한 구성도입니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
  1. 개발자는 다른 사람과 공유하기 위해 Helm 차트를 만들어야 합니다. 차트는 애플리케이션에 필요한 리소스 집합에 대한 템플릿이 포함된 패키지입니다. 템플릿은 매니페스트가 생성될 때 values.yaml 파일에 정의된 변수를 사용하여 리소스를 구성하는 방법을 설명합니다.
  2. Helm 차트는 서버에서 다운로드하거나 액세스할 수 있는 리포지토리 내에서 호스팅됩니다. 이 차트에는 다른 개발자가 애플리케이션을 실행하는 데 필요한 모든 리소스 정의가 포함됩니다.
  3. 클러스터에 액세스할 수 있으므로 애플리케이션에 새로운 기능이나 버그 수정을 추가하고 Helm 차트를 업데이트할 수 있습니다. Helm은 릴리스를 관리하는 데 유용한 도구를 제공합니다. 차트를 업그레이드하고 새 배포를 만들 수 있습니다. Helm에서 배포된 애플리케이션 인스턴스를 릴리스라고 합니다.
  4. 이제 패키지된 애플리케이션을 kubernetes 클러스터에 배포할 수 있습니다.

GitLab에서 Helm 차트 리포지토리를 사용하는 방법

클라우드 네이티브(Cloud Native) 애플리케이션 아키텍처는 컨테이너화, 마이크로서비스 및 Kubernetes를 사용하여 클라우드 규모에서 안정적으로 실행됩니다. 내장된 컨테이너 레지스트리 및 Kubernetes 통합을 통해 GitLab은 클라우드 네이티브 애플리케이션을 개발하고 배포하는 가장 좋은 방법을 제공합니다.

GitLab의 Package Registry를 사용하면, GitLab을 Maven, NuGet, npm, Conan 등 다양한 패키지 매니저에 대한 비공개 또는 공개 레지스트리로 사용할 수 있습니다. GitLab은 14.1 버전부터 지원되는 패키지 레지스트리 형식에 Helm 차트를 추가하였습니다.

GitLab의 Helm 패키지 레지스트리는 전체 DevOps 라이프사이클 동안 GitLab이라는 하나의 플랫폼에서 Helm 차트 및 패키지를 게시하고, 설치 및 공유할 수 있는 Helm 차트 리포지토리 기능을 제공합니다.

Helm 패키지 레지스트리와 Git 리포지토리의 차이점

단순히 Helm 차트를 Git 리포지토리에 저장하지 않는 이유는 무엇일까요? 결국 차트도 소스코드와 마찬가지로 저장하고, 버전 관리 및 협업할 수 있는 YAML 파일인데 말이죠.

소규모 프로젝트나 간단한 애플리케이션의 경우에는 애플리케이션 코드와 동일한 Git 리포지토리에 Helm 차트를 저장하는 것이 편리할 수 있습니다. 그러나 이 방법은 코드가 확장됨에 따라 다루기 어려워지기 시작합니다. 이 모델을 마이크로서비스 아키텍처와 함께 적용하면 다양한 리포지토리에 여러 차트가 분산되게 됩니다. 이렇게 되면 배포된 모든 클러스터의 리소스를 업데이트하는 것이 어려워집니다. 또한, 다른 팀과 차트를 공유하려면 코드 리포지토리에 대한 권한도 부여해야 합니다.

Helm 패키지 레지스트리와 컨테이너 레지스트리의 차이점

Helm 차트를 저장하는 또 다른 방법은 GitLab의 Container Registry와 같은 OCI(Open Container Initiative) 레지스트리를 사용하는 것입니다. Helm 3는 패키지 배포를 위해 OCI를 지원하고, 차트 패키지는 OCI 기반 레지스트리에 저장 및 공유할 수 있습니다. 그러나 OCI 지원은 현재 실험 단계이기 때문에 테스트 목적으로 레지스트리를 사용하는 것을 권장합니다. 많은 조직, 특히 규제가 심한 환경에 있는 조직들은 실험적인 기능으로 추가 위험에 노출되지 않는 것을 선호합니다.

내장된 전용 Helm 패키지 레지스트리

Helm 패키지 레지스트리는 차트를 저장하고 공유할 수 있는 중앙 집중식 저장소를 제공하여 대규모 조직에서 통제된 방식으로 많은 복잡한 애플리케이션을 효율적으로 관리할 수 있도록 합니다. 전용 레지스트리의 주요 이점은 보안, 효율성 및 안정성입니다.

보안과 관련하여 모든 차트가 하나의 중앙 위치에 있다는 것은 취약점을 체계적으로 스캔할 수 있음을 의미합니다. 차트가 여러 위치에 저장되어 있으면 관리하기가 훨씬 더 어렵습니다. 마찬가지로 사용자 계정 및 권한 관리는 단일 위치에서 훨씬 쉽게 관리할 수 있습니다.

중앙 레지스트리를 사용하면 조직 전체에 차트를 훨씬 쉽게 배포할 수 있습니다. 대규모 조직에서는 조직 전체의 다양한 팀에 차트를 작성하고, 유지보수 및 배포하는 업무를 담당하는 우수한 센터가 있는 경우가 많습니다. 차트를 안전하게 공유하고 액세스를 제어하는 방법은 매우 중요합니다.

GitLab 사용자는 하나의 중앙 프로젝트에서 모든 Helm 차트를 호스팅할 수 있으며, 개인 액세스 토큰, 배포 토큰, CI/CD Job 토큰으로 인증할 수 있습니다.

Helm 패키지 레지스트리 시작하기

GitLab 프로젝트의 패키지 레지스트리에 Helm 패키지를 게시합니다. 그런 다음 의존성으로 사용해야 할 때마다 패키지를 설치합니다.

패키지 게시

일단 작성된 차트는 curl 또는 helm cm-push를 사용하여 원하는 채널에 업로드할 수 있습니다.

curl을 사용하여 :

curl --request POST \
--form 'chart=@mychart-0.1.0.tgz' \
--user <username>:<access_token> \
https://gitlab.example.com/api/v4/projects/<project_id>/packages/helm/api/<channel>/charts
  • <username> : GitLab 사용자 이름 또는 배포 토큰 사용자 이름
  • <access_token> : 개인 액세스 토큰 또는 배포 토큰
  • <project_id> : 프로젝트 ID (예: 42) 또는 프로젝트의 URL 인코딩 경로 (예: group%2Fproject)
  • <channel> : 채널 이름 (예: stable)

helm cm-push 플러그인을 사용하여 :

helm repo add --username <username> --password <access_token> project-1 https://gitlab.example.com/api/v4/projects/<project_id>/packages/helm/<channel>
helm cm-push mychart-0.1.0.tgz project-1
  • <username> : GitLab 사용자 이름 또는 배포 토큰 사용자 이름
  • <access_token> : 개인 액세스 토큰 또는 배포 토큰
  • <project_id> : 프로젝트 ID (예: 42)
  • <channel> : 채널 이름 (예: stable)

패키지 설치

최신 버전의 차트를 설치하려면 다음 명령을 사용합니다.

helm repo add --username <username> --password <access_token> project-1 https://gitlab.example.com/api/v4/projects/<project_id>/packages/helm/<channel>
helm install my-release project-1/mychart
  • <username> : GitLab 사용자 이름 또는 배포 토큰 사용자 이름
  • <access_token> : 개인 액세스 토큰 또는 배포 토큰
  • <project_id> : 프로젝트 ID (예: 42)
  • <channel> : 채널 이름 (예: stable)

리포지토리가 이전에 추가된 경우, 다음을 실행해야 할 수 있습니다.

helm repo update

맺음말

지금까지 Helm과 Helm 차트, 그리고 Helm 패키지 레지스트리에 대해서 알아보았습니다.
Helm은 Kubernetes 클러스터에 애플리케이션을 배포하는 데 자주 사용되며 각 릴리스에 대한 추적을 제공하는 강력한 도구입니다. Helm을 사용하면 개발팀이 애플리케이션을 안정적이고 빠르게 배포하는 데 도움이 됩니다.

이번 블로그를 통하여 많은 분들이 GitLab과 Helm을 사용하여 클라우드 네이티브 애플리케이션을 개발하고 배포하는 데 도움이 되셨으면 좋겠습니다.