Установка Vanilla Apache Kafka 2.7.2 скриптами EVTD 3.0.0 на ALT Linux#

Описание ландшафта#

Данная инсталляция описана для узла с ALT 8 SP Server, не имеющего доступ к сети Интернет. Менеджеры пакетов на других версиях Linux и способы их установки в корпоративных сетях могут отличаться.

ВАЖНО! Для выполнения установки необходимо иметь доступ к узлу, с которого будет осуществляться установка – локально или по SSH под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.

Некоторые команды выполняются под пользователем root. Перед выполнением команды будет сообщение: «Команда выполняется под пользователем root».

Проверка версии Linux:

cat /etc/*-release

Результат вывода покажет версию, например:

NAME="ALT SPServer"
VERSION="8.4"

ВАЖНО! Предполагается, что все упомянутые ниже произвольные текстовые метки содержат буквы только латинского алфавита. Использование алфавитов других языков не проверялось.

В инструкции изложено развертывание ландшафта-примера. C описанием иных параметров можно ознакомиться в файле ./install/Ansible/roles/kafka/defaults/main.yml после подготовки дистрибутива, а также в документации к продукту. Документация к продукту приложена с дистрибутивом в архиве EM-doc-*-distrib.zip.

Для уcтановки используется версия Apache Kafka 2.7.2 и скрипты развертывания EVTD.

Дистрибутив Apache Kafka 2.7.2 необходимо скачать с официального сайта Kafka Apache.

В установке используется 3 ВМ на базе ОС ALT 8 SP Server, одна из которых также использовалась в качестве узла, с которого производилась установка.

Рекомендация: требуется одна ВМ в качестве узла, с которого выполняется установка. Кластер Apache Kafka и кластер Zookeeper должны состоять из нечетного количества узлов и могут располагаться как на одном и том же, так и на разных наборах ВМ.

Целевое состояние тестового развертывания продукта – кластер Apache Kafka 2.7.2 из 3-х узлов и кластер Zookeeper из 3-х узлов на одних и тех же ВМ.

Предусловия подготовки окружения для развертывания EVTD#

На узле, откуда будет устанавливаться Apache Kafka скриптами EVTD, необходимо иметь доступ в интернет, либо при его отсутствии – обеспечить возможность установки следующих вспомогательных пакетов из другого доступного источника:

  • UnZip 6.00 of 20 April 2009, by ALT Linux Team. Original by Info-ZIP;

  • Python 3.7.4;

  • setuptools Version: 40.8.0;

  • openjdk 11.0.19.1 2023-04-18;

  • Groovy Version: 2.4.8;

  • ansible 2.9.27;

  • sshpass 1.05;

  • netcat – опционально;

  • GNU nano, version 4.0 – опционально.

На узлах, куда будет устанавливаться EVTD, необходимо иметь доступ в интернет, либо при его отсутствии - обеспечить возможность установки следующих вспомогательных пакетов из другого доступного источника:

  • UnZip 6.00 of 20 April 2009, by ALT Linux Team. Original by Info-ZIP;

  • Python 3.7.4;

  • setuptools Version: 40.8.0;

  • openjdk 11.0.19.1 2023-04-18;

  • sshpass 1.05;

  • netcat – опционально;

  • GNU nano, version 4.0 – опционально.

Общая подготовка любого узла, с которым планируется работа#

  1. Подключиться к узлу, на котором будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.

    Для входа по SSH с локальной машины – запустить локальный терминал (консоль) и ввести в командной строке:

    ssh <имя_пользователя>@<ip_адрес_узла>
    

    , где <имя_пользователя> – логин пользователя, под которым хотим зайти на удаленный узел. Например: ssh root@{ IP_ADDRESS }. После ввода в консоли будет запрошен пароль – ввести пароль пользователя, под которым необходимо зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать «Enter» (для macOS - «return»).

    При подключении по SSH сразу после подключения произойдет переход в домашнюю директорию пользователя, под которым выполнено подключение.

  2. Проверить версию Python командой:

    python --version
    

    На подготовленных машинах Python 3.7.4 был установлен. При отсутствии – необходимо установить.

  3. Проверить версию установленного пакета unzip командой unzip . При наличии пакета будет выведена справка об аргументах, при отсутствии – сообщение о неизвестной команде. Установить пакет командой:

    sudo apt-get install unzip
    

    Проверить версию установленного пакета java-11-openjdk командой java -version. При отсутствии пакета java-11-openjdk – установить под пользователем root последовательностью команд:

    apt-get install java-11-openjdk
    
    echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
    
    source /etc/profile.d/java.sh
    
    echo $JAVA_HOME
    

    При успешной установке в терминале появится ответ: /usr/lib/jvm/java-11-openjdk-11.0.21.0.9-0.x86_64

  4. Проверить установку текстового редактора nano командой nano --version. При отсутствии текстового редактора – установить командой:

    apt-get install nano
    

Подготовка узлов для развертывания компонента#

  1. Подключиться к узлу, на котором будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.

    Для входа по SSH с локальной машины – запустить локальный терминал (консоль) и ввести в командной строке:

    ssh <имя_пользователя>@<ip_адрес_узла>
    

    , где <имя_пользователя> – логин пользователя, под которым необходимо зайти на удаленный узел. Например, ssh root@{ IP_ADDRESS }. После ввода в консоли будет запрошен пароль – ввести пароль пользователя, под которым необходимо зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать «Enter» (для macOS - «return»).

    При подключении по SSH сразу после подключения произойдет переход в домашнюю директорию пользователя, под которым выполнено подключение.

  2. Для увеличения отказоусточивости компонента EVTD рекомендуется изменить сетевые настройки ядра Linux на следующие значения (все команды выполняются под пользователем root):

    Количество попыток передачи SYN-пакета при установлении нового соединения:

    echo "3" > /proc/sys/net/ipv4/tcp_syn_retries
    

    Количество попыток передачи SYN, ACK-пакета в ответ на SYN-запрос (максимальное число попыток установить пассивное TCP-соединение, инициированное другим сервером):

    echo "3" > /proc/sys/net/ipv4/tcp_synack_retries
    

    Как часто (в секундах) следует проверять соединение, если оно давно не используется:

    echo "60" > /proc/sys/net/ipv4/tcp_keepalive_time
    

    Количество попыток проверки жизнеспособности прежде, чем будет принято решение о разрыве соединения:

    echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
    

    Интервал (в секундах) проверки жизнеспособности сокета. Значение учитывается при подсчете времени, которое должно пройти перед тем, как соеднение будет разорвано:

    echo "1" > /proc/sys/net/ipv4/tcp_keepalive_intvl
    

    Максимальное количество попыток повторной передачи пакетов до того, как соединение будет считаться разорванным:

    echo "3" > /proc/sys/net/ipv4/tcp_retries2
    

    После внесения настроек для применения внесенных параметров выполнить команду: sysctl -p. Проверить, применились ли параметры можно командой: sysctl <Название параметра>. Пример: sysctl net.ipv4.tcp_syn_retries

  3. Для уменьшения использования системного диска рекомендуется отключить SWAP. Для этого необходимо под пользователем root на сервере установки EVTD выполнить команду:

    swapoff -a
    
  4. Проверить версию установленного пакета unzip командой unzip . При наличии пакета будет выведена справка об аргументах, при отсутствии – сообщение о неизвестной команде. Установить пакет командой:

    sudo apt-get install unzip
    
  5. Проверить версию установленного пакета java-11-openjdk командой java -version. При наличии пакета будет выведено сообщение типа:

    openjdk version "11.0.13" 2021-10-19 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
    

    При отсутствии – сообщение о неизвестной команде. Установить пакет под пользователем root последовательностью команд:

    apt-get install java-11-openjdk
    
    echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
    
    source /etc/profile.d/java.sh
    
    echo $JAVA_HOME
    
  6. Прописать возможность входа пользователя под SSH с паролем (выполнить под пользователем root): nano /etc/openssh/sshd_config

    Файл sshd_config откроется во встроенном текстовом редакторе nano, необходимо найти строку PasswordAuthentication no и изменить ее на PasswordAuthentication yes. Сохранить изменения («ctrl+O», «ctrl+X») и перезапустить службу SSH командой: systemctl restart sshd

  7. Создать для дальнейшего выполнения установки пользователя kafka и задать его пароль под пользователем с правами sudo. Ввести последовательно команды:

    sudo useradd kafka
    sudo passwd kafka
    

    После чего терминал попросит ввести новый пароль для пользователя kafka. Ввести пароль, нажать «Enter», повторно ввести пароль для подтверждения и снова нажать «Enter». Данный пароль необходимо использовать на всех узлах развертывания для пользователя kafka.

  8. Увеличить лимит дескрипторов для пользователя kafka (выполнить под пользователем root). Для этого необходимо открыть файл limits.conf командой nano /etc/security/limits.conf и в нем прописать:

    kafka soft nproc 512000
    kafka hard nproc 512000
    kafka soft nofile 512000
    kafka hard nofile 512000
    
  9. Команды для создания директории и смены владельца директорий установки ПО, данных и логов:

Команда

Назначение

sudo mkdir /u01/Apache

Создание директории для установки всех компонентов ПО

sudo chown kafka:kafka /u01/Apache

Смена владельца директории Apache

sudo mkdir /u01/Apache/kafka

Создание директории kafka

sudo chown kafka:kafka /u01/Apache/kafka

смена владельца директории kafka

sudo mkdir /u01/Apache/kafka-data

Создание директории kafka-data

sudo chown kafka:kafka /u01/Apache/kafka-data

Смена владельца директории kafka-data

sudo mkdir /u01/Apache/kafka-logs

Создание директории kafka-logs

sudo chown kafka:kafka /u01/Apache/kafka-logs

Смена владельца директории kafka-logs

sudo mkdir /u01/Apache/zookeeper-data

Создание директории zookeeper-data

sudo chown kafka:kafka /u01/Apache/zookeeper-data

Смена владельца директории zookeeper-data

  1. Для автоматического перезапуска Apache Kafka и Zookeeper в случае перезагрузки сервера, а также для корректной работы скриптов Ansible, необходимо перед запуском скриптов установки подготовить пользовательские или системные сервисы обслуживания.

    Создание системных сервисов обслуживания:

    Необходимо выдать пользователю kafka права для создания сервисов и права для управления сервисами через vim. Для этого последовательно выполнить ряд команд под пользователем root:

    Открыть файл sudoers для редактирования:

    sudo vim /etc/sudoers
    

    Добавить строки в файл:

    kafka ALL= NOPASSWD: /bin/systemctl start kafka
    kafka ALL= NOPASSWD: /bin/systemctl stop kafka
    kafka ALL= NOPASSWD: /bin/systemctl status kafka
    kafka ALL= NOPASSWD: /bin/systemctl restart kafka
    kafka ALL= NOPASSWD: /bin/systemctl enable kafka
    kafka ALL= NOPASSWD: /bin/systemctl disable kafka
    kafka ALL= NOPASSWD: /bin/systemctl daemon-reload
    kafka ALL= NOPASSWD: sudoedit /etc/systemd/system/kafka.service
    kafka ALL= NOPASSWD: /bin/systemctl start zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl stop zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl status zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl restart zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl enable zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl disable zookeeper
    kafka ALL= NOPASSWD: /bin/systemctl daemon-reload
    kafka ALL= NOPASSWD: sudoedit /etc/systemd/system/zookeeper.service
    

    Создание пользовательских сервисов обслуживания:

    Чтобы пользовательский сервис приложения не завершался принудительно, необходимо добавить нужного пользователя в список исключений. Для этого последовательно выполнить ряд команд под пользователем root:

    Открыть файл logind.conf для редактирования:

    sudo vim /etc/systemd/logind.conf
    

    Добавить строку в файл:

    KillExcludeUsers=kafka
    

    Дать возможность пользовательским сервисам работать как долговременные, выполнив команды:

    systemctl restart systemd-logind
    
    loginctl enable-linger kafka
    
  2. Дополнительно проверить:

    • доступность порта 9093 на серверах Kafka для подключения клиентов. Проверить командой nc -l 9093

    sudo apt-get install nc – устанавливает nc
    на сервере команда nc -l 9093 – прослушивает порт
    

    с локального компьютера или другого хоста nc -v <хост> 9093 – проверяет доступность

    • доступность порта 2181 на серверах Zookeeper для подключения брокеров Kafka

    • доступность портов 2888 и 3888 на серверах Zookeeper для создания кластера

    • Проверить разрешение имен серверов по IP в рамках всех серверов Kafka (с использованием DNS или записи в /etc/hosts).

Подготовка узла, с которого будет осуществляться установка#

  1. На сервере, с которого будет производиться установка, необходимо наличие следующих пакетов:

    ansible

    pip3 install --upgrade --user setuptools
    pip3 install --upgrade --user ansible==2.9.27
    sudo vim .bash_profile
    

    В файл .bash_profile необходимо прописать: export PATH=$PATH:~/.local/bin. Чтобы применить прописанные обновления в файле .bash_profile выполнить команду:

    source .bash_profile
    

    unzip

    Проверить версию установленного пакета unzip командой unzip . При наличии пакета будет выведена справка об аргументах, при отсутствии – сообщение о неизвестной команде. Установить пакет командой:

    sudo apt-get install unzip
    

    java-11-openjdk Проверить версию установленного пакета java-11-openjdk командой java -version. При отсутствии установить под пользователем root последовательностью команд:

    apt-get install java-11-openjdk
    
    echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
    
    source /etc/profile.d/java.sh
    
    echo $JAVA_HOME
    

    При успешной установке в терминале появится ответ: /usr/lib/jvm/java-11-openjdk-11.0.21.0.9-0.x86_64

    sshpass

    sudo apt-get install sshpass
    

    groovy

    sudo apt-get install groovy
    

    Рекомендованная версия Groovy Version: 3.0.х Проверить наличие можно командой groovy – будет выведена справка по ключам утилиты.

  2. Загрузить Apache Kafka и полный дистрибутив EM-*-distrib.zip продукта EM на сервер, скриптами которого будет производиться установка.

    Поэтапно разархивировать дистрибутивы:

    unzip EM-*-distrib.zip
    unzip EM-*-owned-distrib.zip
    unzip dependency-resolver-*-distrib.zip
    
  3. Следующим скриптом производим склейку дистрибутива:

    groovy -cp ./src merge.groovy --report ./Report.json EM-*-party-distrib.zip EM-*-owned-distrib.zip
    

    ВАЖНО! Сохранять последовательность party-, owned- архивов.

  4. Распаковать получившийся единый архив:

    unzip -o EM-*-owned-distrib.zip
    unzip -o EVTD-scripts-*-distrib.zip -d install
    unzip -o EVTD-kafka-*-distrib.zip -d install/Ansible
    
  5. Перейти в директорию ролей установки:

    cd install/Ansible
    

    Создать директорию files:

    mkdir files
    

    В директорию files загружаем дистрибутив kafka_2.13-*.tgz, с которого будет производиться установка. Дистрибутив предварительно необходимо скачать с официального сайта Apache Kafka:

    mv /home/dev_user/EM/kafka_2.13-*.tgz ./files
    
  6. Убедиться, что созданы директории files (там находится kafka_2.13-*.tgz) и inventories с подкаталогом „!EXAMPLE!“. Копируем директорию inventories/“!EXAMPLE!“ в созданную директорию, например, inventories/DEV:

    mkdir inventories/DEV
    cp -r inventories/'!EXAMPLE!'/* inventories/DEV/
    
  7. Заполнить файл inventory в скопированной директории, указывая в секции IP-адреса хостов. ВАЖНО! Не следует даже при установке на тот же хост указывать localhost или 127.0.0.1.

  8. Поместить в подкаталог SSL хранилище сертификатов, содержащее подписанный сертификат брокера и сертификат доверенного УЦ с именем kafka-server.jks. В подкаталог ssl_admin помещаем хранилище сертификатов c TLS-сертификатом, у которого есть права администратора доступа согласно ролевой модели с именем kafka-admin.jks. Сертификат должен быть выпущен УЦ, которому доверяют узлы брокера техсервиса передачи.

    Тип хранилищ kafka-server.jks и kafka-admin.jks должен быть JKS (p12 не подходит).

  9. Перейти в подкаталог inventories/DEV/group_vars/all и заполнить конфигурацию.

    Настройка параметров файла vars.yml:

    • ansible_user – логин пользователя для SSH-подключения к хостам развертывания, ранее указанным в файле inventory;

    • ansible_password – пароль от пользователя для SSH-подключения к хостам развертывания.

    • admin_jks_file – проверить наличие параметра (при отсутствии – добавить) и указать в нем путь от директории inventories/DEV/ssl_admin/ до файла с keyStore из пункта 8;

    • admin_jks_password – проверить наличие параметра (при отсутствии – добавить) и указать в нем переменную, которая будет зашифрована в п. 11.

    Пример заполненного блока общих настроек:

    ansible_user: kafka
    ansible_password: "{{ kafka_password }}"
    
    admin_jks_file: inventories/DEV/ssl_admin/kafka-admin.jks
    admin_jks_password: "{{ admin_jks_password }}"
    

    Настройка блока kafka:

    • installdir – абсолютный путь на серверах развертывания до каталога, куда предполагается установить приложение;

    • datadir – абсолютный путь на серверах развертывания до данных приложения;

    • logdir – абсолютный путь на серверах развертывания до логов приложения;

    • port – используемый порт для Apache Kafka;

    • keyStorePath, trustStorePath – указать путь от директории SSL до файла с keyStore из пункта 8. Параметры trustStorePassword и keyStorePassword будут зашифрованы в пункте 11;

    • блок настроек audit.rest: false – данный параметр отключает подключение к системе Аудит. Если параметр не указать, скрипт установки не будет выполнен и будет запрашивать сертификат подключения к системе Аудит;

    • admin_rights – указать список DN.

    Пример заполненного блока kafka:

    kafka:
        admin_rights:
        - CN=test,O=SBT,L=Moscow,C=RU
        installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере до приложения
        logdir: /opt/Apache/kafka-logs
        datadir: /opt/Apache/kafka-data
        port: 9093
        trustStorePath: ssl/kafka-server.jks # путь от inventories/_стенд_/ до файла с trustStore
        trustStorePassword: "{{ jks_password }}" # пароль от trustStore
        keyStorePath: ssl/kafka-server.jks # путь от inventories/_стенд_/ до файла с keyStore
        keyStorePassword: "{{ jks_password }}" # пароль от keyStore
        keyPassword: "{{ jks_password }}" # пароль от key
        audit: # настройки аудита
            ] rest: false # запись событий аудита в rest endpoint
    

    Настройка блока zookeeper:

    • installdir – абсолютный путь на серверах развертывания до каталога, куда предполагается установить приложение;

    • datadir – абсолютный путь на серверах развертывания до данных приложения;

    • logdir – абсолютный путь на серверах развертывания до логов приложения;

    • keyStorePath, trustStorePath – указать путь от директории SSL до файла с keyStore из пункта 8. Параметры trustStorePassword и keyStorePassword будут зашифрованы в пункте 11.

    Пример заполненного блока zookeeper:

    zookeeper:
        installdir: /opt/Apache/kafka
        logdir: /opt/Apache/kafka-logs
        datadir: /opt/Apache/zookeeper-data
        trustStorePath: ssl/kafka-server.jks
        trustStorePassword: "{{ jks_password }}"
        keyStorePath: ssl/kafka-server.jks
        keyStorePassword: "{{ jks_password }}"
        keyPassword: "{{ jks_password }}"
    
  10. Заполнить чувствительную информацию в файле vault.yml. Прежде всего файл требуется очистить от старых значений-примеров. Для этого необходимо воспользоваться утилитой ansible-vault (идет в комплекте с пакетом ansible). Для шифрования пароля следует выполнить команду на сервере, с которого производится развертывание EVTD, например: ansible-vault encrypt_string -n kafka_password 'PA$$W0Rd' , где:

    • –n – имя переменной;

    • 'PA$$W0Rd' - шифруемый пароль.

    При выполнении команды будет интерактивно запрошен ключ шифрования и подтверждение ключа – его необходимо запомнить. В результате полученный вывод команды необходимо вставить в файл vault.yml с новой строки.

  11. Необходимо с одним и тем же значением ключа шифрования осуществить заполнение для переменных:

    • kafka_password – пароль от пользователя узлов развертывания;

    • jks_password – пароль от хранилища сертификатов узлов развертывания;

    • admin_jks_password – пароль от хранилища сертификатов с правами администратора.

    Соответственно, выполняются команды:

    ansible-vault encrypt_string -n kafka_password 'PA$$W0Rd'
    ansible-vault encrypt_string -n jks_password 'PA$$W0Rd'
    ansible-vault encrypt_string -n admin_jks_password 'PA$$W0Rd'
    

Запуск установки компонента#

  1. Перейти в подкаталог Ansible, который содержит playbooks для запуска.

    Для создания системных сервисов на хостах установки запустить команду:

    ansible-playbook -i inventories/DEV/inventory zk_kafka_system_service.yml --ask-vault-pass
    

    Для создания пользовательских сервисов запустить команду:

    ansible-playbook -i inventories/DEV/inventory zk_kafka_user_service.yml --ask-vault-pass
    

    , где DEV – имя подкаталога. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей, созданный в п. 11. После выполнения команды не должно быть строк с значением «FAILED!».

  2. Запустить установку и запуск компонента командой:

    ansible-playbook -i inventories/DEV/inventory zk_and_kafka.yml --ask-vault-pass
    

    , где DEV – имя подкаталога. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей, созданный в п. 11. После выполнения команды не должно быть строк с префиксом «FAILED!». В результате успешного завершения работы playbook имеем настроенный хост/кластер с работающим компонентом EVTD (в процессе установки автоматически происходит запуск компонента и выполняются smoke-тесты на проверку корректности запуска).

Создание топиков и прав доступа#

  1. Для добавления администраторов доступа необходимо в имеющийся файл vars.yml в блок kafka добавить параметр admin_rights, в котором указать список DN. Пример:

    kafka:
        admin_rights:
        - <DN сертификата клиента>
    
  2. Запустить добавление администраторов командой:

    ansible-playbook -i inventories/DEV/inventory admin_rights.yml  --ask-vault-pass
    

    После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей. После выполнения команды не должно быть строк с префиксом «FAILED!».

  3. Для создания топиков необходимо добавить следующие блоки в имеющийся файл vars.yml по образцу:

    kafka_topics:
        list:
          - name: <имя создаваемого топика>
            partitions: <количество партиций>
            configs: # дополнительные конфигурации топика
                - retention.ms=<очистка топиков по времени в мс>
    
    kafka_acls:
      - principal: <DN сертификата клиента>
        producer: true # в данном случае клиент выступает поставщиком. В случае потребителя указывается «consumer: true»
        topics: <имя топика, к которому подключается клиент>
    
  4. Запустить команду создания топиков и адресов:

    ansible-playbook -i inventories/DEV/inventory kafka_topics_acls.yml --ask-vault-pass
    

    , где DEV – имя подкаталога. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей. После выполнения команды не должно быть строк с префиксом «FAILED!». В результате будут созданы топики и выданы соответствующие права сертификатам с указанными DN.