Kerberos и SSL для Impala в Kubernetes
В данной статье описан процесс подключения Kerberos-аутентификации и SSL-шифрования для кластера Impala, развернутом в Kubernetes.
Описанный в статье сценарий настройки предполагает наличие чистого незащищенного кластера Impala в Kubernetes, развернутого в соответствии с инструкциями из статьи Установка Impala в Kubernetes.
Требования
-
Установленный и керберизированный кластер ADH версии 4.2.0 или более поздней.
-
Кластер Impala, развернутый в Kubernetes согласно инструкции.
-
SSL активирован для кластера ADH.
Процедура настройки
Шаг 1. Установка оператора Kerberos
Установите оператор Kerberos и Kerberos config с помощью Helm, как описано в статье Установка оператора Kerberos в Kubernetes. Ниже приведены примеры Helm values-файлов для установки оператора Kerberos и Kerberos config.
replicas: 1
image:
registry: hub.arenadata.io (1)
repository: adc-enterprise/kerberos-operator (2)
pullPolicy: IfNotPresent
tag: <tag> (3)
serviceAccount:
create: true
automount: true
service:
type: ClusterIP
port: 8443
payloadNamespaces:
names: (4)
- kerberos-prod
- kerberos-staging
allowClusterRole: false (5)
deleteProtection: true (6)
avoidCreation: false (7)
terminationGracePeriodSeconds: 10
| 1 | URL хранилища образов. |
| 2 | Путь к репозиторию образа Kerberos-оператора в хранилище. |
| 3 | Версия образа, которая будет использована Kubernetes. |
| 4 | Список пространств имен, доступных для Kerberos-оператора. |
| 5 | Явное согласие на предоставление доступа ко всему кластеру. Когда значение параметра true, а payloadNamespaces.names пусто, чарт создает ClusterRole/ClusterRoleBinding для доступа ко всем пространствам имен. |
| 6 | Флаг, определяющий добавлять ли аннотацию helm.sh/resource-policy: keep к пространству имен, предотвращающую удаление командой helm uninstall. |
| 7 | Флаг, определяющий пропускать ли шаг создания пространства имен. Следует использовать только если заранее известно о наличии пространства имен (например, созданного оператором Kerberos). |
ldapSecret:
enabled: true
provider: freeipa (1)
address: ldap://tsn-freeipa.ru-central1.internal (2)
adminUser: uid=admin,cn=users,cn=accounts,dc=ru-central1,dc=internal (3)
adminPassword: bigdata (4)
baseDN: cn=services,cn=accounts,dc=ru-central1,dc=internal (5)
ca: | <pem-certificate> (6)
kdcConfig:
labelSelector:
env: prod
libdefaults:
debug: 'false'
default_realm: RU-CENTRAL1.INTERNAL
dns_lookup_kdc: 'false'
dns_lookup_realm: 'false'
udp_preference_limit: '1'
realm: RU-CENTRAL1.INTERNAL (7)
domainRealm:
ru-central1.internal: RU-CENTRAL1.INTERNAL
realms:
RU-CENTRAL1.INTERNAL: |
kdc = tsn-freeipa.ru-central1.internal (8)
admin_server = tsn-freeipa.ru-central1.internal (9)
| 1 | Тип провайдера Kerberos. Может быть одним из следующих значений: ad, samba, freeipa. |
| 2 | URL для подключения к LDAP. |
| 3 | Имя пользователя с правами администратора. |
| 4 | Пароль администратора. |
| 5 | База поиска. |
| 6 | CA-сертификат для доверия с TLS-сертификатом сервера LDAP. |
| 7 | Kerberos-реалм (realm). |
| 8 | Хост с доступным KDC. |
| 9 | Хост с доступным kadmin. |
Команды для установки Helm-чартов:
$ helm upgrade --install kerberos-operator oci://"$PRIVATE_REGISTRY"/adc-enterprise/charts/kerberos-operator --version <chart_version> -f ko-values.yaml --namespace kerberos-operator --create-namespace
$ helm upgrade --install kerberos-config oci://"$PRIVATE_REGISTRY"/adc-enterprise/charts/kerberos-config --version <chart_version> -f kc-values.yaml --namespace kerberos-operator --create-namespace
Для проверки установки используйте команды:
$ kubectl get secrets -n kerberos-operator
$ kubectl get configmaps -n kerberos-operator
Пример вывода:
kubectl get secrets -n kerberos-operator NAME TYPE DATA AGE kerberos-config-ldap-credentials krb5.arenadata.io/ldap-credentials 5 7s sh.helm.release.v1.kerberos-config.v1 helm.sh/release.v1 1 7s sh.helm.release.v1.kerberos-operator.v1 helm.sh/release.v1 1 48m kubectl get configmaps -n kerberos-operator NAME DATA AGE kube-root-ca.crt 1 50m
Шаг 2. Создание keytab-ресурса и принципалов
-
Создайте манифест-файл impala_keytab.yaml с принципалами Impala. Например:
apiVersion: krb5.arenadata.io/v1alpha1 kind: Keytab metadata: name: impala-keytab namespace: impala spec: items: - realm: RU-CENTRAL1.INTERNAL (1) labelSelector: env: prod principals: (2) - HTTP/impala-cloud.ru-central1.internal - impala/impala-cloud.ru-central1.internal - impala/impala-jdbc.ru-central1.internal rotation: interval: 720h checkInterval: 1h1 Kerberos реалм (realm). 2 Kerberos-принципалы для доступа к керберизированным сервисам ADH. -
Примените конфигурацию:
$ kubectl apply -f impala_keytab.yaml -
Проверьте создание keytab-ресурса с помощью команд:
$ kubectl get keytab -n impala $ kubectl get secret impala-keytab -n impalaПример вывода:
NAME ROTATION READY AGE NEXTROTATION impala-keytab RotationScheduled SecretGenerated 2d1h Next rotation required 2026-05-22T14:13:11Z
NAME TYPE DATA AGE impala-keytab krb5.arenadata.io/bundle 2 2d1h
Шаг 3. Обновление секретов Kubernetes
Развернутый ранее кластер Impala использует секрет Kubernetes c конфигурационными файлами ADH для взаимодействия с незащищенными ADH-сервисами. Для включения Kerberos/SSL и обеспечения взаимодействия Impala с сервисами ADH, защищенными SSL, необходимо изменить конфигурационные файлы ADH и пересоздать секреты Kubernetes.
-
Измените конфигурационные файлы core-site.xml, hdfs-site.xml и hive-site.xml. Обновленные файлы должны содержать следующие свойства:
core-site.xml<?xml version="1.0"?> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://adh</value> </property> <property> <name>dfs.nameservices</name> <value>adh</value> </property> <property> <name>hadoop.security.authentication</name> <value>kerberos</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.namenode.kerberos.principal</name> <value>nn/_HOST@REALM</value> </property> </configuration>hdfs-site.xml<?xml version="1.0"?> <configuration> <property> <name>dfs.nameservices</name> <value>adh</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.client.failover.proxy.provider.adh</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ObserverReadProxyProvider</value> </property> </configuration>hive-site.xml<?xml version="1.0"?> <configuration> <property> <name>hive.metastore.uris</name> <value>thrift://ka-adh-2.ru-central1.internal:9083</value> </property> <property> <name>metastore.use.SSL</name> <value>True</value> </property> <property> <name>metastore.truststore.password</name> <value>bigdata</value> </property> <property> <name>metastore.truststore.path</name> <value>/etc/ssl/truststore.jks</value> </property> <property> <name>hive.metastore.sasl.enabled</name> <value>True</value> </property> <property> <name>hive.metastore.kerberos.principal</name> <value>hive/_HOST@RU-CENTRAL1.INTERNAL</value> </property> </configuration>где
RU-CENTRAL1.INTERNAL— ваш Kerberos-реалм. -
Если вы используете Impala с Ranger, обновите настройки Ranger согласно инструкции.
-
Пересоздайте секрет Kubernetes:
$ kubectl delete secret <hadoop-conf> -n <impala-cluster-ns> $ kubectl create secret generic <hadoop-conf> -n <impala-cluster-ns> --from-file=core-site.xml --from-file=hdfs-site.xml --from-file=hive-site.xmlгде:
-
<hadoop-conf>— имя секрета с конфигурационными файлами ADH. -
<impala-cluster-ns>— пространство имен, используемое кластером Impala.
-
-
Создайте JKS-файл хранилища сертификатов. Данный truststore-файл должен содержать все сертификаты вашего ADH-кластера. Создайте секрет для truststore-файла:
$ kubectl create secret generic ca-certs --namespace <impala-cluster-ns> --from-file=truststore.jks=/etc/ssl/truststore.jks -
Сгенерируйте сертификат для Impala:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout impala-jdbc.ru-central1.internal.key \ -out impala-jdbc.ru-central1.internal.crt \ -subj "/CN=impala-jdbc.ru-central1.internal" -
Создайте секрет для входящих JDBC-соединений:
$ kubectl -n <impala-cluster-ns> create secret generic impala-tls --from-file=cert.crt=impala-jdbc.ru-central1.internal.crt --from-file=crt.key=impala-jdbc.ru-central1.internal.key
Шаг 4. Обновление инсталляции Impala-кластера
-
Обновите конфигурационный файл Impala-кластера (impala_cluster_values.yaml), добавив в него параметры Kerberos/SSL. Обновленный файл должен иметь следующий вид:
image: registry: "<registry>" repository: "<image>" tag: "<tag>" pullPolicy: Always useRanger: false clusterDomain: cluster.local configsSecretName: "hadoop-conf" kerberos: (1) realm: RU-CENTRAL1.INTERNAL hostname: impala-jdbc.ru-central1.internal keytab: create: false secretName: impala-keytab labelSelector: env: prod ssl: secretName: ca-store (2) trustStoreKey: truststore.jks tls: secretName: impala-tls (3) certificateKey: cert.crt privateKey: crt.key # clientCaCertificate: ca.pem catalog: coordinator: executor: replicas: 2 statestore:1 Параметры Kerberos для доступа защищенному кластеру Impala. 2 Имя секрета с truststore-файлом. 3 Имя секрета с сертификатом Impala. ПРИМЕЧАНИЕРедактируя конфигурационные файлы для Impala, убедитесь, что значения следующих параметров совпадают:
-
kerberos.hostnameв конфигурационном файле кластера Impala (impala-cluster-values.yaml). -
spec.items.principalsв конфигурационном файле Keytab-ресурса. -
Имя хоста в параметрах сертификата/ключа в настройках Ingress-контроллера.
-
spec.rules.hostв настройках Ingress-контроллера.
-
-
Обновите инсталляцию кластера Impala:
$ helm upgrade --install impala-cluster oci://"$PRIVATE_REGISTRY"/adc-enterprise/charts/impala-cluster --version <version> -f impala_cluster_values.yaml --namespace <impala-cluster-ns> --create-namespace -
Удалите старые поды кластера, чтобы оператор Impala создал новые с обновленной конфигурацией:
$ kubectl delete pods -n <impala-cluster-ns> -l app.kubernetes.io/instance=impala -
Проверьте, что все поды имеют состояние
Running:$ kubectl get pods -n <impala-cluster-ns>Ожидаемый вывод:
NAME READY STATUS RESTARTS AGE impala-cluster-catalog-0 1/1 Running 0 65m impala-cluster-coordinator-0 1/1 Running 0 65m impala-cluster-executor-0 1/1 Running 0 65m impala-cluster-executor-1 1/1 Running 0 65m impala-cluster-statestore-0 1/1 Running 0 65m
Шаг 5. Подключение к Impala по JDBC
Для внешнего доступа к Impala по JDBC необходимо настроить один из способов публикации сервиса, например, используя балансировщик нагрузки (load balancer) или Ingress-контроллер. Все настройки, связанные с публикацией сервиса, включая DNS, аннотации, параметры Ingress, TLS-сертификаты, правила балансировщика и прочие, должны быть указаны в соответствии с вашей инфраструктурой Kubernetes.
-
Получите внешний IP-адрес балансировщика или Ingress-контроллера. Например:
impala-lb LoadBalancer 10.96.231.158 10.92.42.144 21050:32154/TCP,26000:30753/TCP,24000:32645/TCP 25h
Скопируйте внешний IP-адрес для дальнейших шагов (в данном примере это
10.92.42.144). -
Подключитесь к Impala по JDBC, например, с помощью DBeaver. Строка подключения JDBC имеет следующий вид:
jdbc:impala://<external-ip>:21050/default;AuthMech=1;KrbServiceName=impala;KrbHostFQDN=impala-jdbc.ru-central1.internal;SSL=1;SSLTrustStore=<path>truststore.jks;SSLTrustStorePwd=<password>;httpPath=cliservice
где:
-
<external-ip>— IP-адрес Ingress-контроллера или балансировщика. -
KrbServiceName=impala— сервисное имя Kerberos. -
KrbHostFQDN=impala-jdbc.ru-central1.internal— имя хоста, указанное в values-файле кластера Impala (impala_cluster_values.yaml). -
SSLTrustStore=<path>/truststore.jks— путь к truststore-файлу с сертификатами для использования DBeaver. -
SSLTrustStorePwd=<password>— пароль для доступа к truststore-файлу.
-