Установка Trino в Kubernetes
В данной статье описан процесс развертывания ADH-сервиса Trino в Kubernetes.
Требования
Для развертывания Trino в Kubernetes необходимо:
-
Кластер Kubernetes версии 1.32 или более поздней с настроенным доступом через
kubectl. -
Helm (версия 3.8.0 или выше) — пакетный менеджер для Kubernetes для быстрого развертывания Docker-образов в Kubernetes.
-
Артефакты Trino, включая Docker-образы и Helm-чарты (chart), предварительно загруженные в ваш приватный OCI-реестр. Эти артефакты доступны в offline-пакетах, которые можно запросить у службы поддержки Arenadata. Для деплоя Trino в Kubernetes необходимо извлечь следующие образы:
-
hub.arenadata.io/adh-enterprise/trino-docker:<version>
-
hub.arenadata.io/adc-enterprise/trino-operator:<version>
-
hub.arenadata.io/adc-enterprise/charts/trino-cluster:<version>
-
hub.arenadata.io/adc-enterprise/charts/trino-operator:<version>
-
-
Функционирующий ADH-кластер (версии 4.2.0 или более поздней) со следующими сервисами:
-
Core configuration
-
ADPG
-
Zookeeper
-
HDFS
-
YARN
-
Hive
Сервис Trino будет запущен вне кластера ADH — в подах Kubernetes (pod) и будет взаимодействовать с сервисами ADH по сети.
-
Процедура развертывания
Ниже приведены шаги по установке и настройке компонентов Trino. Настройка внешнего доступа, Ingress-контроллеров, балансировщиков нагрузки, DNS и облачных аннотаций должна быть выполнена с учетом особенностей вашей Kubernetes-инфраструктуры.
Шаг 1. Установка оператора Trino
-
Создайте файл trino_operator_values.yaml:
# Default values for ad-trino-operator. # This is a YAML-formatted file. # Declare variables to be passed into your templates. # This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ replicas: 1 payloadNamespaces: (1) # Managed namespaces for Trino payload resources. names: - trino # Explicit opt-in for cluster-wide RBAC when payloadNamespaces.names is empty. # When false, chart rendering fails until namespaces are specified. allowClusterRole: false deleteProtection: false avoidCreation: false # This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/ image: registry: "<registry>" (2) repository: "<image>" (3) # This sets the pull policy for images. pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: "<tag>" # This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ pullSecret: (4) name: "" ## List of secrets to create for image pulling in all product namespaces credentials: {} # registry: private-docker-registry # username: user # password: pass # This is to override the chart name. nameOverride: "" fullnameOverride: "" # This section builds out the service account more information can be found here: https://kubernetes.io/docs/concepts/security/service-accounts/ serviceAccount: # Automatically mount a ServiceAccount's API credentials? automount: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: "" # This is for setting Kubernetes Annotations to a Pod. # For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ podAnnotations: {} # This is for setting Kubernetes Labels to a Pod. # For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} podSecurityContext: {} # fsGroup: 2000 securityContext: readOnlyRootFilesystem: true privileged: false allowPrivilegeEscalation: false runAsNonRoot: true runAsUser: 65532 capabilities: drop: - ALL seccompProfile: type: RuntimeDefault # This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/ service: # This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types type: ClusterIP # This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports port: 8443 resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi nodeSelector: {} tolerations: [] affinity: {} terminationGracePeriodSeconds: 101 Список пространств имен (namespace), в которых оператор управляет ресурсами. 2 Адрес приватного OCI-хранилища, из которого будут загружены образы. 3 Имя репозитория в приватном хранилище. 4 Укажите учетные данные для доступа к вашему приватному Docker-реестру. -
Установите оператор Trino:
$ helm upgrade --install trino-operator oci://<registry-address>/adc-enterprise/charts/trino-operator:<version> --version <version> -f trino_operator_values.yaml --namespace trino-operator --create-namespaceгде
<registry-address>— это адрес вашего OCI-хранилища с загруженными Helm-чартами для компонентов Trino.Пример вывода:
Release "trino-operator" does not exist. Installing it now. Pulled: hub.arenadata.io/adc-enterprise/charts/trino-operator:<version> Digest: sha256:0ad904dadfe7d8120864445e3f780f331061a7b66383aede35ca5db28a471a8a NAME: trino-operator LAST DEPLOYED: Wed May 6 14:06:11 2026 NAMESPACE: trino-operator STATUS: deployed REVISION: 1 DESCRIPTION: Install complete TEST SUITE: None NOTES:
-
Проверьте установку оператора Trino с помощью команды:
$ kubectl get pods -n trino-operatorВывод:
NAME READY STATUS RESTARTS AGE trino-operator-7698f97987-ff6kz 1/1 Running 0 78s
Шаг 2. Создание секретов Kubernetes для конфигураций ADH
Для того чтобы сервис Trino, развернутый в Kubernetes, мог взаимодействовать с вашим ADH-кластером, необходимо передать конфигурационные параметры ADH в каждый под Kubernetes. Один из способов сделать это — с помощью секретов (secret) Kubernetes. В этом случае конфигурационные файлы ADH будут доступны в каждом поде в директории /opt/trino-server/etc/catalog/.
Для этого:
-
Создайте конфигурационные файлы core-site.xml и iceberg.properties, используя следующие примеры в качестве шаблона. Параметры конфигурации в этих файлах необходимо заменить значениями из вашего ADH-кластера.
core-site.xml<?xml version="1.0"?> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://adh</value> (1) </property> <property> <name>hadoop.security.authentication</name> <value>simple</value> </property> <property> <name>dfs.ha.namenodes.adh</name> <value>nn_ka-adh-1,nn_ka-adh-2</value> </property> <property> <name>dfs.namenode.rpc-address.adh.nn_ka-adh-1</name> <value>ka-adh-1.ru-central1.internal:8020</value> </property> <property> <name>dfs.namenode.rpc-address.adh.nn_ka-adh-2</name> <value>ka-adh-2.ru-central1.internal:8020</value> </property> <property> <name>dfs.nameservices</name> <value>adh</value> </property> <property> <name>dfs.client.failover.proxy.provider.adh</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ObserverReadProxyProvider</value> </property> <property> <name>hadoop.proxyuser.trino.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.trino.hosts</name> <value>*</value> </property> </configuration>1 Замените значением из файла /etc/hadoop/conf/core-site.xml вашего ADH-кластера. iceberg.propertiesconnector.name=iceberg hive.metastore.uri=thrift://ka-adh-2.ru-central1.internal:9083 (1) hive.metastore.authentication.type=NONE hive.metastore.thrift.impersonation.enabled=true fs.hadoop.enabled=True hive.hdfs.authentication.type=NONE hive.hdfs.wire-encryption.enabled=true hive.hdfs.impersonation.enabled=True hive.config.resources=/opt/trino-server/etc/catalog/core-site.xml hive.metastore.thrift.client.ssl.enabled=False1 Укажите адрес вашего Hive Metastore. Для этого используйте параметр hive.metastore.urisв файле /etc/hive/conf/hive-site.xml вашего ADH-кластера.РЕКОМЕНДАЦИЯФайлы конфигурации вашего ADH-кластера находятся на хостах кластера в директориях /etc/hadoop/conf/ и /etc/trino/conf/catalog/. -
Создайте секреты Kubernetes:
$ kubectl -n trino create secret generic trino-configs --from-file=core-site.xml --from-file=iceberg.propertiesПроверьте создание секретов:
$ kubectl get secrets -n trinoВывод:
NAME TYPE DATA AGE trino-configs Opaque 2 16m
Шаг 3. Установка кластера Trino
-
Создайте файл trino_cluster_values.yaml:
image: registry: "<registry>" (1) repository: "<image>" (2) tag: "<tag>" pullPolicy: Always pullSecret: (3) name: "" ## List of secrets to create for image pulling in all product namespaces credentials: {} # registry: private-docker-registry # username: user # password: pass useRanger: false configsSecretName: "trino-configs" securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000 worker: replicas: 2 resources: requests: cpu: 500m memory: 1Gi limits: cpu: "2" memory: 4Gi coordinator: replicas: 1 resources: requests: cpu: 500m memory: 1Gi limits: cpu: "2" memory: 4Gi1 Адрес приватного OCI-хранилища, из которого будут загружены образы. 2 Имя репозитория в приватном хранилище. 3 Укажите учетные данные для доступа к вашему приватному Docker-реестру. -
Установите кластер Trino:
$ helm upgrade --install trino-cluster oci://<registry-address>/adc-enterprise/charts/trino-cluster:<version> --version <version> -f trino_cluster_values.yaml --namespace trino --create-namespaceгде
<registry-address>— адрес хранилища c Helm-чартами Trino.Пример вывода:
Release "trino-cluster" does not exist. Installing it now. Pulled: hub.arenadata.io/adc-enterprise/charts/trino-cluster:<version> Digest: sha256:bb3a10be127d8c9937d615f41f31393251d59753480f2a02ec6d874200c0a354 NAME: trino-cluster LAST DEPLOYED: Fri May 8 15:06:24 2026 NAMESPACE: trino STATUS: deployed REVISION: 1 DESCRIPTION: Install complete TEST SUITE: None
-
Проверьте установку с помощью следующих команд:
$ kubectl get clusters.trino.arenadata.io -n trino $ kubectl get pods -n trinoВывод:
kubectl get clusters.trino.arenadata.io -n trino NAME READY AGE trino-cluster True 4m41s konstantin@ka-trino-k8s-1:~/trino$ kubectl get pods -n trino NAME READY STATUS RESTARTS AGE trino-cluster-coordinator-0 1/1 Running 0 4m49s trino-cluster-worker-0 1/1 Running 0 4m49s trino-cluster-worker-1 1/1 Running 0 4m20s
Убедитесь, что все поды кластера находятся в состоянии
Running.
|
Для просмотра логов Trino в поде используйте команду:
|
Шаг 4. Предоставление доступа к Trino через JDBC
Для внешнего доступа к Trino Coordinator по JDBC необходимо настроить один из способов публикации сервиса, например, используя балансировщик нагрузки (load balancer) или Ingress-контроллер. Все настройки, связанные с публикацией сервиса, включая DNS, аннотации, параметры Ingress, TLS-сертификаты, правила балансировщика и прочие, должны быть указаны в соответствии с вашей инфраструктурой Kubernetes.
-
Получите внешний IP-адрес балансировщика или Ingress-контроллера. Например:
NAME CLASS HOSTS ADDRESS PORTS AGE trino-ingress nginx ka-trino-k8s-1.ru-central1.internal 10.92.41.95 80 57s
Скопируйте внешний IP-адрес для дальнейших шагов (в данном примере это
10.92.41.95). -
Подключитесь к кластеру Trino по JDBC, например, с помощью DBeaver. Строка подключения JDBC имеет следующий вид:
jdbc:trino://<external-ip>:80
где
<external-ip>— IP-адрес Ingress-контроллера или балансировщика из предыдущего шага. -
Установив подключение, выполните тестовую команду для проверки работоспособности кластера:
SHOW CATALOGS;Вывод:
Catalog | ----------+ iceberg | system |
Шаг 5. Предоставление доступа к веб-интерфейсу Trino
Для доступа к веб-интерфейсу Trino необходимо настроить один из способов публикации сервиса, например, используя балансировщик нагрузки (load balancer) или Ingress-контроллер. Все настройки, связанные с публикацией сервиса, включая DNS, аннотации, параметры Ingress, правила балансировщика и прочие, должны быть указаны в соответствии с вашей инфраструктурой Kubernetes.
-
Получите внешний адрес балансировщика или Ingress-контроллера. Например:
NAME CLASS HOSTS ADDRESS PORTS AGE trino-ingress nginx ka-trino-k8s-1.ru-central1.internal 10.92.41.95 80 42m
Скопируйте внешний IP-адрес для дальнейших шагов.
-
Добавьте строку в файл /etc/hosts:
<external-ip> ka-trino-k8s-1.ru-central1.internalгде
<external-ip>— IP-адрес Ingress-контроллера или балансировщика из предыдущего шага. -
Откройте веб-интерфейс Trino в браузере, используя URL: http://ka-trino-k8s-1.ru-central1.internal:80.
Веб-интерфейс Trino
Удаление инстансов
|
ВАЖНО
Удалять оператор следует только после удаления всех управляемых им ресурсов. |
Чтобы удалить кластер Trino, запустите следующую команду:
$ helm uninstall trino-cluster --namespace trino
Чтобы удалить оператор Trino, запустите следующую команду:
$ helm uninstall trino-operator --namespace trino-operator
Чтобы удалить CRD кластера Trino, запустите следующую команду:
$ kubectl delete crd clusters.trino.arenadata.io