Настройка LDAP и SSL для Trino в Kubernetes с помощью Helm

Требования

  • Установленный кластер ADH версии 4.2.0 или более поздней.

  • Кластер Trino, развернутый в Kubernetes согласно инструкции.

  • SSL активирован для кластера ADH. Данный шаг не является обязательным, но рекомендуется в целях безопасности. Дальнейшие шаги предполагают выполнение данного этапа.

ПРИМЕЧАНИЕ
Методы аутентификации Kerberos и LDAP являются взаимоисключающими.

Шаг 1. Обновление секретов Kubernetes

Развернутый ранее кластер Trino использует секрет Kubernetes с конфигурационными файлами ADH для взаимодействия с незащищенными ADH-сервисами. Для включения LDAP/SSL и обеспечения взаимодействия Trino с сервисами ADH, защищенными SSL, необходимо изменить конфигурационные файлы ADH в секретах Kubernetes.

  1. Отредактируйте файл iceberg.properties. Обновленная версия должна содержать следующие свойства:

    iceberg.properties
    connector.name=iceberg
    hive.metastore.uri=thrift://tsn-adh-k8s-1.ru-central1.internal:9083
    hive.metastore.authentication.type=NONE
    hive.metastore.thrift.client.ssl.trust-certificate=/etc/ssl/truststore.jks
    hive.metastore.thrift.client.ssl.trust-certificate-password=<password>
    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=True
  2. Если вы используете Trino с Ranger, обновите настройки Ranger согласно инструкции.

  3. Создайте файл с настройками LDAP:

    password-authenticator
    password-authenticator.name=ldap
    ldap.url=<ldap_url>
    ldap.user-bind-pattern=<bind_pattern>
    ldap.ssl.truststore.path=<truststore>
    ldap.ssl.turststore.password=<password>
    ldap.allow-insecure=false

    где:

    • <ldap_url> — URL для подключения к LDAP. Например, ldaps://ad01.adsw.io:636.

    • <bind_pattern> — шаблон имени пользователя в LDAP для поиска. Например, CN=${USER},OU=kerberos,OU=adh,DC=ad,DC=ranger-test.

    • <truststore> — путь к truststore.

    • <password> — пароль для truststore.

  4. Пересоздайте секрет Kubernetes:

    $ kubectl delete secret <trino-config> -n <trino-cluster-ns>
    $ kubectl create secret generic <trino-config> -n <trino-cluster-ns> --from-file=core-site.xml --from-file=iceberg.properties --from-file=password-authenticator

    где:

    • <trino-config> — имя секрета с конфигурацией Hadoop/Trino.

    • <trino-cluster-ns> — пространство имен, используемое кластером Trino.

  5. Создайте секрет для truststore:

    $ kubectl create secret generic ca-certs -n <trino-cluster-ns> --from-file=truststore.jks=/etc/ssl/truststore.jks
  6. Для доступа к веб-интерфейсу Trino и JDBC-соединений сгенерируйте сертификат для Ingress:

    $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout trino-cloud.ru-central1.internal.key -out trino-cloud.ru-central1.internal.crt -subj "/CN=trino-cloud.ru-central1.internal"
  7. Создайте секрет для входящих JDBC-соединений:

    $ kubectl create secret tls trino-tls-secret -n <trino-cluster-ns> --cert=trino-cloud.ru-central1.internal.crt --key=trino-cloud.ru-central1.internal.key
  8. Создайте keystore для web TLS:

    $ openssl pkcs12 -export -in trino-cloud.ru-central1.internal.crt -inkey trino-cloud.ru-central1.internal.key -out keystore.p12 -name trino-cloud.ru-central1.internal
  9. Создайте секрет для keystore:

    $ kubectl create secret generic trino-web-tls -n <trino-cluster-ns> --from-file=keystore.p12=./keystore.p12
  10. Настройте ваш Ingress-контроллер или балансировщик нагрузки для работы по протоколу HTTPS с использованием TLS-сертификата, хранящегося в секрете Kubernetes. Например, если используется Ingress-контроллер, добавьте следующие параметры в файл конфигурации Ingress:

    tls:
        - hosts:
          - trino-cloud.ru-central1.internal (1)
          secretName: trino-tls-secret
    1 TLS-настройки для запросов, приходящих с данного хоста.

Шаг 2. Обновление конфигурации кластера Trino

  1. Обновите конфигурационный файл trino_cluster_values.yaml, добавив блоки настроек LDAP, SSL и web TLS. Обновленный файл должен выглядеть следующим образом:

    trino_cluster_values.yaml
    image:
      registry: "<registry>"
      repository: "<image>"
      tag: "<tag>"
    
    useRanger: false
    configsSecretName: <trino-config>
    
    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
    
    ldap:
      enabled: true
    
    ssl: (1)
      secretName: ca-certs
      trustStoreKey: truststore.jks
      trustStorePassword: bigdata
    
    webTLS: (2)
      secretName: trino-web-tls
      keystoreKey: keystore.p12
      keystorePassword: bigdata
    1 Настройки SSL.
    2 Настройки web TLS.
  2. Обновите инсталляцию кластера Trino:

    $ helm upgrade --install trino-cluster oci://"$PRIVATE_REGISTRY"/adc-enterprise/charts/trino-cluster --version <version> -f trino_cluster_values.yaml --namespace <trino-cluster-ns> --create-namespace
  3. Удалите старые поды кластера, чтобы оператор Trino создал новые с обновленной конфигурацией:

    $ kubectl delete pods -n <trino-cluster-ns> -l app.kubernetes.io/instance=trino-cluster
  4. Проверьте, что все поды имеют состояние Running:

    $ kubectl get pods -n <trino-cluster-ns>

    Ожидаемый вывод:

    NAME                             READY   STATUS    RESTARTS   AGE
    ad-trino-cluster-coordinator-0   1/1     Running   0          4s
    ad-trino-cluster-worker-0        1/1     Running   0          17s
    ad-trino-cluster-worker-1        1/1     Running   0          4s

Шаг 3. Проверка JDBC-соединения

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

    jdbc:trino://trino-cloud.ru-central1.internal:443?SSL=true&SSLTrustStorePath=<SSLTrustStorePath>&SSLTrustStorePassword=<SSLTrustStorePassword>&user=<USER>&password=<PWD>

    где:

    • <USER> — имя пользователя в LDAP.

    • <PWD> — пароль пользователя в LDAP.

    • <SSLTrustStorePath> — путь к truststore-файлу с сертификатами, который использует DBeaver.

    • <SSLTrustStorePassword> — пароль для доступа к truststore-файлу.

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

    SHOW CATALOGS;

    Ожидаемый вывод:

    Catalog   |
    ----------+
    iceberg   |
    system    |
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней