K8S 클러스터 초기 설정을 위한 Helm Chart 만들기
📅 June 20, 2020
•⏱️4 min read
K8S 클러스터를 설정하고 운영하다보면 버전 업데이트, 컴포넌트 추가 설치 등 다양한 변경에 대응할 수 있어야 합니다. 또한 Develop, Production, Staging 등 목적에 따라 다양한 클러스터를 추가로 설정하고 배포해야 하는 경우도 생깁니다. 오늘은 이러한 어려움을 해결할 수 있는 Umbrella Helm Chart에 대해 정리해보려고 합니다. Helm을 처음 접하신다면 공식문서를 먼저 보는 방법을 추천드립니다.
Umbrella Helm Chart
Umbrella Helm Chart란 여러 개의 Helm Chart들이 모여있는 집합을 의미합니다. 어디에서부터 시작된 용어인지 모르겠으나 저는 2019 Kubecon - Scaling to Thousands of Nodes (Airbnb) 발표에서 처음 접하게 되었습니다. 사내에 K8S에 대한 요구사항이 빠르게 늘어나던 Airbnb는 멀티 클러스터 배포 전략을 통해 Node Hard Limit 이슈를 해결하게 되었고 클러스터마다 배포를 위해 Umbrella Chart를 만들어 활용했다고 합니다.
Helm Chart 만들기
말로하면 이해가 어려우니 클러스터를 새로 설정한다고 가정하고 예시를 통해 Helm Chart를 만들어보겠습니다. 예시의 클러스터에는 아래와 같은 의존성이 존재합니다. 예시는 Helm 2.16.7 버전을 사용했습니다.
- cluster-autoscaler: EKS AutoScaling 설정
- grafana: 모니터링 대시보드
- prometheus: 시스템 지표 수집 및 저장
- fluentbit: 어플리케이션 로그 수집
먼저 Helm Chart 생성을 위한 폴더 구조를 생성해줍니다.
$ helm create umbrella
$ cd umbrella
$ tree
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
├── requirements.yaml
└── values.yaml
기본 생성되는 폴더 구조에서 requirements.yaml
파일은 추가로 생성해주셔야 합니다.
폴더 구조에서 알아두어야 할 경로는 아래와 같습니다.
Chart.yaml
: 차트에 대한 메타 정보가 들어갑니다.charts/
: 의존성이 있는 차트 패키지들이 설치됩니다.templates/
: 차트에 필요한 template 파일들이 들어갑니다.templates/NOTES.txt
: 차트 생성 시 나타나는 설명이 들어갑니다.requirements.yaml
: 의존성 차트들이 들어갑니다.values.yaml
: 차트 설정에 필요한 default 값들이 들어갑니다.
Chart Metadata
먼저 Chart.yaml
파일을 간단히 수정해줍니다.
이름과 버전, 설명 등의 정보를 본인에 맞게 작성해주시면 됩니다.
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Cluster Setup
name: umbrella
version: 0.1.0
Chart Dependencies
이제 앞서 언급한 의존성 중에 Helm Chart 형태로 배포할 컴포넌트를 requirements.yaml
파일에 정의하겠습니다. 각 차트는 이름, 저장소, 버전, 컨디션 값을 지정할 수 있습니다. condition: prometheus.enabled
의 의미는 values.yaml
에 prometheus.enabled
값이 true 일 경우에만 해당 차트를 설정하겠다는 뜻 입니다.
dependencies:
- name: prometheus
repository: https://kubernetes-charts.storage.googleapis.com
version: 9.7.3
condition: prometheus.enabled
- name: grafana
repository: https://kubernetes-charts.storage.googleapis.com
version: 4.2.2
condition: grafana.enabled
- name: cluster-autoscaler
repository: https://kubernetes-charts.storage.googleapis.com
version: 6.3.0
이제 helm dep up
명령어를 통해 의존성 차트를 갱신할 수 있습니다.
이를 통해 charts/
하위에 차트 파일들이 설치됩니다.
$ helm dep up
Hang tight while we grab the latest from your chart repositories...
Update Complete.
Saving 3 charts
Downloading prometheus from repo https://kubernetes-charts.storage.googleapis.com
Downloading grafana from repo https://kubernetes-charts.storage.googleapis.com
Downloading cluster-autoscaler from repo https://kubernetes-charts.storage.googleapis.com
Deleting outdated charts
의존성 차트에 적용할 설정 값들은 values.yaml
에 정의할 수 있습니다.
grafana를 예시로 들면 아래와 같습니다.
# values.yaml
grafana:
enabled: true
adminPassword: mypassword
persistence:
enabled: true
storageClass: "gp2"
type: pvc
size: 5Gi
service:
type: ClusterIP
Templates
의존성 패키지가 공식 Helm Chart를 지원한다면 dependencies
부분에 정의할 수 있겠지만 yaml 파일만 제공하는 패키지도 많이 존재합니다. 이 경우, templates/
하위에 yaml 파일을 추가해주시면 됩니다. 외부 설정으로 내보내고 싶은 항목들은 template function을 활용해서 수정할 수 있습니다. 여기에서는 fluentbit
만 예시로 추가하겠습니다.
$ cd templates
$ curl -O https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-service-account.yaml
$ curl -O https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role.yaml
$ curl -O https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role-binding.yaml
$ curl -O https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/elasticsearch/fluent-bit-configmap.yaml
Deploy
이제 예시 차트를 클러스터에 배포할 차례입니다. 배포 후 차트 내 컴포넌트 버전 업데이트가 발생하더라도 helm upgrade
명령어를 통해 쉽게 관리할 수 있습니다.
# install
$ helm install . --name umbrella --namespace umbrella
# check status
$ helm status umbrella
$ helm get umbrella
# upgrade
$ helm upgrade -f values.yaml umbrella .
# delete
helm del umbrella --purge
만일 어플리케이션들이 모두 별도의 Helm Chart로 관리되고 있다면 Umbrella Chart에서 어플리케이션 차트까지 의존성으로 추가하는 방식으로 운영하는 방법도 있습니다. 요즘에는 Helm 이외에도 kustomize 등 다양한 도구들이 있으니 비교해보고 적절한 방식을 선택하시면 좋습니다.