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. Это позволяет вам прототипировать на локальном или on-premise кластере и использовать тот же механизм развёртывания для деплоя в облако с возможностью масштабирования.
Требования#
Kubernetes cluster с поддерживаемой версией Kubernetes.
Если у вас нет Kubernetes-кластера, вы можете запустить его локально с помощью kind.
kubectl с версией, соответствующей Kubernetes version skew policy, установленный на машине, управляющей развертыванием Kubernetes.
helm с версией, соответствующей Helm version skew policy, установленный на машине, управляющей развертыванием Kubernetes.
Запуск Trino используя Helm#
Выполните следующие команды на системе, где установлены helm и kubectl
и настроено подключение к вашему работающему Kubernetes-кластеру:
Убедитесь, что
kubectlуказывает на правильный кластер, выполнив команду:kubectl cluster-info
Вы должны увидеть вывод, содержащий корректный адрес Kubernetes control plane.
Добавьте репозиторий Trino Helm chart в Helm, если вы ещё этого не сделали. Это сообщает Helm, где искать чарты Trino. Вы можете назвать репозиторий как угодно, хорошим вариантом является
trino.helm repo add trino https://trinodb.github.io/charts
Установите Trino в Kubernetes-кластер с помощью Helm chart. Начните с выполнения команды
install, чтобы использовать значения по умолчанию и создать кластер с именемexample-trino-cluster.helm install example-trino-cluster trino/trino
Это создаёт конфигурационные файлы Kubernetes путём подстановки параметров в шаблоны helm. Helm chart содержит default values, которые можно переопределить с помощью YAML-файла для изменения настроек по умолчанию.
(Опционально) Чтобы переопределить значения по умолчанию, создайте собственную YAML-конфигурацию, чтобы задать параметры вашего развёртывания. Чтобы выполнить команду install с использованием
example.yaml, добавьте параметрfв вашу командуinstall. Обязательно следуйте best practices и соглашениям об именовании для ваших конфигурационных файлов.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.Выполните следующую команду, чтобы убедиться, что все pods, deployments и services работают корректно.
kubectl get all
Ожидается вывод, показывающий запущенные pods, deployments и replica sets. Хорошим индикатором корректной работы является то, что все pods имеют статус готовности в колонке
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
Вывод показывает запущенные pods. Они включают непосредственно контейнеры Trino. Чтобы лучше понять этот вывод, ознакомьтесь со следующими ресурсами:
Если все pods, deployments и replica sets запущены и находятся в состоянии ready, значит Trino успешно развернут.
Note
В отличие от некоторых Kubernetes-приложений, где лучше использовать множество маленьких pods, Trino работает лучше с меньшим количеством pods, каждому из которых доступно больше ресурсов. Настоятельно рекомендуется избегать запуска нескольких pods Trino на одном физическом хосте, чтобы избежать конкуренции за ресурсы.
Выполнение запросов#
Pods с контейнерами Trino работают во внутренней приватной сети Kubernetes. Чтобы получить к ним доступ, в частности к coordinator, необходимо создать туннель между pod coordinator и вашим компьютером. Это можно сделать, выполнив команды, сгенерированные при установке.
Создайте туннель от клиента к сервису coordinator.
kubectl port-forward svc/trino 8080:8080
Теперь вы можете подключиться к coordinator Trino по адресу
http://localhost:8080.Для подключения к Trino вы можете использовать command-line interface, JDBC client или любой из других клиентов. В данном примере установите command-line interface и подключитесь к Trino в новой консольной сессии.
trino --server http://localhost:8080
Используя примерные данные в каталоге
tpch, выполните запрос к таблицеnation, используя схемуtiny:trino> select count(*) from tpch.tiny.nation; _col0 ------- 25 (1 row) Query 20181105_001601_00002_e6r6y, FINISHED, 1 node Splits: 21 total, 21 done (100.00%) 0:06 [25 rows, 0B] [4 rows/s, 0B/s]
Попробуйте выполнять другие SQL-запросы, чтобы исследовать набор данных и протестировать ваш кластер.
Когда закончите работу, введите команду
quitв CLI.Закройте туннель к pod coordinator. Он доступен только пока работает процесс
kubectl, поэтому вы можете просто завершить процессkubectl, который выполняет проброс порта. В большинстве случаев это означает нажатиеCTRL+Cв терминале, где запущена команда port-forward.
Configuration#
Helm chart использует Trino container image. Docker image уже содержит конфигурацию по умолчанию для быстрого старта, а также некоторые каталоги, позволяющие исследовать Trino. Kubernetes позволяет воспроизвести traditional deployment путём задания конфигурации в YAML-файлах. Важно понимать, как настраиваются такие файлы, как конфигурация Trino, JVM и различные catalog properties, прежде чем изменять значения.
Creating your own YAML configuration#
При использовании собственной YAML-конфигурации Kubernetes вы переопределяете
только указанные значения. Остальные параметры используют значения по
умолчанию. Добавьте файл example.yaml со следующей конфигурацией:
image:
tag: "latest"
server:
workers: 3
coordinator:
jvm:
maxHeapSize: "8G"
worker:
jvm:
maxHeapSize: "8G"
Эти значения выше значений по умолчанию и позволяют Trino использовать больше памяти и выполнять более ресурсоёмкие запросы. Если значения слишком высокие, Kubernetes может не суметь запланировать некоторые pods Trino в зависимости от других приложений, развернутых в этом кластере, и размера узлов кластера.
.image.tagустановлен в текущую версию, latest. Установите это значение, если вам необходимо использовать конкретную версию Trino. Значение по умолчанию —latest, что не рекомендуется. Использованиеlatestприведёт к публикации новой версии Trino при каждом релизе и последующем развертывании в Kubernetes..server.workersустановлен в3. Это значение задаёт количество workers — в данном случае разворачивается один coordinator и три worker-узла..coordinator.jvm.maxHeapSizeустановлен в8GB. Это задаёт максимальный размер heap в JVM координатора. См. JVM config..worker.jvm.maxHeapSizeустановлен в8GB. Это задаёт максимальный размер heap в JVM worker-узлов. См. JVM config.
Warning
Некоторые параметры памяти требуют аккуратной настройки, так как установка значений вне допустимого диапазона максимального размера heap может привести к ошибке запуска Trino. См. предупреждения в Resource management properties.
См. полный список параметров, которые можно переопределить в Helm chart.
Note
Хотя в этом документе используется имя example.yaml для обозначения
файла конфигурации Kubernetes, рекомендуется использовать понятные
и осмысленные имена для кластера и развертывания. Например,
cluster-example-trino-etl.yaml может обозначать развертывание Trino
для кластера, используемого преимущественно для extract-transform-load
запросов, развернутого в Kubernetes-кластере example. См.
Configuration Best Practices
для получения дополнительных рекомендаций по настройке развертываний
в 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
Это добавляет каталоги lakehouse и rdbms в конфигурацию развертывания
Kubernetes.
Running a local Kubernetes cluster with kind#
Для локальных развертываний вы можете использовать
kind (Kubernetes in Docker). Выполните
следующие шаги, чтобы запустить kind в вашей системе.
kindработает поверх Docker, поэтому сначала проверьте, установлен ли Docker:docker --version
Если эта команда завершится ошибкой, установите Docker, следуя инструкциям по установке Docker.
Установите
kind, следуя инструкциям по установке kind.Запустите Kubernetes-кластер в
kind, выполнив команду:kind create cluster --name trino
Note
Параметр
nameявляется необязательным, но используется для демонстрации того, как namespace применяется в последующих командах. По умолчанию имя кластера —kind, если параметр не указан. Используйтеtrino, чтобы явно обозначить приложение в этом кластере.Убедитесь, что
kubectlработает с правильным Kubernetes-кластером.kubectl cluster-info --context kind-trino
Если у вас уже настроено несколько Kubernetes-кластеров в
~/.kube/config, необходимо передавать параметрcontextв командыkubectl, чтобы работать с локальным кластеромkind.kubectlиспользует context по умолчанию, если этот параметр не указан. Обратите внимание, что context — это имя кластера с добавленным префиксомkind-. Теперь вы можете посмотреть все Kubernetes-объекты, запущенные в вашем кластереkind.Настройте Trino, следуя шагам Запуск Trino используя Helm. При выполнении команды
kubectl get allдобавьте параметрcontext.kubectl get all --context kind-trino
Выполните несколько запросов, следуя шагам в разделе Executing queries.
После завершения работы с кластером
kindвы можете удалить кластер.kind delete cluster -n trino
Очистка#
Чтобы удалить Trino из Kubernetes-кластера, выполните следующую команду:
helm uninstall my-trino-cluster
Ожидается следующий вывод:
release "my-trino-cluster" uninstalled
Чтобы убедиться, что всё выполнено успешно, вы можете выполнить эту команду kubectl,
чтобы проверить, что не осталось Kubernetes-объектов, связанных с кластером Trino.
kubectl get all