1. Helm 이란
Helm의 정의를 CircleCI 블로그에서 가져왔다.
Helm은 설정 파일을 하나의 재사용 가능한 패키지로 결합하여 Kubernetes 애플리케이션의 생성, 패키징, 설정, 배포를 자동화하는 도구입니다.
내가 생각하는 Helm의 핵심 기능은 "패키징"이라고 생각한다. 패키지를 만들고 잘 만들어둔 패키지는 다양한 곳에서 사용할 수 있다. 마치 만능 양념장과 같다.
쿠버네티스 스터디 중 "Helm을 언제 사용하는 건지 이해가 안되니 개념도 이해가 잘 안 된다"라는 이야기를 하신 분이 있었다. 그에 대한 대답으로 나는 "필요하다고 느껴질 때 사용하게 될 것이다"라고 생각한다.
nginx 웹 서버를 하나를 쿠버네티스에 배포한다고 해보자. 그러면 일반적으로 Deployment 리소스를 생성할 것이다. 그러면 Pod가 생성될 것이다. 그런데 이것만으로 되는가? Pod에 접근하기 위한 Service 리소스가 일반적으로 필요하다. 많은 종류의 애플리케이션이 이와 같이 Deployment와 Service가 쌍으로 필요하다. 이거 두 개만 필요할까? Configmap, Secret, Ingress 등 다양한 리소스가 필요하다.
또 다른 웹 서버 애플리케이션을 배포한다고 하면 또 똑같은 쌍이 필요한 경우가 있다.
이렇게 한 번 두 번 반복되다 보면 "아 이걸 자동화 하고 싶다."라는 생각이 들 때 Helm을 사용하면 된다.
2. Helm 설치
Helm 공식 문서는 한국어를 지원한다. 여기에 들어가서 손쉽게 Helm을 설치할 수 있다. 설치 확인만 해보자.
helm version
3. 사용 예시
Helm의 핵심은 패키징이다. 쿠버네티스 리소스를 정의하기 위한 귀찮은 Yaml 작성을 반복되는 부분에 대해 생략하겠다는 것이다.
그 패키지의 단위가 "Helm Chart"라고 부른다. 이 차트를 얼마나 잘 작성하는지에 따라 다양한 곳에서 활용할 수 있다. Helm에선 기본적으로 아주 괜찮은 차트를 제공해 준다.
기본 차트 생성
helm create my-chart
이후 my-chart라는 폴더가 생긴다. 구조는 아래와 같다.
my-chart
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
Chart를 구성하기 위한 Require 요소는 Chart.yaml, values.yaml이고 templates 폴더 안에 있는 yaml 파일들이 실제 K8s 리소스라고 생각하면 된다. 즉, 이 Helm chart가 커버할 수 있는 K8s 리소스는 templates 내 리소스들이고 이를 제어하기 위한 변수들은 values.yaml에서 확인할 수 있다. values.yaml을 어떻게 작성하는지에 따라 nginx를 위한 애플리케이션이 될 수도 있고 Fastapi를 위한 애플리케이션이 될 수도 있다.
Nginx 애플리케이션 배포를 위한 values.yaml 작성
Helm Chart에 있는 values.yaml은 또 다른 values.yaml 파일을 통해 덮어쓸 수 있다. 그래서 현재 생성되어 있는 기존 values.yaml은 건드리지 않고 nginx.yaml을 만들어 nginx를 위한 내용을 작성하려 한다.
설명하지 않은 게 있는데 templates/ 폴더 내에 있는 리소스들을 확인해 보면 {{ .Values. }}과 같은 템플릿이 있고 {{ .Chart. }}이 있고 {{ include. }}이 있을 것이다. 각각 values.yaml에서 가져온 변수, Chart.yaml에서 가져온 변수, _helpers.tpl에서 가져온 변수이다. 이 중 특히, _helpers.tpl는 values.yaml과 Chart.yaml 등의 변수들을 조합하여 중복되거나 간단하게 사용하기 위한 변수를 정의한 것이라고 볼 수 있다. 일반적으론 values.yaml만 수정하면 되게끔 설계가 되어 있어야 잘 설계된 차트라고 생각한다.
그래서 앞서 이야기했던 nginx.yaml을 정의할 것이고 이는 각 templates/ 내 리소스에서 사용 중인 변수이므로 의도한 것이 아니라면 기본 values.yaml의 필드의 depth(깊이)
및 이름을 따라서 override 해야 한다.
그렇게 작성한 nginx를 위한 nginx.yaml을 다음과 같다.
replicaCount: 1
image:
repository: nginx
service:
type: ClusterIP
port: 80
이제 이를 이용해 쿠바네티스에 배포해 보자.
기존 values.yaml과 nginx.yaml을 함께 정의해야 한다.
helm install -f values.yaml -f nginx.yaml nginx .
이제 Deployment의 replica를 변경하고 싶다면 nginx.yaml의 replicaCount를 변경한 뒤 helm upgrade
를 하면 되고 fastapi를 배포하고 싶다면 이미지를 준비한 뒤 fastapi.yaml
을 정의하여 nginx를 배포한 것과 같이 배포하면 된다.