본문 바로가기
DevOps/Kubernetes

Helm Chart Repository 만들기 (2) - Harbor OCI registry

by 비어원 2023. 10. 12.
728x90

이전 시간에는 Github page로 Helm chart repository를 만들어보았다. 하지만 Github page 방식은 단점(트래픽 및 용량제한)이 있으며, 레포지토리가 무조건 공개된다는 특징이 있다. 이러한 단점을 해결하거나 사설망에 레포지토리를 구축해야 한다면 Github page 방식 외의 별도의 서버를 구축해야 한다.

 

별도의 서버를 구축하는 방법 중 가장 대표적인 것은 Harbor registry에서 제공하는 Chartmuseum 플러그인을 사용하는 방법이 있다. 물론 이 방법을 사용하려면 별도의 Harbor registry가 구축되어야 한다. Kubernetes 클러스터에 Harbor registry를 구축하는 방법은 아래 포스트를 참고하자.

 

2023.10.09 - [DevOps/Docker] - Harbor Private Registry 소개 및 설치

 

Harbor Private Registry 소개 및 설치

Harbor는 CNCF를 졸업한 프로젝트로, 대표적인 사설 레지스트리 (Private Registry) 오픈소스이다. Private Registry 보통 hub.docker.com에서 제공하거나 오픈소스 프로젝트에서 제공하는 컨테이너 이미지는 인

beer1.tistory.com

 

Harbor OCI repository

원래 예전에는 Harbor에서 Helm chart를 저장하기 위해서 chartmuseum 플러그인을 설치했다. Chartmuseum은 helm repository 백엔드 서버이며, Harbor는 chartmuseum에서 제공해주는 API를 활용하여 Helm chart registry에 대한 UI 기능을 제공해주었다. 그런데 Harbor 2.6버전부터 chartmuseum을 deprecated 시킴과 동시에 Harbor에 내장되어있는 OCI registry에 Helm chart를 저장할 수 있도록 변경되었다. 그리고 2.8버전에는 charmuseum이 완전히 제거되었다.

 

사실 Harbor 1.6버전부터 chartmuseum을 제공하고 있었고 OCI registry는 2.0부터 제공하고 있다. 즉, 2.0버전부터는 굳이 chartmuseum을 설치하지 않아도 Harbor 자체로 helm chart repository 기능을 할 수 있다.

 

Helm chart push

일단 Harbor에 접속한다음 차트를 저장하는 프로젝트를 하나 만들자. 사실 기존 프로젝트가 있다면 그냥 사용해도 무방하다. 하지만 컨테이너 이미지를 저장하는 프로젝트와 분리되면 더 보기 좋을 것 같다.

 

그 다음 로컬에 있는 helm chart 디렉터리로 간 다음, helm package 명령어로 tgz파일을 만들자.

.
├── README.md
├── index.yaml
└── spring-app
    ├── Chart.yaml
    ├── README.md
    ├── templates
    ├── values.schema.json
    └── values.yam
$ helm package spring-app/
Successfully packaged chart and saved it to: /Users/user/Documents/myProjects/charts/spring-app-0.1.0.tgz

 

tgz 파일이 만들어졌다면 helm push로 harbor registry에 helm chart를 올려보자. 그런데 harbor는 private registry이기 때문에 푸쉬를 하려면 별도의 인증 절차를 거쳐야 한다. harbor registry login 명령어로 로그인을 하자.

# helm registry login -u ${user} ${harbor-registry-domain}
$ helm registry login -u admin harbor.beer1.com
Password:
Login Succeeded

 

로그인 후에 helm push로 harbor registry에 helm chart를 올려보자.

# helm push ${helm-chart-tgz-file} oci://${harbor-domain}/${project}/
$ helm push spring-app-0.1.0.tgz oci://harbor.beer1.com/charts/
Pushed: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c

 

푸쉬가 끝났다면 하버에 접속한 다음 charts 프로젝트로 들어가면 레포지토리에 차트가 올라간 것을 확인할 수 있다.

 

차트 이름을 클릭하면 아티팩트를 확인할 수 있다.

 

아티팩트를 클릭하면 차트에 대한 메타데이터와 README.md를 볼 수 있다. README.md 문서화를 잘 하면 다른 사용자가 차트를 이해하는 데 도움이 될 것이라 생각한다.

 

OCI-based registry

사실 하버에서 제공해주는 helm registry는 OCI 기반 레지스트리이다. 이 레지스트리는 일반적인 helm chart 레지스트리와는 조금 다른 성격을 띤다. 일단 Helm 3.8 버전부터 OCI 기반 레지스트리 지원을 정식으로 하며, 3.8 이전 버전에서는 helm에서 OCI가 다르게 동작했다고 한다. 그래서 정상적으로 OCI 기반 레지스트리를 사용하려면 helm 버전이 3.8 이상인지 확인해야 한다.

 

제공 커맨드

OCI 기반 레지스트리를 사용한다면 제공하는 커맨드는 다음과 같다.

 

  • helm registry
  • helm push
  • helm pull
  • helm show
  • helm template
  • helm install
  • helm upgrade

이 외에는 oci:// 프로토콜을 지원하는 커맨드는 없다고 보면 된다. 우리가 helm chart repository로 배포를 할 떄 helm repo add 명령어로 레포지토리를 등록한 후에 배포를 했었는데 oci 기반 레지스트리에 저장된 차트를 배포할 떄는 helm repo 명령어를 사용할 수가 없다. 일단 그렇다면 oci 프로토콜을 지원하는 커맨드를 어떻게 사용할 수 있는지 알아보자.

 

harbor registry

이전에 차트 푸시를 하기 전에 harbor registry 명령어를 통해 로그인을 했다.

$ helm registry login -u admin harbor.beer1.com
Password:
Login Succeeded

 

물론 logout 명령어도 있다. logout 후에 푸시를 시도하면 권한 오류가 발생하는 것을 확인할 수 있다.

$ helm registry logout harbor.beer1.com
Logout succeeded

$ helm push spring-app-0.1.0.tgz oci://harbor.beer1.com/charts/
Error: unexpected status from HEAD request to https://harbor.beer1.com/v2/charts/spring-app/blobs/sha256:754ca1e476e18c95c943611b87796f65a5211cc186766f0c0a1f6986d6dc5b1f: 401 Unauthorized

 

helm push & pull

helm push는 패키징된 tgz파일을 레지스트리에 올리는 명령어이다.

# helm push ${helm-chart-tgz-file} oci://${harbor-domain}/${project}/
$ helm push spring-app-0.1.0.tgz oci://harbor.beer1.com/charts/
Pushed: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c

 

helm pull은 반대로 레지스트리로부터 tgz파일을 받아오는 명령어이다. --version 옵션을 통해 특정 버전의 tgz파일도 받아올 수 있다.

$ helm pull oci://harbor.beer1.com/charts/spring-app --version 0.1.0
Pulled: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c

 

helm show

helm show 명령어는 oci 레지스트리에 저장되어있는 특정 차트에 대한 정보를 출력하는 명령어이다.

# helm show ${target} ${oci-registry-chart} --version ${version}
$ helm show all oci://harbor.beer1.com/charts/spring-app --version 0.1.0

 

여기서 target은 all, chart, crds, readme, values가 있는데 all은 모두 보여주는 것이고 chart는 Chart.yaml에 선언된 메타데이터 정보를, crds는 차트의 CRD 정보들을, readme는 README.md 내용을, values는 기본 values.yaml을 보여준다.

 

helm template & install & upgrade

helm template은 values.yaml 내용들을 템플릿 변수에 바인딩한 결과물을 내려주는 명령어이고, install은 바인딩된 결과물을 바탕으로 쿠버네티스에 적용시키는 명령어고 upgrade는 기존에 설치한 helm에게 변경된 내용의 values를 적용시킬 때 사용한다. 사용 방법은 기존에는 helm repo add로 헬름 레포를 등록한 후 template / install / upgrade 명령어를 사용했다면, oci 기반의 레지스트리에 있는 차트를 사용한다면 helm repo add를 생략하고 바로 oci 레지스트리를 사용한다.

$ helm template todo-app -n todo oci://harbor.beer1.com/charts/spring-app -f todo-api.yaml --version 0.1.0
Pulled: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c
---
# Source: spring-app/templates/serviceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: todo-api
  namespace: "todo"
...
$ helm install todo-app -n todo oci://harbor.beer1.com/charts/spring-app -f todo-api.yaml --version 0.1.0 
Pulled: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c
NAME: todo-app
LAST DEPLOYED: Thu Oct 12 23:23:20 2023
NAMESPACE: todo
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm upgrade -i todo-app -n todo oci://harbor.beer1.com/charts/spring-app -f todo-api.yaml --version 0.1.0

Pulled: harbor.beer1.com/charts/spring-app:0.1.0
Digest: sha256:1610459bb48361694e07482910e0692cf670d7e5cd82acb45d81e1c62c6a7f8c
Release "todo-app" has been upgraded. Happy Helming!
NAME: todo-app
LAST DEPLOYED: Thu Oct 12 23:24:05 2023
NAMESPACE: todo
STATUS: deployed
REVISION: 2
TEST SUITE: None

 

마무리

Harbor를 활용한 OCI 기반의 helm chart private registry를 구축해보았다. 사실 2.0버전 이상의 harbor가 설치되어 있기만 하면 아무것도 하지 않고도 곧바로 사용이 가능해서 구축이라고 할 것도 없다. 아주 간단하게 helm chart private registry를 사용할 수 있어서 큰 메리트가 있다고 생각한다. 사실 쿠버네티스 = 컨테이너 오케스트레이터기 때문에 컨테이너 이미지 레지스트리가 필요한데 Harbor를 도입한다면 Helm 레지스트리까지 동시에 사용할 수 있다는게 큰 장점인 듯 하다. 이래서 Harbor가 CNCF를 졸업한게 아닐까 하는 생각도 든다.

 

Harbor에서 취할 수 있는 여러가지 장점이 있기 때문에 어느정도 규모가 된다면 github page보다는 harbor를 사용하는 것이 더 좋다고 생각한다.

 

Harbor OCI helm registry 장단점

 

장점

 

  • 구축하기가 쉽다.
  • 컨테이너 이미지 레지스트리 + 차트 레지스트리를 한번에 관리할 수 있다.
  • 사설 레지스트리로 권한 관리 및 보안을 신경쓸 수 있다.

단점

 

  • 단점이랄 것은 별로 없다. 서버 비용과 유지보수 시간이 들 뿐이다.

 

참고 자료


https://goharbor.io/docs/2.7.0/working-with-projects/working-with-images/managing-helm-charts/

 

Harbor – Managing Helm Charts

 

goharbor.io

https://github.com/goharbor/harbor/wiki/Migrate-helm-chart-to-oci-registry-in-Harbor

 

Migrate helm chart to oci registry in Harbor

An open source trusted cloud native registry project that stores, signs, and scans content. - goharbor/harbor

github.com

 

728x90

댓글