LabHub

Helm 차트 제작과 배포 · 의존성과 훅 · 실습

서브차트 붙이고 훅으로 순서 만들기

LabHub 에서 이어서 보기

목표

독립된 두 차트를 부모와 서브차트로 조립하고, 값 전달·조건부 활성화·전역 값·훅까지 의존성 관리의 네 축을 모두 손으로 만듭니다.

왜 중요한가

플랫폼 차트를 만들다 보면 반드시 "이 컴포넌트를 같은 차트에 넣을까, 따로 뺄까"라는 질문을 만납니다. 의존성은 그 사이의 답입니다. 자식은 혼자서도 설치 가능한 독립 차트로 남고, 부모는 그것을 선언으로 끌어다 쓰면서 값을 덮어씁니다. 이때 규칙은 하나뿐입니다 — 부모 values 에서 서브차트 이름과 같은 키 아래에 적은 것이 자식의 .Values 최상위가 된다. 부모와 자식 모두에게 닿아야 하는 값만 global 아래에 둡니다. 그리고 이 환경은 인터넷이 없으므로 저장소는 반드시 file:// 로컬 경로여야 합니다. 이는 제약이 아니라 실무에서도 흔한 구성입니다 — 저장소 하나에 여러 차트를 두고 서로 참조할 때 쓰는 바로 그 방식입니다. 마지막으로 훅은 배포 안에 순서를 만드는 유일한 수단이지만, 훅 리소스는 릴리스가 소유하지 않으므로 삭제 정책을 적지 않으면 배포할 때마다 쌓입니다.

단계

1. /root/helm/deps/cache 에 이름이 cache 인 차트를, /root/helm/deps/platform 에 부모가 될 차트를 각각 만드세요. 두 차트 모두 Chart.yaml, values.yaml, templates/ 를 갖춰야 합니다. /root/helm/deps/cache/values.yamlreplicaCount1 로 둡니다. 산출물 디렉터리 /root/helm/deps/out 도 미리 만드세요.
2. /root/helm/deps/platform/Chart.yamldependencies 첫 항목에 name: cache, repository: "file://../cache", version 은 cache 차트의 version 과 같은 값(예: 0.1.0), condition: cache.enabled 를 적으세요. 인터넷이 없으므로 원격 저장소 URL 은 동작하지 않습니다.
3. helm dependency update /root/helm/deps/platform 을 실행하세요. /root/helm/deps/platform/Chart.lock 이 생겨야 하고, 그 안의 첫 의존성 이름이 cache, digestsha256: 으로 시작해야 하며, /root/helm/deps/platform/charts/ 안에 cache 패키지가 놓여야 합니다.
4. /root/helm/deps/platform/values.yamlcache.enabled: truecache.replicaCount: 3 을 적고 helm template platform /root/helm/deps/platform > /root/helm/deps/out/rendered.yaml 로 렌더링하세요. 이름에 cache 가 들어간 Deployment 의 spec.replicas 가 3이어야 합니다. 이때 /root/helm/deps/cache/values.yamlreplicaCount 는 반드시 1 그대로 두세요 — 부모가 덮어쓰는 것을 확인하는 단계입니다.
5. helm template platform /root/helm/deps/platform --set cache.enabled=false > /root/helm/deps/out/disabled.yaml 을 저장하세요. 이 파일에는 cache 라는 문자열이 한 군데도 없어야 하고, 부모 차트의 오브젝트는 그대로 남아 있어야 합니다(오브젝트 1개 이상). 부모 차트 자신의 리소스 이름이나 내용에 cache 라는 단어를 쓰지 마세요.
6. /root/helm/deps/platform/values.yamlglobal.environment: stage 를 두고, 부모와 서브차트 양쪽 템플릿의 metadata.labelslabhub.io/environment: {{ .Values.global.environment }} 를 붙이세요. 다시 렌더링한 /root/helm/deps/out/rendered.yamllabhub.io/environment: stage 줄이 2개 이상 있어야 하고, 이름에 cache 가 들어간 오브젝트에도 그 라벨이 있어야 합니다.
7. /root/helm/deps/platform/templates/ 에 훅 Job 을 하나 추가하세요. 이름은 {{ .Release.Name }}-db-migrate 처럼 짓고(이름에 cache 를 넣지 마세요), 어노테이션으로 helm.sh/hook: pre-install,pre-upgrade, helm.sh/hook-weight: "-5", helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded 를 답니다. 훅이 포함된 렌더링을 /root/helm/deps/out/hooks.yaml 로 저장하세요(helm template 은 기본적으로 훅도 함께 출력합니다).
8. /root/helm/deps/out/deps-report.json 을 만드세요. 키는 네 개입니다. object_count/root/helm/deps/out/rendered.yaml 에서 kind: 로 시작하는 줄의 개수, subcharts["cache"], lock_digest/root/helm/deps/platform/Chart.lockdigest 값 그대로, hooks 는 훅 리소스 이름을 담은 배열(1개 이상)입니다. 또한 렌더링된 Deployment 이름 중 하나에는 릴리스 이름 platform 이 들어 있어야 합니다.

참고

단계 8개

  1. 서브차트와 부모 차트 준비하기
  2. 부모 Chart.yaml 에 의존성 선언하기
  3. 의존성 확정하고 charts/ 채우기
  4. 부모에서 서브차트 값 덮어쓰기
  5. condition 으로 서브차트 끄기
  6. global 값을 서브차트까지 전달하기
  7. 설치 훅 붙이기
  8. 엄브렐라 렌더링 보고서 만들기