DevOps/Kubernetes

[Helm] Github를 Helm Chart Repository로 사용하기

nayoungs 2023. 8. 16. 02:35
728x90

Github를 Helm Chart Repository로 사용하는 방법을 설명하기에 앞서,

Helm의 기본적인 개념에 대한 설명이 필요하다면 여기를 참조하면 된다.

 

[Kubernetes] Helm이란? Helm의 개요와 사용법

📌Index Helm이란? Helm 설치하기 Helm 사용법 Helm 실습 ✔️ Helm이란? Helm이란, Kubernetes 패키지 관리를 도와주는 것(패키지매니저)으로, yaml 파일의 모음이라고 할 수 있다. Helm에 대한 많은 문서나 책

nayoungs.tistory.com

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이 생성되도록 한다.

 

800

 

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

 

728x90