chart repository는 package를 end user에게 공유하고 배포하는 방법으로, chart를 검색하고 다운로드 할 수 있도록 해준다. chart repository는 HTTP(s) web service로 제공되어 마치 debian package repository, fedora package database와 비슷하게 동작한다.
모든 chart repository들은 index.yaml
이라는 special repository index file을 가지고 있는데, 이는 이용가능한 모든 chart들과 각각의 다운로드 location을 항목화하고 있다.
다음은 기본적인 index.yaml
file의 예시이다.
apiVersion: v1
entries:
superapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2020-04-27T17:46:52.60919-05:00"
description: A Helm chart for Kubernetes
digest: cd1f8d949aeb6a7a3c6720bfe71688d4add794881b78ad9715017581f7867db4
name: superapp
type: application
urls:
- superapp-0.1.0.tgz
version: 0.1.0
generated: "2020-04-27T17:46:52.607943-05:00"
entries
는 해당 repository를 통해 접근 가능한 chart들을 나열한다. 여기에는 단일 chart인 superapp
만 존재한다.
다음은 더 현실적인 repository index.yaml 예시이다. entries
에 나열한 chart의 version들은 client가 설치할 수 있는 chart version이고 해당 version에 따라 설치가 가능한 것이다.
apiVersion: v1
entries:
cert-manager:
- apiVersion: v1
appVersion: v0.14.2
created: "2020-04-08T11:38:26.281Z"
description: A Helm chart for cert-manager
digest: 160e1bd4906855b91c8ba42afe10af2d0443b184916e4534175890b1a7278f4e
home: https://github.com/jetstack/cert-manager
icon: https://raw.githubusercontent.com/jetstack/cert-manager/master/logo/
logo.png
keywords:
- cert-manager
- kube-lego
- letsencrypt
- tls
maintainers:
- email: dev@jetstack.io
name: jetstack-dev
name: cert-manager
sources:
- https://github.com/jetstack/cert-manager
urls:
- charts/cert-manager-v0.14.2.tgz
version: v0.14.2
- apiVersion: v1
appVersion: v0.14.1
created: "2020-03-25T18:30:16.354Z"
description: A Helm chart for cert-manager
digest: 629150400487df41af6c7acf2a3bfd8e691f657a930bc81e1dcf3b9d23329baf
home: https://github.com/jetstack/cert-manager
icon: https://raw.githubusercontent.com/jetstack/cert-manager/master/logo/
logo.png
keywords:
- cert-manager
- kube-lego
- letsencrypt
- tls
maintainers:
- email: dev@jetstack.io
name: jetstack-dev
name: cert-manager
sources:
- https://github.com/jetstack/cert-manager
urls:
- charts/cert-manager-v0.14.1.tgz
version: v0.14.1
tor-proxy:
- apiVersion: v1
created: "2018-11-16T09:23:13.538Z"
description: A Helm chart for Kubernetes
digest: 1d2fd11e22ba58bf0a263c39777f0f18855368b099aed7b03123ca91e55343e4
name: tor-proxy
urls:
- charts/tor-proxy-0.1.1.tgz
version: 0.1.1
generated: "2020-04-23T17:43:41Z"
각 chart마다의 apiVersion
, appVersion
이 있는 것을 알 수 있다. 이 version에 따라 설치 가능한 chart가 결정되는 것이다. 가령 위의 예시로 cert-manager v0.14.1
, cert-manager v0.14.2
가 가능하고 tor-proxy 0.1.1
이 가능하다는 것이다.
entries
의 각 chart item들을 잘 보면 urls
로 chart의 archive 파일들이 있는 것을 볼 수 있다. 일반적으로 index.yaml
과 같은 file 위치에 있지만, 다음과 같이 remote link를 연결하여 chart를 구성할 수도 있다.
...
- appVersion: 2.10.1
created: 2019-01-14T23:25:37.125126859Z
description: A simple, powerful publishing platform that allows you to share
your stories with the world
digest: dcadf39f81253a9a016fcab1b74aba1d470e015197152affdaeb1b337221cc5c
engine: gotpl
home: http://www.ghost.org/
icon: https://bitnami.com/assets/stacks/ghost/img/ghost-stack-220x234.png
keywords:
- ghost
- blog
- http
- web
- application
- nodejs
- javascript
maintainers:
- email: containers@bitnami.com
name: Bitnami
name: ghost
sources:
- https://github.com/bitnami/bitnami-docker-ghost
urls:
- https://charts.example.com/ghost-6.2.3.tgz
version: 6.2.3
...
위의 예시를 보면 urls
부분이 https://charts.example.com/ghost-6.2.3.tgz
으로 되어있는 것을 알 수 있다.
helm을 통해서 repository index를 만들 수 있다.
먼저, chart repository의 root directory로 쓰기 위한 directory를 하나 만들어보도록 하자.
mkdir -p charts/
이제 charts
directory에 repository index를 만들어주도록 하자.
helm repo index charts/
repository index가 잘 만들어졌는 지 확인해보도록 하자.
cat charts/index.yaml
apiVersion: v1
entries: {}
generated: "2024-07-09T14:45:43.038552511+09:00"
현재 entires
가 비어있는데, 이는 charts
directory에 어떠한 package도 없기 때문에 그렇다. 먼저 하나의 chart를 만들고 이를 packaging하여 archive 파일을 charts
로 전달해보도록 하자.
helm create superapp
Creating superapp
helm package superapp/ --destination charts/
Successfully packaged chart and saved it to: charts/superapp-0.1.0.tgz
charts
안에 superapp-0.1.0.tgz
archive파일이 만들어진 것을 볼 수 있다.
이제 다시 charts
directory에 repository index를 만들어보도록 하자.
cat charts/index.yaml
apiVersion: v1
entries:
superapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T14:49:26.816473015+09:00"
description: A Helm chart for Kubernetes
digest: 51d07a40518941a3e8648fa410b5f4a0e7bcf149791d84c706ef32e10ed2bca6
name: superapp
type: application
urls:
- superapp-0.1.0.tgz
version: 0.1.0
generated: "2024-07-09T14:49:26.816074679+09:00"
entries
를 보면 chart가 추가된 것을 볼 수 있다. 이는 archive 파일로 제공된 chart인 것이다.
만약, 기존에 있던 repository index에 새로운 repository index를 합치고 싶다면 어떻게해야할까?? 이 경우 --merge
명령어를 사용하면 된다.
먼저, workspace
directory를 만들도록 하자.
mkdir -p workspace/
다음으로 charts
directory에 있던 index.yaml
을 workspace
에 복사하도록 하자, 단 새로운 workspace index.yaml
과 merge할 것이기 때문에 index-old.yaml
로 복사해주도록 하자.
cp charts/index.yaml workspace/index-old.yaml
다음으로 helm chart를 만들고 workspace
directory에 package를 만들어주도록 하자.
helm create duperapp
Creating duperapp
helm package duperapp/ --destination workspace/
Successfully packaged chart and saved it to: workspace/duperapp-0.1.0.tgz
이제 workspace
directory에 index.yaml
이 만들어진 것을 볼 수 있다. 정리하자면 workspace
directory에는 duperapp
chart에 대한 package가 있고, 이전 repository index인 index-old.yaml
가 있다. 이제 이 둘을 merge해보도록 핮.
helm repo index workspace/ --merge workspace/index-old.yaml
workspace
의 index.yaml
을 확인해보도록 하자.
cat ./workspace/index.yaml
apiVersion: v1
entries:
duperapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:05:58.216110774+09:00"
description: A Helm chart for Kubernetes
digest: e35fd22130a95068db4508031f9ff47b43d1315f81d8f50813bdd376fd616cc0
name: duperapp
type: application
urls:
- duperapp-0.1.0.tgz
version: 0.1.0
superapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:00:33.771081921+09:00"
description: A Helm chart for Kubernetes
digest: 46af40ed79e2c018a6dcbdf1573848b58d6887f535dc5b7e365327ebce827e84
name: superapp
type: application
urls:
- superapp-0.1.0.tgz
version: 0.1.0
generated: "2024-07-09T15:05:58.215735196+09:00"
잘 연결된 것을 볼 수 있다.
그러나, 한 가지 조심해야할 점은 workspace
에 superapp-0.1.0.tgz
가 없다는 것이다. 따라서 workspace/index.yaml
와 workspace/duperapp-0.1.0.tgz
를 charts
directory에 넣어주거나, 반대로 charts
directory에 있는 superapp-0.1.0.tgz
를 workspace
에 전달해야한다.
우리의 경우 전자로 workspace
에 있는 file들을 charts
directory에 옮겨놓기로 하자.
mv workspace/duperapp-0.1.0.tgz charts/
mv workspace/index.yaml charts/
이제 charts/index.yaml
파일을 확인해보도록 하자.
cat charts/index.yaml
apiVersion: v1
entries:
duperapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:05:58.216110774+09:00"
description: A Helm chart for Kubernetes
digest: e35fd22130a95068db4508031f9ff47b43d1315f81d8f50813bdd376fd616cc0
name: duperapp
type: application
urls:
- duperapp-0.1.0.tgz
version: 0.1.0
superapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:00:33.771081921+09:00"
description: A Helm chart for Kubernetes
digest: 46af40ed79e2c018a6dcbdf1573848b58d6887f535dc5b7e365327ebce827e84
name: superapp
type: application
urls:
- superapp-0.1.0.tgz
version: 0.1.0
generated: "2024-07-09T15:05:58.215735196+09:00"
잘 합쳐진 것을 볼 수 있다.
단, 이러한 merge작업은 꽤나 위험한데 race condition에 대해서 조심히 사용해야한다. 잘못하면 merge 정보가 덮어쓰여질 수 있기 때문이다.
chart repository index를 만들었지만, 이 index를 기반으로 file server를 제공하기 위해서는 web server가 필요하다. python을 이용하여 file server를 만들어 repository에 존재하는 chart를 제공하도록 하자.
위에서 만든 charts
directory를 chart repository로 삼아서 chart를 제공하도록 하자.
( cd charts/ && python3 -m http.server --bind 127.0.0.1 8080 )
Serving HTTP on 127.0.0.1 port 8080 (http://127.0.0.1:8080/) ...
server가 실행된 것을 볼 수 있다.
이제 다른 terminal을 열어서 index.yaml
파일을 다운로드 해보도록 하자.
curl -sO http://localhost:8080/index.yaml
cat ./index.yaml
apiVersion: v1
entries:
duperapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:05:58.216110774+09:00"
description: A Helm chart for Kubernetes
digest: e35fd22130a95068db4508031f9ff47b43d1315f81d8f50813bdd376fd616cc0
name: duperapp
type: application
urls:
- duperapp-0.1.0.tgz
version: 0.1.0
superapp:
- apiVersion: v2
appVersion: 1.16.0
created: "2024-07-09T15:00:33.771081921+09:00"
description: A Helm chart for Kubernetes
digest: 46af40ed79e2c018a6dcbdf1573848b58d6887f535dc5b7e365327ebce827e84
name: superapp
type: application
urls:
- superapp-0.1.0.tgz
version: 0.1.0
generated: "2024-07-09T15:05:58.215735196+09:00"
필요한 chart들을 다운호드해보도록 하자. urls
를 path에 넣어주면 된다.
curl -sO http://localhost:8080/superapp-0.1.0.tgz
ls superapp-0.1.0.tgz
superapp-0.1.0.tgz