Установка 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>

    Также необходимо извлечь следующие Helm-чарты и загрузить их в ваш приватный реестр:

    • 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

  1. Создайте файл 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: 10
    1 Список пространств имен (namespace), в которых оператор управляет ресурсами.
    2 Адрес приватного OCI-хранилища, из которого будут загружены образы.
    3 Имя репозитория в приватном хранилище.
    4 Укажите учетные данные для доступа к вашему приватному Docker-реестру.
  2. Установите оператор 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:
  3. Проверьте установку оператора 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/.

Для этого:

  1. Создайте конфигурационные файлы 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.properties

     

    connector.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=False
    1 Укажите адрес вашего Hive Metastore. Для этого используйте параметр hive.metastore.uris в файле /etc/hive/conf/hive-site.xml вашего ADH-кластера.
    РЕКОМЕНДАЦИЯ
    Файлы конфигурации вашего ADH-кластера находятся на хостах кластера в директориях /etc/hadoop/conf/ и /etc/trino/conf/catalog/.
  2. Создайте секреты 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

  1. Создайте файл 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: 4Gi
    1 Адрес приватного OCI-хранилища, из которого будут загружены образы.
    2 Имя репозитория в приватном хранилище.
    3 Укажите учетные данные для доступа к вашему приватному Docker-реестру.
  2. Установите кластер 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
  3. Проверьте установку с помощью следующих команд:

    $ 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 в поде используйте команду:

$ kubectl logs <pod-name> -n trino

Шаг 4. Предоставление доступа к Trino через JDBC

Для внешнего доступа к Trino Coordinator по JDBC необходимо настроить один из способов публикации сервиса, например, используя балансировщик нагрузки (load balancer) или Ingress-контроллер. Все настройки, связанные с публикацией сервиса, включая DNS, аннотации, параметры Ingress, TLS-сертификаты, правила балансировщика и прочие, должны быть указаны в соответствии с вашей инфраструктурой Kubernetes.

  1. Получите внешний 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).

  2. Подключитесь к кластеру Trino по JDBC, например, с помощью DBeaver. Строка подключения JDBC имеет следующий вид:

    jdbc:trino://<external-ip>:80

    где <external-ip> — IP-адрес Ingress-контроллера или балансировщика из предыдущего шага.

  3. Установив подключение, выполните тестовую команду для проверки работоспособности кластера:

    SHOW CATALOGS;

    Вывод:

    Catalog   |
    ----------+
    iceberg   |
    system    |

Шаг 5. Предоставление доступа к веб-интерфейсу Trino

Для доступа к веб-интерфейсу Trino необходимо настроить один из способов публикации сервиса, например, используя балансировщик нагрузки (load balancer) или Ingress-контроллер. Все настройки, связанные с публикацией сервиса, включая DNS, аннотации, параметры Ingress, правила балансировщика и прочие, должны быть указаны в соответствии с вашей инфраструктурой Kubernetes.

  1. Получите внешний адрес балансировщика или Ingress-контроллера. Например:

    NAME            CLASS   HOSTS                                 ADDRESS       PORTS   AGE
    trino-ingress   nginx   ka-trino-k8s-1.ru-central1.internal   10.92.41.95   80      42m

    Скопируйте внешний IP-адрес для дальнейших шагов.

  2. Добавьте строку в файл /etc/hosts:

    <external-ip> ka-trino-k8s-1.ru-central1.internal

    где <external-ip> — IP-адрес Ingress-контроллера или балансировщика из предыдущего шага.

  3. Откройте веб-интерфейс Trino в браузере, используя URL: http://ka-trino-k8s-1.ru-central1.internal:80.

    Trino web UI
    Веб-интерфейс 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
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней