본문 바로가기
DevOps/Kubernetes

Helm Chart 소개

by 비어원 2023. 9. 17.
728x90

Helm

보통 쿠버네티스에서 리소스 관리는 yaml 파일로 저장하여 관리한다. 그리고 하나의 애플리케이션을 쿠버네티스 환경으로 배포할 때는 Deployment와 같은 워크로드를 생성하는 것이 전부가 아니다. 서비스 디스커버리와 로드밸런싱 기능을 제공하는 Service도 생성해야 하고, 애플리케이션 설정 정보를 담는 ConfigMap, Secret도 추가해야 하고, 애플리케이션 안에서 쿠버네티스 리소스를 참조해야 한다면 Role, RoleBinding, ServiceAccount 등 여러가지 쿠버네티스 리소스가 추가되어야 한다.

 

이와같이 보통 마이크로서비스를 배포할 때 각 마이크로서비스마다 비슷한 패턴으로 쿠버네티스 리소스를 추가하게 된다. 배포해야 할 마이크로서비스가 적다면 큰 문제는 없겠지만 많아진다면 관리해야 하는 yaml 파일들이 엄청 많아지고 관리가 어렵게 된다. 또 추후에 공통적으로 변경해야 할 필드가 있을 때 변경해야 할 yaml 파일을 찾아가면서 수정해야 하는데, 이것은 사람이 하는 것이기 때문에 놓치는 부분도 없지않아 있을 것이다.

 

그래서 마이크로서비스를 배포할 때 필요한 공통된 쿠버네티스 리소스를 하나로 묶고 마이크로서비스 별로 달라지는 값을 변수화하여 관리하면 편할 것이다. 이렇게 배포에 필요한 쿠버네티스 리소스들을 하나로 패키징해서 사용할 수 있도록 기능을 제공하는 도구가 있는데 대표적으로 Helm이 있다.

 

 

Helm

Helm은 대표적인 쿠버네티스 리소스 패키지 도구이다. Helm은 Charts 라는 패키지 포멧을 사용하는데, 차트는 쿠버네티스의 리소스와 관련된 세트를 설명하는 파일의 모음이다. 하나의 차트를 통해 아주 간단한 파드를 배포하는 것도 가능하며 HTTP서버, DB 등을 가지는 완전한 웹앱을 하나로 묶어서 배포하는 것도 가능하다.

설치

Mac OS에서는 brew로 helm 패키지 매니저를 간단하게 설치할 수 있다.

$ brew install helm

 

Helm 차트

Helm 차트를 생성하는 것은 간단하다. 로컬 환경에서 사용하려면 간단히 디렉터리 하나를 생성하여 디렉터리 내부를 정해진 차트 파일 구조 형태로 만들기만 하면 된다. 로컬 환경이 아닌 원격 환경에서 사용하려면 Helm 차트 레지스트리가 필요하다. 일단 로컬에서 차트를 만드는 방법부터 알아보자.

 

파일 구조

차트는 디렉터리 내부의 여러 파일들로 구성된다. 차트를 구성하는 최상위 디렉터리 이름은 차트의 이름이다. 차트를 구성하는 디렉터리 구조는 다음과 같다.

chart
|- Chart.yaml
|- LICENSE                            # OPTIONAL
|- README.md                        # OPTIONAL
|- values.yaml
|- values.schema.json        # OPTIONAL
|- charts                                # OPTIONAL
|   |- ...
|- crds                                    # OPTIONAL
|   |- ...
|- templates
    |- NOTES.txt                # OPTIONAL
    |- ...
  • Chart.yaml: 차트에 대한 정보를 정의
  • LICENSE: 차트에 대한 라이선스를 포함하는 텍스트 파일
  • README.md: 차트 설명하는 md파일, 보통 values.yaml 변수에 대한 설명을 적을 때 사용한다.
  • values.yaml: 차트에 대한 기본 구성 value 파일
  • values.schema.json: values.yaml 파일에 구조체(?)를 적용하기 위한 json 스키마
  • charts/: 해당 차트가 의존하는 모든 차트를 포함하는 디렉터리
  • crds/: 차트에서 사용하는 CRD를 보관하는 디렉터리
  • templates/: 쿠버네티스 리소스에 대한 템플릿을 보관하는 디렉터리
    • NOTES.txt: 사용법에 대해 적어놓는 txt파일

여기서 필수로 여겨지는 파일에 대해 알아보자.

 

Chart.yaml

Chart.yaml 파일은 차트에 대한 정보를 정의하는 파일이다. 일종의 메타데이터를 저장하는 파일이라고 보면 된다. 이 파일 안에는 차트 이름과 버전 등의 정보를 저장한다.

apiVersion: v2
name: spring-app
version: 0.1.0
appVersion: 0.1.0
kubeVersion: ">= 1.27.0"
description: "Spring application server"
home: https://chart.beerone.com
maintainers:
  - name: beerone
    email: floidea2@gmail.com
  • apiVersion: helm3 부터는 무조건 v2
  • name: 차트 이름
  • version: helm 도구에서 사용하는 버전
  • appVersion: 애플리케이션의 버전
  • kubeVersion: 지원되는 쿠버네티스 버전 명시 (Optional)
    • >= 1.13.0 < 1.15.0 / >= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0 ...
  • home: 프로젝트 홈페이지 url
  • maintainers: author 같은 것

 

templates

templates는 Helm 차트의 템플릿 부분으로, 한 묶음으로 패키징할 쿠버네티스 리소스들을 template 디렉터리 하위의 manifest 파일 형태로 저장한다. templates에 저장되는 yaml 파일은 Go Template 형식으로 작성할 수 있다.

예를 들면 다음과 같이 작성할 수 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ .Values.app.name }}
  name: {{ .Values.app.name }}
spec:
  replicas: {{ .Values.app.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.app.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
    spec:
      containers:
      - image: {{ .Values.app.image }}
        name: {{ .Values.app.name }}
  • {{, }} 사이에 들어간 값은 템플릿 변수로, 실제로 차트를 배포할 때 차트의 values.yaml에 있는 값으로 변수를 바인딩한다.

 

values.yaml

values.yaml은 helm chart에 있는 템플릿 변수를 바인딩할 값을 선언하는 파일이다. 차트에 있는 values.yaml에 선언된 변수들은 차트의 기본 값이 된다.

app:
  name: todo-api
  replicas: 1
  image: beer1/todo-server-kotlin:0.1.0

helm chart로 쿠버네티스로 배포하는 것은 지정한 values.yaml의 변수들을 template 파일에 있는 템플릿 변수에 바인딩 하여 매니페스트를 생성한 후 쿠버네티스에 적용한다고 보면 된다. 위의 예시에서는 기본 values.yaml으로 helm chart로 배포한다면 다음 쿠버네티스 리소스가 적용된다고 보면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: todo-api
  name: todo-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: todo-api
  template:
    metadata:
      labels:
        app: todo-api
    spec:
      containers:
      - image: beer1/todo-server-kotlin:0.1.0
        name: todo-api

 

Chart 배포하기

위의 내용대로 차트를 생성하면 차트의 디렉터리 구조는 다음과 같을 것이다.

.
└── spring-app
    ├── Chart.yaml
    ├── templates
    │   └── deployment.yaml
    └── values.yaml

 

차트에 정의한 기본 values.yaml 파일으로 차트를 배포하려면 아래 명령어를 사용하면 된다.

# helm install $CHART_DIR -n $NAMESPACE
$ helm install todo-api ./spring-app -n todo
NAME: todo-api
LAST DEPLOYED: Sun Sep 17 17:14:38 2023
NAMESPACE: todo
STATUS: deployed
REVISION: 1
TEST SUITE: None

 

실제로 차트 내 템플릿에 선언한 쿠버네티스 리소스들이 잘 생성되었는지 확인해보자.

$ kubectl get po -n todo
NAME                        READY   STATUS    RESTARTS   AGE
todo-api-5448d4cb5b-ct8vs   1/1     Running   0          13s

만약 차트에 설정된 기본값이 아닌 다른 values.yaml 파일을 사용하려면 다음 명령어를 사용하면 된다.

# helm install $CHART_DIR -n $NAMESPACE -f $VALUES_FILE
$ helm install todo-api ./spring-app -n todo -f ./values.yaml

 

 

바인딩된 매니페스트 얻기

helm install을 하면 템플릿 파일에 있는 템플릿 변수를 values.yaml에 선언된 값으로 바인딩 한 후에 매니페스트를 쿠버네티스로 반영한다. 그런데 바로 쿠버네티스로 반영하지 않고 디버깅의 목적으로 템플릿이 어떻게 바인딩 되는지 확인을 하고 싶을 때가 있다. 그럴 때는 helm template 명령어를 사용하면 된다.

 

helm template

helm template 명령어는 단순 템플릿 파일에 있는 변수들을 values.yaml에 선언된 값으로 바인딩 후 매니페스트를 출력해준다. 사용법은 install 명령어와 같다.

# helm template $CHART_DIR -n $NAMESPACE -f $VALUES_FILE
$ helm template todo-api ./spring-app -n todo
---
# Source: spring-app/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: todo-api
  name: todo-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: todo-api
  strategy: {}
  template:
    metadata:
      labels:
        app: todo-api
    spec:
      containers:
      - image: beer1/todo-server-kotlin:0.1.0
        name: todo-api
728x90

댓글