[Helm] Github를 Helm Chart Repository로 사용하기
Github를 Helm Chart Repository로 사용하는 방법을 설명하기에 앞서,
Helm의 기본적인 개념에 대한 설명이 필요하다면 여기를 참조하면 된다.
Helm Chart Repository(저장소)를 서비스(호스팅)하는 방법에는 클라우드 스토리지, JFrog 아티팩토리, 일반 웹 서버 등 여러가지가 있지만, 본 글에서는 Github를 차트 저장소로 사용하는 방법에 대해서 설명해보려 한다.
Helm Chart Repository
먼저 차트 저장소란 무엇인지에 대해 설명을 조금 하자면,
차트 저장소는 index.yaml
파일과 패키징된 차트를 저장하는 HTTP 서버이다. 차트 저장소는 GET 요청에 응답할 수 있는 모든 HTTP 서버가 될 수 있기 때문에 자신만의 차트 저장소를 호스팅하는 방법에는 굉장히 여러 가지가 있다. 그리고 본 글에서 설명할 옵션이 바로 Github Pages를 사용하는 방법이다.
차트 저장소 구조
차트 저장소는 패키징된 차트(tgz)와 모든 차트의 인덱스를 가진 index.yaml
로 구성된다.
예를 들어, 저장소 https://example.com/charts
의 레이아웃은 다음과 같을 수 있다:
charts/
|
|- index.yaml
|
|- alpine-0.1.2.tgz
이 경우에는 인덱스 파일에 하나의 알파인 차트에 대한 정보가 포함되며, 해당 차트에 대한 다운로드 URL은 https://example.com/charts/alpine-0.1.2.tgz 이 되는 것이다.패키징된 차트가 index.yaml
과 동일한 서버에 위치할 필요는 없지만, 그게 일반적이다.
Index 파일
index.yaml
파일은 Chart.yaml
파일의 내용을 포함하여 패키지에 대한 메타데이터가 포함되어있다. 차트 저장소라면 index.yaml
을 포함하고 있어야한다. 인덱스 파일에는 차트 저장소의 각 차트에 대한 정보가 들어있고, helm repo index
명령을 통해 인덱스 파일을 생성할 수 있다.
인덱스 파일의 예시:
apiVersion: v1
entries:
alpine:
- created: 2016-10-06T16:23:20.499814565-06:00
description: Deploy a basic Alpine Linux pod
digest: 99c76e403d752c84ead610644d4b1c2f2b453a74b921f422b9dcb8a7c8b559cd
home: https://helm.sh/helm
name: alpine
sources:
- https://github.com/helm/helm
urls:
- https://technosophos.github.io/tscharts/alpine-0.2.0.tgz
version: 0.2.0
- created: 2016-10-06T16:23:20.499543808-06:00
description: Deploy a basic Alpine Linux pod
digest: 515c58e5f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cd78727
home: https://helm.sh/helm
name: alpine
sources:
- https://github.com/helm/helm
urls:
- https://technosophos.github.io/tscharts/alpine-0.1.0.tgz
version: 0.1.0
nginx:
- created: 2016-10-06T16:23:20.499543808-06:00
description: Create a basic nginx HTTP server
digest: aaff4545f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cdffffff
home: https://helm.sh/helm
name: nginx
sources:
- https://github.com/helm/charts
urls:
- https://technosophos.github.io/tscharts/nginx-1.1.0.tgz
version: 1.1.0
generated: 2016-10-06T16:23:20.499029981-06:00
Github를 Helm Chart 저장소로 사용하기
시작하기에 앞서, 차트 작성을 완료했다는 전제하에 다음 실습을 진행한다.
1. 가장 먼저 차트 저장소로 사용할 새로운 github repository를 생성한다.
2. 다음과 같이 github pages를 사용하도록, 리포지토리에 접근하기 위한 URL을 설정해준다.
다음은 내가 진행했던 팀 프로젝트 차트 저장소의 예시로,
아래와 같이 [Settings] - [Pages] - [main(or master)] - [Save]를 선택하여 페이지 URL이 생성되도록 한다.
3. 생성된 git repository를 git clone
(복제)한다.
git clone <github-repo-url>
$ git clone https://github.com/JUJY-OIDC/etcd-autobackup-helm-repo.git
4. Chart packaging
다음으로 작성된 차트를 패키징 해준다.
helm package <chart-file-directory>
$ helm package etcd-autobackup/
Successfully packaged chart and saved it to: /Users/nayoung/Documents/GitHub/etcd-autobackup/etcd-autobackup-1.0.0.tgz
나는 본 리포지토리에 etcd-autobackup
차트만 올릴 예정이기 때문에 etcd-autobackup
디렉토리에 차트 파일(Chart.yaml, templates, values.yaml 등)을 두었지만, 일반적으로 한 github 리포지토리에 여러 차트를 업로드할 경우 helm-charts/
(혹은 charts/
등) 디렉토리에 차트 파일을 업로드한다. 디렉토리 이름은 본인의 자유로 지정하면 된다.
5. Package indexing
패키징이 완료되었다면, 패키징 파일을 인덱싱 해주어야한다. 이때, 다음과 같이 로컬 디렉토리에서 indexing 해주는 방법이 있고, (이럴 경우 index.yaml은 etcd-autobackup 디렉토리에 생성)
helm repo index <chart-file-directory>
$ helm repo index etcd-autobackup/
url을 사용하여 인덱싱하는 방법이 있다. 여기서는 url을 이용하는 방법으로 진행해보려 한다.
6. Github에 패키지 업로드
url을 사용하는 경우 미리 차트 파일과 패키징된 차트(tgz)를 깃헙에 업로드해두고,
다음과 같이 --url
옵션을 사용하여 인덱싱한다.
helm repo index --url <github-package-url> <index 파일이 저장될 위치>
나는 차트 파일과 별개로, stable
디렉토리에 index.yaml
과 패키징 파일(tgz)을 구분해두기 위해 다음과 같은 트리 구조로 만들고 git push 하였다.
.
└── etcd-autobackup-helm-repo
├── etcd-autobackup
│ ├── Chart.yaml
│ ├── templates
│ └── values.yaml
└── stable
└── etcd-autobackup-1.0.0.tgz
위와 같은 방법과 달리 차트 파일과 동일한 디렉토리(여기서는 etcd-autobackup/
)에 인덱싱 파일을 두는 경우도 많고, 이 또한 본인의 원하는 방법대로 진행하면 된다.
$ helm repo index --url https://jujy-oidc.github.io/etcd-autobackup-helm-repo/stable/ stable/
그렇게 인덱싱을 하고 나면 index.yaml
파일이 생성 된다.
이때 urls:
에 패키징 파일의 github url만 알맞게 들어가 있으면 된다.
apiVersion: v1
entries:
etcd-autobackup:
- apiVersion: v2
created: "2023-08-08T18:27:50.114349+09:00"
description: A Helm chart for etcd-autobackup service
digest: a60995630884811b456512437d546ec56a8a4b21ebf96f8bfb3eace430c1fc53
name: etcd-autobackup
urls:
- https://jujy-oidc.github.io/etcd-autobackup-helm-repo/stable/etcd-autobackup-1.0.0.tgz
version: 1.0.0
generated: "2023-08-08T18:27:50.113082+09:00"
그리고 github에 index.yaml
이 올라가도록 다시 git push 해주면 된다.
즉 나는 다음과 같은 상태로 깃헙에 업로드 된다.
.
└── etcd-autobackup-helm-repo
├── etcd-autobackup
│ ├── Chart.yaml
│ ├── templates
│ └── values.yaml
└── stable
├── etcd-autobackup-1.0.0.tgz
└── index.yaml
Helm Chart 저장소 Test
이제 github repo가 차트 저장소로 잘 동작하는지 테스트해보자.
다음과 같이 리포지토리를 추가한다.
helm repo add <repo-name> <package url>
$ helm repo add etcd-autobackup https://jujy-oidc.github.io/etcd-autobackup-helm-repo/stable
Repo 업데이트, 리스트 확인 및 서치를 해보고
helm repo update
helm repo list
helm search repo <repo name>
$ helm search repo etcd-autobackup
NAME CHART VERSION APP VERSION DESCRIPTION
etcd-autobackup/etcd-autobackup 1.0.0 A Helm chart for etcd-autobackup service
helm install(클러스터에 배포)을 진행한다.
helm install <release-name> <repo-name>/<chart-name>
나의 차트는 values.yaml
이 필요해서 다음과 같이 --values
옵션을 주었다.
$ helm install etcd-autobackup etcd-autobackup/etcd-autobackup --values=values.yaml
이처럼 helm install
했을 때 쿠버네티스 리소스가 잘 생성되었다면, 저장소가 성공적으로 호스팅되었다고 할 수 있다.
Reference