본문 바로가기
DevOps/Kubernetes

Helm Chart Repository 만들기 (1) - Github

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

지금까지는 차트를 로컬에서 만들어보고 로컬에 있는 차트를 가지고 배포를 하는 방식을 알아보았다. 그런데 보통 개발자 로컬에서 차트를 개발하지만 실제로 차트를 사용하여 배포하는 곳은 애플리케이션 서버가 될 것이다. 그리고 도커 이미지처럼 개발자 본인 뿐 아니라 여러 개발자들끼리 함께 공유해서 사용할 수 있어야 한다.

 

그렇다면 개발한 차트는 어떻게 공유할 수 있을까? 가장 간단한 방법으로는 차트를 구성하는 디렉터리 자체를 압축하여 여러 개발자끼리 공유하는 방법이 될 수 있겠지만, 이러한 방식은 너무 번거롭다. 다행히 helm 도구는 도커와 비슷하게 차트 레포지토리라는 개념을 두어서 외부에 저장된 차트를 받아 배포하는 기능을 제공해주고 있다.

Chart Repository

Helm 공식 홈페이지에서는 Chart repository를 index.yaml 파일과 패키지화된 차트를 저장하는 HTTP 서버로 정의하고 있다. 차트 레포지토리 서버에서는 차트는 tgz형식의 압축파일로 저장이 된다. 즉, 차트 레포지토리는 yaml과 tgz 파일을 서빙하는 모든 HTTP 서버가 될 수 있기 때문에 여러 방식으로 차트 레포지토리를 호스팅할 수 있다.

 

Chart Repository를 호스팅할 수 있는 방법은 아래와 같은 방식이 있는데 자신이 사용하고 관리하기 편한 방식으로 채택하면 된다.

 

  • 구글 클라우드 스토리지
  • Github Page ✅
  • Harbor OCI 
  • Chartmuseum 서버
  • 직접 구축 (일반 웹서버)

 

일단 이번 장에서는 Github Page를 활용한 방식으로 차트 레포지토리를 구현해보도록 하자. Harbor OCI 방식이 궁금하면 아래 포스팅을 참고하자.

 

 

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

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

beer1.tistory.com

 

 

Github Page로 호스팅하기

먼저 차트를 github 레포지토리로 관리하고 있다면, 해당 레포지토리에서 Github 페이지 설정과 몇 가지 구성만 하면 간단히 Chart repository를 구축할 수 있다.

 

Github Page 구성

먼저 차트를 관리하고 있는 레포지토리에서 깃헙 페이지용 브랜치를 하나 생성한 후 원격레포에 푸쉬하자.

$ git checkout main # 메인브렌치로 전환
$ git checkout -b release
$ git push --set-upstream origin release

 

그 다음 웹에서 레포지토리에 접속한 다음 release 브랜치로 향하게 한 다음, 톱니바퀴 모양의 설정을 누른 다음 깃헙 페이지 섹션을 선택하고 브랜치를 release로 설정하자.

 

설정을 다 했다면 Save 버튼을 누르면 끝이다. Save 버튼까지 눌렀다면 Github page가 호스팅되었는지 확인하자. 기본적으로 https://${username}.github.io/${repository-name}/ 으로 브라우저를 통해 접속하면 페이지가 호스팅된 것을 확인할 수 있다. 홈 페이지 내용은 루트의 README.md로 렌더링된다.

 

만약 해당 레포지토리 하위에 특정 차트를 저장한 디렉터리가 있다면 https://${username}.github.io/${repository-name}/{chart-dir-name} 으로 접근하면 특정 차트에 대한 README.md 내용도 서빙할 수 있다. (문서화의 중요성..)

 

차트 배포하기 (tgz 파일 생성)

일단 차트를 배포하기 위해서는 차트의 내용이 담긴 tar 파일이 필요하다. 로컬에서 helm package 명령어로 차트를 tgz 파일로 압축시킬 수 있다. 먼저 로컬 차트 디렉터리 구조가 다음과 같다고 가정하자.

.
├── README.md
└── spring-app
    ├── Chart.yaml
    ├── README.md
    ├── templates
    ├── values.schema.json
    └── values.yaml

 

로컬 디렉터리에서 helm package 명령어를 사용하면 tgz 파일이 생성된다.

$ helm package spring-app/
Successfully packaged chart and saved it to: /Users/user/Documents/myProjects/charts/spring-app-0.1.0.tgz

 

index.yaml 파일 생성

tgz 파일이 생성되었다면 그 다음으로 할 일은 index.yaml 파일을 생성하는 것이다. 아래 명령어로 index.yaml을 자동으로 초기화할 수 있다.

$ helm repo index . 

 

위의 명령어로 만들어진 index.yaml은 현재 디렉터리 기준 tgz 파일을 참조하여 자동으로 생성한다. tgz 파일 안에는 Chart.yaml 파일에 차트에 대한 정보도 저장되어있기 때문에 자동으로 생성이 된다.

apiVersion: v1
entries:
  spring-app:
  - apiVersion: v2
    appVersion: 0.1.0
    created: "2023-10-09T15:46:29.097383+09:00"
    description: Spring application server
    digest: bbacfc4bc63db798c90bb291f8ee8f0897099bbcff509607fe1828e8c961f3e3
    home: https://chart.beerone.com
    kubeVersion: '>= 1.20.0'
    maintainers:
    - email: floidea2@gmail.com
      name: beerone
    name: spring-app
    urls:
    - spring-app-0.1.0.tgz
    version: 0.1.0
generated: "2023-10-09T15:46:29.096852+09:00"

 

최종적으로 차트 디렉터리의 구조는 다음과 같다.

.
├── README.md
├── spring-app
│   ├── Chart.yaml
│   ├── README.md
│   ├── ci
│   ├── templates
│   ├── values.schema.json
│   └── values.yaml
├── index.yaml
└── spring-app-0.1.0.tgz

 

마지막으로 생성된 모든 파일들을 git에 푸쉬하자.

$ git add .
$ git commit -m "chart init"
$ git push

 

차트 레포지토리로 배포하기

이제 외부(git)에 저장되어있는 차트를 직접 사용해보자. 이전까지는 로컬 디렉터리에 저장되어있는 차트를 사용했다면 이제는 외부 저장소에 있는 차트를 땡겨서 사용하는 방식이라고 보면 된다.

 

먼저 차트 레포를 추가해야 한다. 아래 명령어로 차트 레포를 추가하자.

# helm repo add ${CHART_NAME} https://${GIT_USERNAME}.github.io/${REPO_NAME}/

$ helm repo add beer-one https://beer-one.github.io/charts/
"beer-one" has been added to your repositories

 

그 다음 차트 배포를 할 때는 차트 레포지토리 이름/차트 이름 으로 차트를 지정해주면 된다.

# [BEFORE] helm install ${APP_NAME} ${CHART_DIR} -n ${NAMESPACE} -f ${VALUES_YAML_PATH}
# [AFTER]  helm install ${APP_NAME} ${REPO_NAME}/${CHART_NAME} -n ${NAMESPACE} -f ${VALUES_YAML_PATH}

$ helm install todo beer-one/spring-app -n todo -f todo-api.yaml
NAME: todo-api
LAST DEPLOYED: Mon Oct  9 16:10:00 2023
NAMESPACE: todo
STATUS: deployed
REVISION: 1
TEST SUITE: None
  • 예전에는 디렉터리로 차트를 지정해줬다면 지금은 ${원격 레포지토리 이름}/${차트 이름} 으로 차트를 지정해주면 된다.

 

Github Page 장단점

 

장점

  • 별도의 서버자원이 필요없다.
  • 구축하기가 쉽다.

단점

  • Github page의 용량 제한(1GB)이 걸려있어 대용량의 차트 레포지토리를 호스팅하는 것은 어렵다.
  • 월 트래픽 제한 (100GB)
  • 퍼블릭으로 배포되기 때문에 사설 환경에서 구축이 되어야 하는 경우 불가능, 권한 제어기능 X
  • Github Enterprise는 해당 방식으로는 사용 불가능 (도메인 문제였나.. 어쨌든 회사에서 작년에 구축 시도를 했었는데 실패함)

 

결론

Github page 방식은 별도로 구축하는 데 큰 노력을 하지 않아도 간단히 호스팅할 수 있어서 간단히 공부를 목적으로 하거나 토이 프로젝트용, 오픈소스 형태로 차트를 공유하기 위해서 사용하기 좋다. 하지만 회사에서만 접근할 수 있는 차트 레포지토리를 구축해야 한다면 Github page 방식은 적합하지 않다.

 

그리고 Github page로 호스팅하는 것이 전부가 아니라 차트 각각의 버전 관리를 별도의 브랜치로 관리하고, 특정 버전의 브랜치가 푸쉬된다면 푸쉬 이벤트에 반응하여 자동으로 호스팅 브랜치 (글 기준으로는 release)에 tgz 파일을 배포하고 index.yaml 파일이 업데이트할 수 있도록 CI/CD 환경 구축이 필요하다. 시간이 되면 Chart Repository에 대한 CI/CD 구축 방식을 작성해보겠다.

 

참고 문서

https://helm.sh/ko/docs/topics/chart_repository/

 

차트 저장소 가이드

헬름 차트 저장소를 만들고 작업하는 방법

helm.sh

https://docs.github.com/ko/pages/getting-started-with-github-pages/about-github-pages#limits-on-use-of-github-pages

 

GitHub Pages 정보 - GitHub Docs

You can use GitHub Pages to host a website about yourself, your organization, or your project directly from a repository on GitHub.com. GitHub Pages is available in public repositories with GitHub Free and GitHub Free for organizations, and in public and p

docs.github.com

 

728x90

댓글