helm을 배워보자 8일차 - chart repositories

0

helm

목록 보기
8/8

Chart Repositories

chart repository는 package를 end user에게 공유하고 배포하는 방법으로, chart를 검색하고 다운로드 할 수 있도록 해준다. chart repository는 HTTP(s) web service로 제공되어 마치 debian package repository, fedora package database와 비슷하게 동작한다.

Repository index

모든 chart repository들은 index.yaml이라는 special repository index file을 가지고 있는데, 이는 이용가능한 모든 chart들과 각각의 다운로드 location을 항목화하고 있다.

다음은 기본적인 index.yaml file의 예시이다.

  • index.yaml
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에 따라 설치가 가능한 것이다.

  • index.yaml
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으로 되어있는 것을 알 수 있다.

Index 생성

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에 새로운 repository index를 합치고 싶다면 어떻게해야할까?? 이 경우 --merge 명령어를 사용하면 된다.

먼저, workspace directory를 만들도록 하자.

mkdir -p workspace/

다음으로 charts directory에 있던 index.yamlworkspace에 복사하도록 하자, 단 새로운 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

workspaceindex.yaml을 확인해보도록 하자.

  • 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"

잘 연결된 것을 볼 수 있다.

그러나, 한 가지 조심해야할 점은 workspacesuperapp-0.1.0.tgz가 없다는 것이다. 따라서 workspace/index.yamlworkspace/duperapp-0.1.0.tgzcharts directory에 넣어주거나, 반대로 charts directory에 있는 superapp-0.1.0.tgzworkspace에 전달해야한다.

우리의 경우 전자로 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 셋업

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

0개의 댓글