Trino на Kubernetes с помощью Helm
Kubernetes - это платформа для оркестровки контейнеров, которая позволяет развертывать Trino и другие приложения в различных типах инфраструктуры. Это может быть как развертывание на ноутбуке с помощью таких инструментов, как kind, так и запуск на управляемой службе Kubernetes в облачных сервисах, таких как Amazon Elastic Kubernetes Service, Google Kubernetes Engine, Azure Kubernetes Service и т.д.
Самый быстрый способ запустить Trino на Kubernetes - использовать Trino Helm chart. Helm - это менеджер пакетов для приложений Kubernetes, который позволяет упростить установку приложений за счет шаблонизации конфигурационных файлов Kubernetes. Это позволяет создавать прототипы на локальном или местном кластере и использовать тот же механизм развертывания для работы в облаке.
Требования
- Кластер Kubernetes с поддерживаемой версией Kubernetes. Если у Вас нет кластера Kubernetes, запустите его локально с помощью kind.
- kubectl – версия должна соответствовать политике версий Kubernetes, установленной на машине, управляющей развертыванием Kubernetes.
- helm – версия должна соответствовать политике версий Helm, установленной на машине, управляющей развертыванием Kubernetes.
Запуск Trino с помощью Helm
Выполните следующие команды из системы с установленными и настроенными helm и kubectl для подключения к запущенному кластеру Kubernetes:
- Убедитесь в том, что kubectl указывает на правильный кластер, выполнив команду:
kubectl cluster-info
- Добавьте репозиторий Trino Helm Chart в Helm, если Вы еще этого не сделали. Вы можете назвать репозиторий так, как Вам хочется, например, просто trino.
helm repo add trino https://trinodb.github.io/charts
- Установите Trino на кластер Kubernetes с помощью Helm Chart. Для использования всех значения по умолчанию и создания кластера под названием example-trino-cluster выполните команду install
helm install example-trino-cluster trino/trino
Это cгенерирует конфигурационные файлы Kubernetes и добавит свойства в Helm Charts. Helm Chart содержит значения по умолчанию, которые могут быть переопределены с помощью YAML-файла.
- (по желанию) чтобы переопределить значения, заданные по умолчанию, создайте свою собственную конфигурацию YAML и определите параметры развертывания. Чтобы запустить команду установки с использованием example.yaml, добавьте параметр f в команду установки. Обязательно следуйте указаниям касательно присвоения имен конфигурационным файлам.
- helm install -f example.yaml example-trino-cluster trino/trino
Вы должны увидеть следующий вывод:
NAME: example-trino-cluster LAST DEPLOYED: Tue Sep 13 14:12:09 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default --selector "app.kubernetes.io/name=trino,app.kubernetes.io/instance=example-trino-cluster,app.kubernetes.io/component=coordinator" --output name) echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:8080
Вывод зависит от Вашей конфигурации о названия и кластера. Например, порт 8080 установлен .service.port в example.yaml.
- Для того, чтобы проверить, что все развертывания и сервисы работают должным образом, выполните команду:
kubectl get all
Вы должны увидеть запущенные подсистемы, развертывания и наборы реплик. Хорошим показателем того, что все работает правильно, является то, что все подсистемы возвращают статус READY.
NAME READY STATUS RESTARTS AGE pod/example-trino-cluster-coordinator-bfb74c98d-rnrxd 1/1 Running 0 161m pod/example-trino-cluster-worker-76f6bf54d6-hvl8n 1/1 Running 0 161m pod/example-trino-cluster-worker-76f6bf54d6-tcqgb 1/1 Running 0 161m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/example-trino-cluster ClusterIP 10.96.25.35 <none> 8080/TCP 161m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/example-trino-cluster-coordinator 1/1 1 1 161m deployment.apps/example-trino-cluster-worker 2/2 2 2 161m NAME DESIRED CURRENT READY AGE replicaset.apps/example-trino-cluster-coordinator-bfb74c98d 1 1 1 161m replicaset.apps/example-trino-cluster-worker-76f6bf54d6 2 2 2 161m
В выводе показаны запущенные поды, к которым относятся контейнеры Trino. Чтобы лучше понять этот вывод, ознакомьтесь со следующими материалами:
Если все подсистемы, развертывания и наборы реплик запущены и находятся в состоянии готовности, значит, Trino развернут успешно.
Примечание
В отличие от некоторых приложений Kubernetes, где лучше иметь много небольших подов, Trino лучше работает с меньшим количеством подов, каждый из которых имеет больше доступных ресурсов. Мы настоятельно рекомендуем избегать размещения нескольких подов Trino на одном физическом хосте, чтобы избежать конкуренции за ресурсы.
Обработка запросов
Все поды, в которых запущены контейнеры Trino, работают в частной сети внутри Kubernetes. Чтобы получить к ним доступ, в частности к координатору, необходимо создать туннель между подом-координатором и Вашим компьютером. Это можно сделать, выполнив команды, созданные при установке.
- Создайте туннель от клиента к службе координатора.
kubectl port-forward svc/trino 8080:8080
Теперь Вы можете подключиться к координатору Trino: http://localhost:8080.
- Для того, чтобы подключиться к Trino, Вы можете использовать интерфейс CLI, клиент JDBC или любые другие клиенты. Например, загрузите интерфейс CLI и подключитесь к Trino в ходе новой сессии.
trino --server http://localhost:8080
- Используя данные каталога tpch, составьте и выполните запрос к таблице nation с помощью схемы tiny:
<>4.5.6.7.8.9.10.11.12.
Протестируйте свой кластер с помощью других запросов.
- Закончив работу, введите в CLI.команду quit
- Отключите туннель к поду-координатору. Эта команда доступна только во время работы процесса kubectl, поэтому Вы можете просто «убить» процесс kubectl, который перенаправляет порт. В большинстве случаев это означает нажатие CTRL + C в терминале, где запущена команда port-forward.
Настройка
Helm Chart использует образ контейнера Trino. Образ Docker уже содержит конфигурацию по умолчанию для начала работы, а также некоторые каталоги, позволяющие хорошо изучить Trino. Kubernetes позволяет имитировать традиционное развертывание, предоставляя конфигурацию в файлах YAML. Перед обновлением значений важно понять все тонкости настройки файлов, JVM и каталога свойств.
Создание своей собственной конфигурации YAML
Когда Вы используете свою собственную конфигурацию YAML Kubernetes, Вы переопределяете только те значения, которые указали сами. Остальные свойства используют значения по умолчанию. Добавьте файл example.yaml со следующей конфигурацией:
image:
tag: "462"
server:
workers: 3
coordinator:
jvm:
maxHeapSize: "8G"
worker:
jvm:
maxHeapSize: "8G"
Эти значения выше, чем значения по умолчанию, они позволяют Trino использовать больше памяти и выполнять более сложные запросы. Если значения слишком высоки, Kubernetes может не успеть запланировать некоторые поды Trino.
- .image.tag установлено значение текущей версии, 462. Установите другое значение, если Вам необходимо использовать другую версию Trino. По умолчанию используется последняя версия. Использование latest приводит к публикации новой версии Trino с каждым релизом и последующим развертыванием Kubernetes..
- .server.workers установлено на 3. Это значение задает количество рабочих узлов, в данном случае развернуты координатор и три рабочих узла.
- .coordinator.jvm.maxHeapSize установлено на 8Гб. Устанавливает максимальный размер кучи в JVM координатора.
- .worker.jvm.maxHeapSize установлен на 8Гб. Устанавливает максимальный размер кучи в JVM рабочего узла.
Важно!
Некоторые параметры памяти требуют тщательной настройки, так как установка некоторых значений, выходящих за пределы диапазона максимального размера кучи, приведет к сбою при запуске Trino.
Примечание:
Хотя в этом документе для обозначения конфигурационного файла Kubernetes используется example.yaml, Вам следует использовать более четкие рекомендации по наименованию кластера и развертывания, которыми Вы управляете. Например, cluster-example-trino-etl.yaml может относиться к развертыванию Trino для кластера, используемого в основном для запросов extract-transform-load, развернутого на кластере Kubernetes.
Добавление каталога
Добавление пользовательских каталогов является достаточно распространенной практикой. Это можно сделать, добавив значения в свойство catalogs в файле example.yaml.
catalogs:
lakehouse: |-
connector.name=iceberg
hive.metastore.uri=thrift://example.net:9083
rdbms: |-
connector.name=postgresql
connection-url=jdbc:postgresql://example.net:5432/database
connection-user=root
connection-password=secret
tpch: |-
connector.name=tpch
tpch.splits-per-node=4
Так Вы добавите в конфигурацию развертывания Kubernetes сразу два каталога - lakehouse и rdbms.
Запуск локального кластера Kubernetes с помощью kind
Для локального развертывания рекомендуем использовать kind (Kubernetes в Docker).
Для запуска kind в своей системе следуйте следующему алгоритму действий:
- kind работает на Docker, поэтому в первую очередь проверьте, установлен ли у Вас Docker:
docker --version
Если команда не сработала, установите Docker, следуя инструкции по установке Docker.
- Установите kind. Следуйте инструкции по установке kind.
- Запустите кластер Kubernetes в kind с помощью следующей команды:
kind create cluster --name trino
Примечание
Параметр name является необязательным, но используется для демонстрации того, как в последующих командах будут применяться имена. Если параметр не добавлен, имя кластера по умолчанию - kind. Используйте trino, чтобы подчеркнуть работу именно на этом кластере.
- Проверьте, что kubectl работает в соответствие с правильным кластером Kubernetes.
kubectl cluster-info --context kind-trino
Если несколько кластеров Kubernetes настроены в соответствие с ~/.kube/config, необходимо передать параметр context командам kubectl. Так Вы сможете работать внутри локального кластера kind . Если этот параметр не установлен, kubectl будет использовать контекст по умолчанию. Обратите внимание на то, что контекст – это имя кластера с префиксом kind-. Теперь Вы сможете увидеть все объекты Kubernetes , работающем в Вашем кластере kind .
- Установите Trino, следуя алгоритму запуска Trino с помощью Helm. При выполнении команды kubectl get all добавьте параметр context .
kubectl get all --context kind-trino
- Обработайте несколько запросов, следуя инструкции по обработке запросов.
<>7.
Чтобы убедиться в том, что все получилось, можно выполнить следующую команду kubectl. Она позволит Вам убедиться в том, что никаких объектов Kubernetes, связанных с кластером Trino, не осталось.
kubectl get all




