helm

helm은 k8s 패키지 매니저다.

공식 문서에 흔한 그림 하나 없고 이래저래 영 마음에 들지 않아서 개념적으로 이해하는 데 필요 이상의 노력이 드는 것 같아서 어쩔 수 없이 따로 핵심만 추려서 정리해본다.

동작 구조

일단 k8s 패키지 매니저가 뭔지 그림으로 맛을 보자.

이해하기 쉽게 한 가지 방식만을 골라서 단순화 했으며, 실제로는 물론 여러가지 시나리오, 방식으로 구성할 수 있다.

Imgur

  • 개발자가 작성한 Helm Chart 를 helm push 명령으로 Helm Chart Repository에 업로드 한다.
  • 개발자가 만든 Container Image 를 docker push 명령으로 Container Registry에 업로드 한다.
  • 개발자가 k8s Control Plane 에 values.yaml 파일을 지정하면서 helm install 명령을 전달하면,
    • values.yaml 에 있는 값이 Helm Chart 에 주입되고 Helm Release 가 생성되고,
    • Helm Chart 에 들어있는 Image 정보를 통해 Container Image 를 가져와서 Helm Chart 정보를 토대로 Pod 등 k8s 자원이 생성된다.

주요 용어

helm chart

  • k8s 자원 yaml 파일을 만들 수 있는 여러 yaml 템플릿 파일과 설정값이 들어 있는 values.yaml 파일로 이루어진 파일 세트
  • 대략 아래와 같은 파일이 모여있는 디렉터리라고 봐도 크게 틀리지 않는다. 아래 내용은 helm 한글 문서 https://helm.sh/ko/docs/topics/charts/#차트-파일-구조 에서 가져왔다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CHART이름/  
    Chart.yaml # 차트에 대한 정보를 가진 YAML 파일
    LICENSE # 옵션: 차트의 라이센스 정보를 가진 텍스트 파일
    README.md # 옵션: README 파일
    values.yaml # 차트에 대한 기본 환경설정 값들
    values.schema.json # 옵션: values.yaml 파일의 구조를 제약하는 JSON 파일
    charts/ # 이 차트에 종속된 차트들을 포함하는 디렉터리
    crds/ # 커스텀 자원에 대한 정의
    templates/ # values와 결합될 때, 유효한 쿠버네티스 manifest 파일들이 생성될 템플릿들의 디렉터리
    templates/NOTES.txt # 옵션: 간단한 사용법을 포함하는 텍스트 파일
  • templates 폴더 안에는 다음과 같은 k8s 자원 yaml 파일이 들어있다. 아래 내용은 helm 한글 문서 https://helm.sh/ko/docs/chart_template_guide/getting_started/#mycharttemplates-훑어보기 에서 가져왔다.

    1
    2
    3
    4
    NOTES.txt : 차트의 "도움말". 이것은 helm install 을 실행할 때 사용자에게 표시될 것이다.
    deployment.yaml : 쿠버네티스 디플로이먼트를 생성하기 위한 기본 매니페스트
    service.yaml : 디플로이먼트의 서비스 엔드포인트를 생성하기 위한 기본 매니페스트
    _helpers.tpl : 차트 전체에서 다시 사용할 수 있는 템플릿 헬퍼를 지정하는 공간
    • 예를 들어 deployment.yaml 파일에 아래와 같은 내용이 있고, helm install 실행 시 사용되는 values.yaml 파일에 spring.configLocation이라는 항목(key)이 있다면 그 값을 SPRING_CONFIG_LOCATION 환경변수에 저장한다.

      1
      2
      3
      4
      5
      env:
      {{- if hasKey .Values.spring "configLocation" }}
      - name: SPRING_CONFIG_LOCATION
      value: '{{ toString .Values.spring.configLocation }}'
      {{- end}}
  • values.yaml 파일도 포함돼 있는데 이 파일을 사용할 수도 있고, helm chart 밖에 존재하는 별도의 values.yaml 파일을 지정해서 사용할 수도 있다. 위 그림에 나온 방식은 별도의 values.yaml 파일을 사용하고 있다.

helm release

  • helm install 명령 실행 결과로 생성되며, helm chart의 인스턴스라고 볼 수 있다.
  • 하나의 helm chart 에
    • 서로 다른 values.yaml 을 적용해서 내용적으로 다른 여러 helm release 를 만들 수도 있고,
    • 동일한 values.yaml 을 적용하되 release 이름을 다르게 지정해서 내용적으로는 동일한 여러 helm release 를 만들 수도 있다.
  • helm chart 및 values.yaml 파일의 내용 변경을 k8s 자원에 반영해야 할 때 helm upgrade 명령을 통해 release 의 내용을 변경할 수 있다.

주요 명령

사실 이런 건 그냥 공식 문서를 보고 알 수 있어야 하는데, helm 문서에 나온 설명에 혼동을 불러일으키는 부분이 많아서 어쩔 수 없이 일부만 정리한다.

이 명령 사용법만 알면 나머지 다른 명령은 큰 혼동 없이 문서를 보고도 이해할 수 있을 것이다.

helm push

1
2
형식: helm push 올릴chart경로 helmRepo이름
예제: helm push deploy/my-chart my-repo
  • git push 와 비슷하다고 보면 된다.
  • helm chart를 helm repository에 저장한다.

helm install

1
2
형식: helm install -n k8sNamespace 생성될release이름 사용할chart이름 -f 사용할valuesyaml파일경로
예제: helm install -n my-namespace my-release my-repo/my-chart -f deploy/values-my-values.yaml
  • package.json 내용 대로 패키지를 가져와서 설치하는 npm install 과 비슷하다고 보면 된다.
  • helm repository에 저장된 helm chart를 가져오고,
  • 명시적으로 지정한 values-xxx.yaml 에 있는 값을 helm chart 에 포함돼 있는 여러 k8s yaml template 파일에 주입해서,
  • k8s 자원 yaml을 생성할 수 있는 helm release 를 생성하고,
  • helm chart 에 지정돼 있는 위치에서 컨테이너 이미지를 가져와서 실제로 k8s에 자원을 생성한다.
  • 복잡해 보이지만 위 그림을 다시 보면 더 쉽게 이해할 수 있다.

helm uninstall

1
2
형식: helm uninstall -n k8sNamespace 삭제할release이름
예제: helm uninstall -n my-namespace my-release
  • install 에 의해 생성된 helm release를 삭제하고 k8s에 생성됐던 deployment 등 관련 자원도 모두 삭제된다.

helm upgrade

1
2
형식: helm upgrade -n k8sNamespace release이름 사용할chart이름 -f 사용할valuesyaml파일경로
예제: helm upgrade -n my-namespace my-release my-repo/my-chart -f deploy/values-my-other-values.yaml
  • install 에 의해 생성된 helm release의 내용을 변경한다.

실무 사용 참고

  • 소스 코드에서 컨테이너 이미지를 만들어 컨테이너 레지스트리에 업로드 하는 일은 보통 jenkins 등 CI 도구를 사용해서 처리한다.
  • 소스 코드가 공개 repo에 있다면 ArgoCD 를 k8s 클러스터 내부에 구성해서 편리하게 배포할 수 있다.
  • 소스 코드가 비공개 repo에 있다면 이 비공개 repo에 접근할 수 있는 곳에 CI용 jenkins를 두고, k8s 클러스터 내부에 CD용 jenkins를 둬서, CI용 jenkins가 이미지를 컨테이너 레지스트리에 올린 후에 CD용 jenkins를 호출(HTTP API)해서 배포할 수 있다.
  • 소스 코드가 변경됐다면 그에 따른 image 만 변경하면 되므로 CI-CD만 하면 되고, helm 작업(install 또는 upgrade)은 다시 할 필요가 없다.
  • 소스 코드는 변경이 없는데 helm chart나 values.yaml 파일만 변경됐다면 helm upgrade만 다시 하면 배포까지 되고 CI-CD 작업은 다시 할 필요가 없다.

helm chart 작성

작성 방법은 공식 문서 https://helm.sh/ko/docs/chart_template_guide/ 를 참고한다.


크리에이티브 커먼즈 라이선스HomoEfficio가 작성한 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.