차트 고급 기능 사용하기(Advanced Charts)

헬름 + 쿠버네티스 가이드북
이민석's avatar
May 09, 2024
차트 고급 기능 사용하기(Advanced Charts)

헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.

가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.

개요

지난 시간들을 거쳐서 저희는 아래 순서로 학습을 진행했습니다.

  1. 헬름 작동 과정(Helm in Action)

  2. 헬름 고급 명령어(Advanced Commands)

  3. 차트 생성하기(Create Helm)

  4. 차트 탬플릿 딥다이브(Templates Deep Dive)

이 내용들을 기반으로 여러 의존성(Dependency) 간의 종속성이 복잡하게 얽혀있는 헬름 차트(Helm Chart)를 만들고 관리하기 위한 지식을 습득합니다.

종속성(dependency)

헬름 Charts.yaml 파일 안에 depdency를 추가하고 아래 명령어를 실행하는 것으로 종속성(dependency) 항목을 업데이트 할 수 있습니다.

helm dependency update <CHART_NAME>

예제 Charts.yaml 파일 및 프리뷰는 다음과 같습니다.

해당 차트를 설치하여 릴리즈를 생성해보겠습니다.

helm install myfirstapp 1-firstdependency

이후 아래 pods, deployments, services를 확인해보세요.

kubectl get pods
kubectl get deployments
kubectl get services 

버전 범위(version range)

헬름 종속성을 설치할 때, 버전을 범위로 명시하는 방법에 대해서 언급합니다.

사용 가능한 연산자는 다음과 같고 예제 코드에서 확인해보세요.

연산자

정의

예시

=

같은 버전

= 10.0.22

!=

해당 버전이 아닌 버전

!= 10.0.22

>

더 큰 버전

> 10.0.22

<

더 작은 버전

< 10.0.22

>=

더 크거나 같은 버전

>= 10.0.22

<=

더 작거나 같은 버전

<= 10.0.22

and

그리고

>= 8.0.0 and <= 10.0.0

|

또는

>= 10.0.0 | >= 8.0.0

^
(타일 기호)

명시된 버전의 다음 메이저 버전 아래까지 사용 가능

^1.3.4

아래와 같음

>= 1.3.4 and < 2.0.0

^2.x

아래와 같음
>= 2.0.0 and < 3

^0

아래와 같음

>= 0.0.0 and < 1.0.0

^0.2.4

아래와 같음
>= 0.2.4 and < 0.3.0

^1.3.x

아래와 같음
>=1.3.0 and < 2.0.0

~
(필드 기호)

명시된 버전의 다음 마이너 버전 아래까지 사용 가능

~ 1.3.4

아래와 같음
>= 1.3.4 and < 1.4.0

~ 2

아래와 같음

>= 2 and < 3

~ 2.3

아래와 같음
>= 2.3 and < 2.4

종속성 저장소(dependency repository)

지금까지 예제에서는 아래와 같이 url형태로 된 저장소 주소를 사용했습니다.

하지만 @<로컬에 추가된 레포지토리 이름>을 통해서 약칭으로 사용할 수도 있습니다.

  • @bitnami

이 이름은 helm repo list를 통해서 확인 가능한 레포지토리 이름입니다.

~>helm repo list

NAME    URL
bitnami https://charts.bitnami.com/bitnami

장점 보다 명확한 단점이 있기 때문에 권장하지 않습니다.

  • 장점 : 간결한 헬름 차트 이름

  • 단점 : 헬름 저장소가 등록되지 않으면 에러를 발생시킴

조건부 종속성(conditional dependency)

특정한 목적에 따라서 종속성을 조건부에 따라서 실행하고 싶다면, 아래와 샘플을 참고하세요.

조건부 종속성(conditional dependency) - 2

특정한 목적에 따라서 종속성을 조건부에 따라서 실행하고 싶다면, 아래와 샘플을 참고하세요.

tags 옵션을 활용하는 방식입니다.

종속성 변수 전달(Pass Values into Dependency)

아래와 같이 종속성 차트 내부에서 사용하는 변수를 직접 전달할 수 있습니다.

예를 들어 bitnami/mysql 이라는 차트가 Service:NodePort로 노출되는 포트를 30788로 고정하고 싶다고 생각하면 아래와 같이 할 수 있을 것입니다.

위 파일을 실행한 후 아래 명령어로 Service Node Port를 확인하세요.

kubectl get services
# 혹은
kubectl get svc

Export 사용해서 자식 변수 조회하기(Read Values from Child Charts, using export)

부모 차트에서 자식 차트의 변수 가져오는 법

  • Any Root Files

    export:
       service:
          port: 8080

  • Chart.yaml

    appVersion: "1.16.0"
    
    dependencies:
      - name: mysql
        version: "8.8.6'
        repositoriy: "https://charts.bitnami.com/bitnami"
        tags:
          - enabled
    
        import-values:
          - service

  • Use

    {{ .Values.service.port }}

Export 없이 자식 변수 조회하기(Read Values from Child Charts, without export)

  • Any Root Files

    export:
       service:
          port: 8080

  • Chart.yaml

    appVersion: "1.16.0"
    
    dependencies:
      - name: mysql
        version: "8.8.6'
        repositoriy: "https://charts.bitnami.com/bitnami"
        tags:
          - enabled
    
        import-values:
          - child: primary.service
            parent: mysqlService

  • Use

    {{ .Values.mysqlService.port }}

헬름 훅스(Helm Hooks)

헬름 릴리즈 과정에서 특별한 행동을 하고 싶다면 헬름 훅스(Helm Hooks)를 사용할 수 있습니다.

예를 들어 다음과 같은 작업들이 있을 수 있겠네요.

  1. 데이터베이스에 데이터를 저장하기

  2. 데이터베이스를 백업하기

아래 hookPod.yaml 예제 파일을 살펴봅시다.

  1. kind : 어떤 종류의 리소스도 hooks를 만들 수 있다.

  2. annotation: 이 훅파일이 언제 실행될지 연동

    1. helm.sh/hook: <HOOKS_NAME>,<HOOKS_NAME>, …

    2. helm.sh/hook-weight: 1

    3. helm.sh/hook-delete-policy: <HOOK-DELETE-POLICY>,<HOOK-DELETE-POLICY>, … → 언제 훅스 리소스가 삭제될 것 인지…

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "firstchart.fullname" . }}-pre-install"
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": hook-succeed

spec:
  containers:
   - name: pre-install
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ["sh", "-c", "echo Pod is Running"]
  restartPolicy: OnFailure

아래와 같은 훅스와 훅 삭제 정책이 존재합니다.

Hook Name

Description

pre-install

차트가 설치되기 전에 실행

post-install

차트가 설치된 후에 실행

pre-delete

차트가 삭제되기 전 실행

post-delete

차트가 삭제된 후에 실행

pre-upgrade

차트가 업그레이드 되기 전에 실행

post-upgrade

차트가 업그레이드 된 후에 실행

pre-rollback

차트가 롤백되기 전에 실행

post-rollback

차트가 롤백된 후에 실행

test

차트가 테스트 실행을 정의

Hook Delete Policy Name

Description

before-hook-creation

후크 리소스 생성 되기 전에 실행

hook-succeeded

후크 리소스 성공한 후에 실행

hook-failed

후크 리소스 실패한 후에 실행

헬름 테스트(Helm Test)

헬름 테스트와 헬름 훅스를 동시에 사용하여 어떤 작업을 진행할 수 있습니다.

테스트를 하고 싶은 친구는 반드시 릴리즈 되어 있어야 합니다.

  • Command

    helm test <RELEASE_NAME>
  • Service

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ include "firstchart.fullname" . }}
      labels:
        {{ - include "firstchart.labels" . | nindent 4 }}
    
    spec:
      type: {{ .Values.service.type }}
      ports:
       - port: {{ .Values.service.port }}
         targetPort: http
         protocol: TCP
         name: http
      selector:
        {{ - include "firstchart.selectorLabels" . | nindent 4 }}
  • Test Hooks

    apiVersion: v1
    kind: Service
    metadata:
      name: "{{ includ "firstchart.fullname" . }}-test-connection"
      label:
        {{ - include "firstchart.labels" . | nindent 4 }}
      annotations:
        "helm.sh/hook": test
    
    spec:
      containers:
       - name: wget
         image: busybox
         command: ['wget']
         args: [ '{{include "firstchart.fullname" . }}:{ .Values.service.port }}' ]
    
      restartPolicy: Never

실습

  • values.yaml

    tomcat:
      service:
        type: NodePort
        nodePort: 30007

  • Chart.yaml

    dependencies:
      - name: tomcat
        version: "11"
        repository: "http://charts.bitnami.com/bitnami"
        tags:
          - enabled

  • values.yaml

    tomcat:
      service:
        type: NodePort
        nodePorts:
          http: 30007

  • Ran this commands

    helm dependency update tomcatchart/
    helm install tomcatapp tomcatchart/
    helm ls
Share article

Unchaptered