Helm 차트 제작과 배포 · 차트 꾸리기와 사설 저장소 · 실습
차트를 꾸려 사설 저장소에 올리고 다시 받아 온다
목표
차트 디렉터리를 tgz 로 꾸리고, 색인을 만들어 사설 HTTP 저장소로 올리고, 그 저장소에서 판을 골라 받아 오고, 다른 차트의 의존성으로 잠그는 한 바퀴를 손으로 돌린다.
왜 중요한가
차트가 내 디렉터리를 떠나는 순간 남는 것은 tgz 와 index.yaml 두 가지뿐이다. 차트 저장소는 그 둘을 내려 주는 정적 HTTP 서버 이상이 아니고, 그래서 사내 저장소를 세우는 일은 생각보다 작다. 대신 작아서 생기는 사고가 있다 — 색인은 자동으로 갱신되지 않으므로 새 판을 올릴 때 --merge 를 빠뜨리면 옛 판이 목록에서 통째로 사라진다. 받는 쪽에서는 version 과 appVersion 을 혼동해 '애플리케이션은 그대로인데 왜 판이 올랐냐' 는 질문이 반복된다. 마지막으로 의존성은 build 와 update 중 무엇을 쓰느냐에 따라 CI 가 재현 가능한 빌드를 하기도 하고 매번 다른 판을 물어 오기도 한다. 이 세 가지를 한 번씩 직접 일으켜 보면 다음부터는 눈에 보인다.
단계
1. /root/hc-package 에서 helm create catalog 로 차트를 만들고, /root/hc-package/catalog/Chart.yaml 의 version 을 1.0.0, appVersion 을 "2.4.0", description 을 상품 목록 서비스 로 바꾸세요. 이 두 버전이 서로 다른 것을 가리킨다는 사실이 이 실습 내내 판정 기준입니다.
2. /root/hc-package/repo 디렉터리에 catalog 를 두 번 꾸리세요. 첫 번째는 차트 버전 1.0.0 · appVersion 2.4.0, 두 번째는 차트 버전 1.1.0 · appVersion 2.5.0 입니다. Chart.yaml 을 다시 고치지 말고 helm package 의 옵션으로 덮어쓰세요. 결과 파일 이름이 무엇으로 정해지는지 확인하세요.
3. helm repo index 로 /root/hc-package/repo/index.yaml 을 만드세요. 색인에 catalog 항목이 두 판 모두 들어 있어야 하고, 각 판에 digest 와 urls 가 있어야 합니다. 색인을 열어 appVersion 이 판마다 다르게 적혀 있는 것을 확인하세요.
4. /root/hc-package/repo 를 python3 -m http.server 8971 --bind 127.0.0.1 로 서빙한 뒤, helm repo add hclocal http://127.0.0.1:8971 로 등록하고 helm repo update hclocal 을 돌리세요. 차트 저장소가 정적 HTTP 서버 그 이상이 아니라는 것을 여기서 확인합니다.
5. helm search repo hclocal/catalog 를 모든 판이 나오도록 돌려 결과를 JSON 으로 /root/hc-package/out/search.json 에 저장하세요. 아무 옵션 없이 검색하면 몇 개가 나오는지도 먼저 보세요.
6. 저장소에서 1.0.0 판을 골라 /root/hc-package/pulled 아래로 풀어 받으세요(/root/hc-package/pulled/catalog/Chart.yaml 이 생겨야 합니다). 이어서 1.1.0 판의 Chart.yaml 을 /root/hc-package/out/show-1.1.0.txt 에, 기본값을 /root/hc-package/out/show-values.yaml 에 저장하세요. 받아서 풀지 않고도 내용을 볼 수 있다는 것이 요점입니다.
7. /root/hc-package/stage 에 차트 버전 1.2.0 · appVersion 2.6.0 을 꾸린 뒤, 기존 색인을 합쳐서 /root/hc-package/stage/index.yaml 을 만드세요. 합친 색인에는 세 판이 모두 있어야 합니다. 그다음 stage 의 tgz 와 index.yaml 을 /root/hc-package/repo 로 옮기고 helm repo update hclocal 을 돌려 세 판이 검색되는지 확인하세요.
8. /root/hc-package/storefront 차트를 만들어 catalog 1.1.0 을 저장소(http://127.0.0.1:8971)에서 받아 오도록 선언하고 의존성을 확정하세요. 그다음 선언을 1.2.0 으로 올리고 helm dependency build 를 먼저 돌려 그 출력을 /root/hc-package/out/dep-build-error.txt 에 저장한 뒤, 알맞은 명령으로 다시 확정하세요. 끝나면 Chart.lock 이 1.2.0 이고 /root/hc-package/storefront/charts/catalog-1.2.0.tgz 가 있어야 합니다.
참고
helm package <차트> --version <v> --app-version <a> -d <디렉터리>helm repo index <디렉터리> --merge <옛 index.yaml>helm search repo <저장소>/<차트> --versions -o json- helm 3 은
file://를 저장소 프로토콜로 받지 않는다 — 이 파드에서는python3 -m http.server로 띄운다 - 흔한 실수: 새 판을 올릴 때 색인을 합치지 않아 옛 판이 사라진다
- 흔한 실수: Chart.yaml 의 의존성 판을 고친 뒤
helm dependency build를 돌려 lock 어긋남 오류를 만난다 - 공식 문서: https://helm.sh/docs/topics/chart_repository/ · https://helm.sh/docs/helm/helm_repo_index/
단계 8개
- 꾸릴 차트에 신원을 먼저 적는다
- 두 판을 꾸려서 tgz 를 만든다
- 저장소 색인을 만든다
- 저장소를 띄우고 helm 에 등록한다
- 판을 모두 보이게 검색한다
- 옛 판을 골라 받아서 풀어 본다
- 새 판을 올리면서 옛 판을 지우지 않는다
- 저장소에서 의존성을 잠그고, 잠금이 어긋나게 만든다