Helm 차트 생성 및 설치

George(박상조)
번개장터 기술 블로그
9 min readSep 5, 2019

안녕하세요. 번개장터 소프트웨어 엔지니어 박상조입니다. 이번 포스팅에서는 Helm의 차트에 대해 알아보고자 합니다.

차트 생성과 설치

먼저 차트에 관해서 알아야 할 점이 2가지가 있습니다. 먼저 차트를 설치하는 법을 알아야 하고 필요하다면 만드는 법도 알아야 합니다.

차트 설치

Helm에서 차트를 설치하는 방법은 사실 매우 간단합니다. 예시로 Kubernetes에서 매트릭을 볼 수 있게 해주는 metrics server를 예시로 사용법을 알려드리겠습니다.

우선 metrics server는 helm의 기본 stable 저장소에도 있지만 저장소를 추가해 설치하겠습니다.

helm repo add bitnami https://charts.bitnami.com/bitnami

이렇게 추가되는 저장소는 로컬의 helm Client에 추가되므로 각각의 사용자가 추가하고 관리해야 합니다. 그럼 이제 최신상태로 업데이트해 보겠습니다.

helm repo update

이렇게 업데이트해 줘야 차트를 통해 배포하려는 애플리케이션의 최신 버전을 설치할 수 있습니다. 그럼 우리가 설치할 metrics server를 한 번 찾아볼까요?

helm search metrics-server

그럼 아래와 비슷한 결과를 볼 수 있습니다.

bitnami/metrics-server 3.1.2         0.3.4       Metrics Server is a cluster-wide aggregator of resource u...stable/metrics-server  2.8.5         0.3.4       Metrics Server is a cluster-wide aggregator of resource u...

우리가 위에서 bitnami 저장소를 추가했기 때문에 기본 저장소인 stable과 우리가 추가한 bitnami 두 저장소의 metrics server를 볼 수 있습니다. 원하는 쪽으로 설치하시면 됩니다. 저는 bitnami의 metrics server를 설치해 보도록 하겠습니다.

helm install --name metrics-server bitnami/metrics-server --set apiService.create=true

하나하나 설명해 드리자면 먼저—-name metrics-server는 내가 배포한 차트의 Release Name 입니다. 이 이름을 이용해 배포된 차트를 확인하고 수정하고 삭제할 수 있습니다. 따라서 다른 배포된 차트의 이름과 겹치면 안 됩니다. 만약 설정하지 않으면 랜덤한 두 단어의 조합으로 만들어진 이름을 사용하게 됩니다.

bitnami/metrics-server는 우리가 현재 설치할 차트입니다.

—-set apiService.create=true 이 부분도 중요한 부분 중 하나입니다. 보통 이렇게 공개된 차트들은 문서로 관리하는 변수목록이 있습니다. bitnami/metrics-server의 경우

위 주소에서 확인할 수 있는데 global.imageRegistry, image.registry 등 많은 변수가 있고 — set을 통해 배포 시점에 각 변수의 값을 지정할 수 있습니다. 이게 Helm의 큰 장점 중 하나입니다.

이렇게 변수를 지정하는 방법은 크게 두 가지가 있는데 하나는 위와 같은 방법이고 하나는 yaml 파일을 만들어서 사용하는 방법입니다.

# metrics-server-values.yamlapiService:
create: "true"

위와 같이 yaml 파일을 만들어 주고

helm install --name metrics-server bitnami/metrics-server -f metrics-server-values.yaml

위와 같이 사용할 수 있습니다. 만약 너무 많은 변수를 한 번에 적용해야 하거나 적용한 변수들을 보관해야 할 경우에 사용할 수 있습니다.

차트 생성

사실 Helm을 다른 사람이 만들어놓은 차트를 간편하게 설치하는 용도로만 사용한다면 위의 설치 방법만 아셔도 상관없습니다. 하지만 본인의 애플리케이션을 배포하는데 사용한다면 차트를 만들고 관리해야 합니다.

먼저 간단하게 차트를 하나 생성해 보겠습니다.

helm create hello-world

그러면 아래와 같이 폴더가 생깁니다.

hello-world
|-- Chart.yaml
|-- charts
|-- templates
| |-- NOTES.txt
| |-- _helpers.tpl
| |-- deployment.yaml
| |-- ingress.yaml
| `-- service.yaml
`-- values.yaml

먼저 Chart.yaml 같은경우는 이 차트의 정보를 담아놓는 파일입니다. 버전과 설명, 이름 등을 설정할 수 있습니다.

charts 디렉토리의 경우 다른 의존성 있는 차트를 사용해야 할 때 필요한 폴더입니다.

templates 디렉토리가 우리가 실제 배포하고 싶은 템플릿들을 넣어놓는 곳이고 values.yaml이 우리가 기본으로 지정해 놓을 변수들이 들어가는 파일입니다. 예시로 만들어진 deployment.yaml을 보면서 설명하겠습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "hello-world.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "hello-world.name" . }}
helm.sh/chart: {{ include "hello-world.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "hello-world.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "hello-world.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | }}
{{- end }}

아마 Kubernetes의 yaml 파일을 많이 보셨다면 어느 정도 익숙하실 겁니다. 다른점이라면 {{}}로 둘러싸인 부분일 겁니다. 이 중괄호로 처리된 부분이 바로 Helm에서 변수를 사용하는 부분입니다.

include … 로 시작하는 변수들은 _helpers.tpl 파일에서 할당한 변수를 사용하는 구문입니다.

.Release로 시작하는 변수들은 배포할 때에 할당한 정보들을 사용하는 구문입니다. 따라서 .Release.Name 의 경우 --name metrics-server로 배포한다면 metric-server 라는 값이 들어가게 됩니다.

.Values 로 시작하는 변수들은 우리가 values.yaml 파일에서 지정해 놓은 값이 들어가거나--set 또는 -f 등으로 넣어 준 변수들이 들어가는 자리입니다.

이 외에도 toYaml 같은 기본 함수와 여러 가지 많은 기능을 제공하지만, 이 포스트에서 다 다룰 수가 없어서 가장 중요하다고 생각되는 기본 사용법은 여기까지로 하고 나머지는 공식문서를 참고해 주시기 바랍니다.

https://helm.sh/docs/

만든 차트 설치

이렇게 차트를 생성하고 나면 설치를 해야 하는데 패키징을 하고 저장소를 만들어 관리하는 방법이 있지만 여기서는 간단하게 만든 차트를 배포하는 방법만 알려드리도록 하겠습니다.

먼저 문제가 없이 템플릿이 잘 만들어지는지 확인하려면 자신이 만든 차트 디렉토리를 인자로 넣어주면 됩니다.

helm template hello-world

만약 템플릿이 문제없이 만들어졌다면

helm install hello-world

같은 명령어로 설치할 수 있습니다.설치할 때 변수를 지정하고 싶다면 2가지 방법이 있습니다. --set 이나 -f 옵션을 사용할 수 있습니다. 두 방식의 차이점은 커맨드라인에서 넣느냐 파일로 만들어서 넣느냐 입니다. 예를들어name 이라는 변수를 지정한다고 하면

helm install --set name=NAME hello-world

위와 같이 --set 옵션을 사용하는 방법이 있고

#myValue.yamlname: NAME

위와 같이 파일을 만들고

helm install -f myValue.yaml hello-world

위와 같이 파일을 인자로 넘겨주는 방식도 있습니다. 설치할 때 결정해야하는 변수냐 상황에따라 보관하거나 관리해야하는 변수냐에 따라 맞는 방법을 선택할 수 있습니다. 기본적으로 template안에 있는 values.yaml은 항상 적용되는 변수이고 만약 -f--set 옵션으로 겹치는 변수가 있다면 -f--set 으로 정의된 변수가 적용됩니다.

이렇게 공개된 차트를 설치하거나 자신이 차트를 만들고 만든 차트를 설치하는 방법을 알아봤습니다. 포스팅을 마칩니다. 감사합니다.

--

--