📋 Helm이란?
Helm이란 Kubernetes 패키지 매니징 툴입니다. Helm은 Kubernetes 애플리케이션 관리를 지원합니다. Helm 차트는 복잡한 애플리케이션도 유지 및 반복할 수 있는 배포기능을 제공합니다. 또한 이전 버전으로 쉽게 롤백하거나, 업그레이드하는 데 유용합니다. 차트는 쉽게 생성할 수 있고, 버전 관리가 용이합니다. 또한 공용 또는 개인 서버에서 간단히 공유 및 호스팅 할 수 있다는 장점이 있습니다.
(Helm에 대한 공식문서는 아래 링크를 참고하세요.)
문서 홈
문서 구성에 관해 알아야 할 모든 것
helm.sh
Helm Chart Repository(이하 차트 저장소)는 패키지형 차트를 저장하고 공유할 수 있는 장소입니다. Helm은 차트라는 패키징 형식을 사용하는 특징이 있습니다. 따라서 차트에는 디렉터리 내부의 파일 모음으로 구성되어 있습니다. 차트 저장소는 이러한 구성(Template)을 갖춰두고 배포되어 있으며 이를 가져와 사용할 수 있다고 이해하면 쉽습니다. 구성에 대한 예시는 아래와 같습니다.
├── Chart.yaml
├── ...
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ └── *.yaml
└── values.yaml
구성 파일 중 중요한 2개를 짚고 넘어가면, values.yaml 파일과 templates 폴더입니다.
values.yaml 파일은 차트의 기본 구성 값입니다. values.yaml 파일에는 templates 폴더에 구성된 파일들에 사용될 변수들이 모여있습니다.
Template 폴더는 구성하는 파일들이 정의되어 있는 폴더입니다. 공식문서 내용을 직역하면 value와 결합할 때 유효한 Kubernetes 매니페스트 파일을 생성하는 템플릿 디렉터리라고 정의하고 있습니다. 즉 values.yaml파일에서 정의한 변수 값을 통해 Kubernetes 매니페스트 파일을 생성합니다.
📈 Trino란?
Trino는 효율적이고 짧은 지연 시간으로 운영하기 위해 병렬화된 분산 쿼리 엔진입니다. 또한 Tableau, Power BI, Superset 등과 같은 BI 도구와 함께 작동하는 ANSI SQL 호환 쿼리 엔진입니다. Trino는 HDFS/Hive 기반으로 어려운 분석 쿼리를 가능하게 할 정도로 뛰어난 성능을 가지고 있습니다. 개인적으로 가장 큰 장점이라고 생각한 부분은, Trino라는 동일한 환경에서 다양한 데이터 소스 쿼리를 처리할 수 있다는 점입니다. Trino가 지원하는 Connector는 스토리지, 관계형 데이터베이스, NoSQL 상관없이 Trino 내부적으로 처리할 수 있어 중앙 집중식 액세스 및 분석이 가능합니다.
(Trino에 대한 공식문서는 아래 링크를 참고하세요.)
https://trino.io/docs/current/
Trino documentation — Trino 434 Documentation
trino.io
⏳ Helm 설치하기
아래에 첨부한 링크는 Helm 설치에 관한 공식문서입니다. 공식문서에서는 여러 가지 OS환경에 맞추어 설치하는 방법에 대해 소개하고 있습니다.
https://helm.sh/ko/docs/intro/install/
헬름 설치하기
헬름 설치하고 작동하는 방법 배우기.
helm.sh
해당 포스트에서는 운영체제별 패키지 매니저를 사용한 설치 방법을 간략히 소개하겠습니다.
Homebrew를 사용하여 macOS 환경에 Helm 배포
brew install helm
Chocolatey를 사용하여 Windows 환경에 Helm 배포
choco install kubernetes-helm
Scoop를 사용하여 Windows 환경에 Helm 배포
scoop install helm
Apt를 사용하여 Debian 혹은 Ubuntu 환경에 Helm 배포
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
🕹️ Helm 차트로 Trino 배포하기
먼저 Helm을 사용하기 위해선, 몇 가지 전제조건이 있습니다. 우선 kubernetes 환경을 갖춰야 합니다. (해당 글에선 kubernetes 환경을 갖추고 있다고 가정하고 환경 세팅에 대한 설명은 생략합니다.) 그리고 Helm을 올바르게 설치해야 합니다. Helm이 잘 설치됐다면, helm help 명령어를 통해 Helm과 관련한 정보를 확인할 수 있게 됩니다. (설치는 앞단의 내용을 참고하거나, 공식문서를 잘 살펴보면 쉽게 설치할 수 있습니다.)
Helm 설치를 완료했다면, 본격적으로 Helm을 사용해 Trino를 배포할 수 있습니다. Helm은 앞서 소개한 것처럼 차트 저장소의 개념이 있으며 차트를 저장하고 공유할 수 있는 장소를 갖추어 공유하는 등으로 사용할 수 있습니다. Trino 역시 공식 차트 저장소가 있습니다.
(아래 링크들을 참고하여 Trino 차트 저장소에 대한 정보를 확인할 수 있습니다.)
https://github.com/trinodb/charts
GitHub - trinodb/charts
Contribute to trinodb/charts development by creating an account on GitHub.
github.com
https://artifacthub.io/packages/search?ts_query_web=Trino&sort=relevance&page=1
Artifact Hub
Find, install and publish Kubernetes packages
artifacthub.io
본격적으로 Trino 배포 과정에 대해 설명하겠습니다. 먼저 Trino를 배포하기 위해선 차트 저장소를 추가해야 합니다. 아래 명령어로 Trino 차트를 추가할 수 있습니다.
helm repo add trino https://trinodb.github.io/charts/
차트 저장소를 추가했다면, 아래 명령어를 통해 잘 추가됐는지 확인할 수 있습니다.
helm search repo trino/trino
차트 저장소가 잘 추가됐는지 확인이 끝났다면, 아래와 같이 helm install 명령어를 사용해 Trino 설치를 할 수 있습니다.
helm install your-trino-name trino/trino
위와 같이 명령어를 입력하면, 구성한 kubernetes 환경에 Trino가 배포됩니다. 하지만 각자의 환경에 맞게 잘 배포됐다고는 장담할 수 없습니다. 앞선 문단에서 소개한 것처럼 차트의 구성엔 크게 values.yaml 파일과 templates 폴더가 있습니다. 여기서 values.yaml 파일은 templates 폴더에 구성된 파일들에 사용될 변수들이 모여있습니다. Trino 차트 리포지토리를 살펴보면 Trino 배포에 사용된 values.yaml 템플릿을 볼 수 있습니다.

아까 설치 과정에서 설치를 진행하면, Trino 차트 저장소에 같이 작성된 values.yaml 파일의 내용을 기반으로 설치가 이뤄집니다. 그렇기 때문에 자신이 구성한 kubernetes 환경과 맞지 않은 배포가 이뤄질 수 있습니다. 따라서 위 values.yaml 파일을 템플릿 삼아 직접 커스터마이징을 통해 설치할 수 있습니다. values.yaml 파일을 로컬에 따로 작성하고, 해당 경로에서 -f 플래그를 사용해 아래와 같이 설치할 수 있습니다.
helm install your-trino-name trino/trino -f values.yaml
아래는 Trino를 운영해 보면서 values.yaml 파일 변경이 잦은 부분에 대한 예시입니다.
Trino 카탈로그 추가/변경 부분
additionalCatalogs:
#aws glue catalogs
hive: |
connector.name=hive
hive.metastore=glue
hive.metastore.glue.aws-access-key=AWS_ACCESS_KEY
hive.metastore.glue.aws-secret-key=AWS_SECRET_KEY
hive.metastore.glue.region=ap-northeast-2
hive.metastore.glue.endpoint-url=https://glue.ap-northeast-2.amazonaws.com
#mongodb catalogs
~
Trino Worker 조정 부분
server:
workers: 2 #<--- change here!
Affinity rule 적용 부분
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- trino
topologyKey: "kubernetes.io/hostname"
🕹️ Helm 차트로 Trino 배포하기(응용)
필요한 기능 대부분은 위에 소개한 방법으로 배포할 수 있습니다. 지금 차트 버전에선 values.yaml로 적용 가능할 수 있도록 templates가 개발됐을 수 있지만 당시에 json-serde를 설치하기 위해선 위에 소개한 방법으론 어려운 부분이 있었습니다. 상황을 자세히 설명하면, 이렇습니다. Trino 엔진으로 json을 처리하는 과정에서 에러가 자꾸 발생했습니다. 따라서 json-serde를 trino에 적용할 필요가 있었고, init container를 추가하면서 emptyDir을 통해 메인 container와 볼륨 마운팅하여 해결해야 했습니다. 하지만 values.yaml 파일엔 init container를 변수로 제공하는 영역이 없어 단순히 values.yaml 파일을 수정하는 것만으론 적용하기 어려웠습니다. 이처럼 차트 템플릿에서 제공하는 기능 외에 추가적인 환경 조정이 필요한 경우 아래와 같은 방법을 통해서 해결할 수 있습니다.
먼저 helm pull 명령어를 통해 로컬에 차트를 내려받습니다.
helm pull trino/trino
다음으로 templates 폴더의 파일을 수정합니다. Trino의 경우 templates 폴더 안에 deployment-coordinator.yaml, deployment-worker.yaml과 같은 파일들이 있습니다. 각 파일들은 Trino 서비스를 운영하기 위한 리소스들을 정의한 파일입니다. 안에 변수를 받는 내용들이 있는데, 해당 부분이 values.yaml에서 기입한 내용으로 채워집니다. templates 폴더 안에 있는 파일 내용을 수정하여 emptyDir를 적용하는 등 추가적인 환경을 구성할 수 있습니다.
로컬에 내려받은 파일에서 templates 폴더를 빠져나와 Chart.yaml 파일과 같은 위계에서 아래 명령어를 통해 배포할 수 있습니다.
helm install trino . -f values.yaml
🏕️ 마무리하며
Helm 공식문서를 참고하면, Trino가 아니더라도 여러 공식 차트를 활용해 배포하는 방법에 대해 더 자세히 익힐 수 있습니다. 해당 포스트가 Trino에 대해서 가볍게 알고, 저런 방법으로 Helm을 다루기도 하는구나 하는 시야를 넓혀주는 글이 되면 좋겠습니다.