Использование Ranger для Trino в Kubernetes

Требования

Шаг 1. Создание сервиса в Ranger

На данном шаге описывается создание сервиса с помощью REST API Ranger. Вы также можете создать сервис в веб-интерфейсе Ranger.

  1. Создайте конфигурацию сервиса в JSON-файле:

    ranger-trino-k8s.json
    {
      "isEnabled": true,
      "type": "trino",
      "name": "trino_k8s", (1)
      "displayName": "trino_k8s",
      "description": "Service for Kubernetes Trino",
      "configs": {
        "username": "trino", (2)
        "password": "bigdata",  (3)
        "ranger.plugin.audit.filters": "[{'accessResult':'DENIED','isAudited':true},{'isAudited':false,'resources':{'queryid':{'values':['*']}},'accessTypes':['execute']},{'isAudited':false,'resources':{'trinouser':{'values':['{USER}']}},'accessTypes':['impersonate']}]",
        "jdbc.driverClassName": "org.apache.hive.jdbc.HiveDriver",
        "jdbc.url": "jdbc:trino//10.92.42.219" (4)
      }
    }
    1 Наименование сервиса Trino в Ranger. Данное имя должно быть уникальным.
    2 Имя пользователя для сервиса.
    3 Пароль для сервиса.
    4 JDBC-строка подключения к Trino. Эндпойнт для подключения выставляется Ingress или балансировщиком нагрузки.
  2. Загрузите конфигурацию сервиса в Ranger:

    $ curl -u admin:<admin_pwd> -H "Content-Type: application/json" -X POST -d @ranger-trino-k8s.json http://<ranger-admin>:6080/service/public/v2/api/service

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

  1. Подготовьте секрет (secret) с конфигурацией Trino. Секрет уже должен иметь ключ core-site.xml. Для интеграции с Ranger добавьте следующие ключи:

    • ranger-trino-security.xml — настройка плагина Ranger.

      ranger-trino-security.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
        <property>
          <name>ranger.plugin.trino.enable.implicit.userstore.enricher</name>
            <value>True</value>
        </property>
        <property>
          <name>ranger.plugin.trino.service.name</name>
          <value>trino_k8s</value> (1)
        </property>
        <property>
          <name>ranger.plugin.trino.policy.rest.url</name>
          <value>http://tsn-adps2-1.ru-central1.internal:6080</value> (2)
        </property>
        <property>
          <name>ranger.plugin.trino.policy.source.impl</name>
          <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>
        </property>
        <property>
          <name>ranger.plugin.trino.super.users</name>
          <value>rangerlookup</value>
        </property>
        <property>
          <name>ranger.plugin.trino.ugi.initialize</name>
          <value>True</value>
        </property>
        <property>
          <name>ranger.plugin.trino.username</name>
          <value>trino</value> (3)
        </property>
        <property>
          <name>ranger.plugin.trino.password</name>
          <value>bigdata</value> (4)
        </property>
        <property>
          <name>ranger.plugin.trino.use.rangerGroups</name>
          <value>True</value>
        </property>
        <property>
          <name>ranger.plugin.trino.use.only.rangerGroups</name>
          <value>True</value>
        </property>
      </configuration>
      1 Наименование сервиса Trino в Ranger.
      2 URL, по которому доступен Ranger Admin.
      3 Имя пользователя для сервиса.
      4 Пароль для сервиса.

      Если активирован Kerberos, добавьте следующие свойства:

      <property>
          <name>ranger.plugin.trino.ugi.keytab.file</name>
          <value>/opt/trino-server/kerberos/keytab</value>
      </property>
      <property>
          <name>ranger.plugin.trino.ugi.keytab.principal</name>
          <value>trino/trino-cloud.ru-central1.internal@RU-CENTRAL1.INTERNAL</value>
      </property>
      <property>
          <name>ranger.plugin.trino.ugi.login.type</name>
          <value>keytab</value>
      </property>

      Если активен SSL, добавьте следующее свойство:

      <property>
          <name>ranger.plugin.trino.policy.rest.ssl.config.file</name>
          <value>/opt/trino-server/etc/catalog/ranger-trino-policymgr-ssl.xml</value>
      </property>
    • ranger-trino-audit.xml — настройка аудита Ranger.

      ranger-trino-audit.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
        <property>
          <name>xasecure.audit.destination.solr</name>
          <value>true</value>
        </property>
        <property>
          <name>xasecure.audit.destination.solr.batch.filespool.dir</name>
          <value>/srv/ranger/trino_plugin/audit_solr_spool</value>
        </property>
        <property>
          <name>xasecure.audit.destination.solr.zookeepers</name>
          <value>tsn-adps2-1.ru-central1.internal:2181/Arenadata.Hadoop-3.solr.server</value> (1)
        </property>
        <property>
          <name>xasecure.audit.is.enabled</name>
          <value>True</value>
        </property>
      </configuration>
      1 Строка для подключения к ZooKeeper в формате <host-1>:<port-1>…​<host-N>:<port-N>/Arenadata.Hadoop-<cluster_id>.solr.server.

      Если активирован Kerberos, добавьте следующие свойства:

      <property>
          <name>xasecure.audit.destination.solr.force.use.inmemory.jaas.config</name>
          <value>True</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.loginModuleControlFlag</name>
          <value>required</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.loginModuleName</name>
          <value>com.sun.security.auth.module.Krb5LoginModule</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.keyTab</name>
          <value>/opt/trino-server/kerberos/keytab</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.principal</name>
          <value>trino/trino-cloud.ru-central1.internal@RU-CENTRAL1.INTERNAL</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.serviceName</name>
          <value>solr</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.storeKey</name>
          <value>False</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.useKeyTab</name>
          <value>True</value>
      </property>
      <property>
          <name>xasecure.audit.jaas.Client.option.useTicketCache</name>
          <value>True</value>
      </property>
    • ranger-trino-policymgr-ssl.xml — настройка SSL для Ranger (если SSL активен).

      ranger-trino-policymgr-ssl.xml
      <?xml version="1.0"?>
      <configuration>
        <property>
          <name>xasecure.policymgr.clientssl.truststore</name>
          <value>/etc/ssl/truststore.jks</value> (1)
        </property>
        <property>
          <name>xasecure.policymgr.clientssl.truststore.credential.file</name>
          <value>jceks://file/opt/trino-server/etc/catalog/ranger-trino.jceks</value> (2)
        </property>
      </configuration>
      1 Путь к truststore.
      2 Путь к файлу с данными для truststore.
  2. Обновите секрет с конфигурацией Trino:

    $ kubectl delete secret <trino-config> -n <trino-cluster-ns>
    $ kubectl create secret generic <trino-config> -n <trino-cluster-ns> --from-file=<trino-conf-folder>

    где:

    • <trino-config> — название секрета с конфигурацией Trino.

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

    • <trino-conf-folder> — директория с файлами, из которых генерируется секрет. Если вы передаете секреты в виде строк в файле values.yaml, укажите путь к этому файлу.

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

  1. Обновите конфигурационный файл кластера Trino:

    trino-cluster-values.yaml
    image:
      registry: "<image_registry>"
      repository: "<image_repository>"
      tag: "<image_tag>"
      pullPolicy: Always
    
    useRanger: true
    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

    Все необходимые для работы кластера параметры уже должны быть объявлены в файле, однако необходимо присвоить параметру useRanger значение true.

  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
    trino-cluster-coordinator-0   1/1     Running   0          47m
    trino-cluster-worker-0        1/1     Running   0          47m
    trino-cluster-worker-1        1/1     Running   0          47m
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней