Установка 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 – опционально.
Общая подготовка любого узла, с которым планируется работа#
Подключиться к узлу, на котором будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.
Для входа по SSH с локальной машины – запустить локальный терминал (консоль) и ввести в командной строке:
ssh <имя_пользователя>@<ip_адрес_узла>, где
<имя_пользователя>– логин пользователя, под которым хотим зайти на удаленный узел. Например:ssh root@{ IP_ADDRESS }. После ввода в консоли будет запрошен пароль – ввести пароль пользователя, под которым необходимо зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать «Enter» (для macOS - «return»).При подключении по SSH сразу после подключения произойдет переход в домашнюю директорию пользователя, под которым выполнено подключение.
Проверить версию Python командой:
python --versionНа подготовленных машинах Python 3.7.4 был установлен. При отсутствии – необходимо установить.
Проверить версию установленного пакета 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Проверить установку текстового редактора nano командой
nano --version. При отсутствии текстового редактора – установить командой:apt-get install nano
Подготовка узлов для развертывания компонента#
Подключиться к узлу, на котором будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.
Для входа по SSH с локальной машины – запустить локальный терминал (консоль) и ввести в командной строке:
ssh <имя_пользователя>@<ip_адрес_узла>, где
<имя_пользователя>– логин пользователя, под которым необходимо зайти на удаленный узел. Например,ssh root@{ IP_ADDRESS }. После ввода в консоли будет запрошен пароль – ввести пароль пользователя, под которым необходимо зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать «Enter» (для macOS - «return»).При подключении по SSH сразу после подключения произойдет переход в домашнюю директорию пользователя, под которым выполнено подключение.
Для увеличения отказоусточивости компонента 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Для уменьшения использования системного диска рекомендуется отключить SWAP. Для этого необходимо под пользователем root на сервере установки EVTD выполнить команду:
swapoff -aПроверить версию установленного пакета unzip командой
unzip. При наличии пакета будет выведена справка об аргументах, при отсутствии – сообщение о неизвестной команде. Установить пакет командой:sudo apt-get install unzipПроверить версию установленного пакета 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Прописать возможность входа пользователя под SSH с паролем (выполнить под пользователем root):
nano /etc/openssh/sshd_configФайл sshd_config откроется во встроенном текстовом редакторе nano, необходимо найти строку
PasswordAuthentication noи изменить ее наPasswordAuthentication yes. Сохранить изменения («ctrl+O», «ctrl+X») и перезапустить службу SSH командой:systemctl restart sshdСоздать для дальнейшего выполнения установки пользователя kafka и задать его пароль под пользователем с правами sudo. Ввести последовательно команды:
sudo useradd kafka sudo passwd kafkaПосле чего терминал попросит ввести новый пароль для пользователя kafka. Ввести пароль, нажать «Enter», повторно ввести пароль для подтверждения и снова нажать «Enter». Данный пароль необходимо использовать на всех узлах развертывания для пользователя kafka.
Увеличить лимит дескрипторов для пользователя 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Команды для создания директории и смены владельца директорий установки ПО, данных и логов:
Команда |
Назначение |
|---|---|
|
Создание директории для установки всех компонентов ПО |
|
Смена владельца директории Apache |
|
Создание директории kafka |
|
смена владельца директории kafka |
|
Создание директории kafka-data |
|
Смена владельца директории kafka-data |
|
Создание директории kafka-logs |
|
Смена владельца директории kafka-logs |
|
Создание директории zookeeper-data |
|
Смена владельца директории zookeeper-data |
Для автоматического перезапуска 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Дополнительно проверить:
доступность порта 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).
Подготовка узла, с которого будет осуществляться установка#
На сервере, с которого будет производиться установка, необходимо наличие следующих пакетов:
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_profileunzip
Проверить версию установленного пакета unzip командой
unzip. При наличии пакета будет выведена справка об аргументах, при отсутствии – сообщение о неизвестной команде. Установить пакет командой:sudo apt-get install unzipjava-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_64sshpass
sudo apt-get install sshpassgroovy
sudo apt-get install groovyРекомендованная версия Groovy Version: 3.0.х Проверить наличие можно командой
groovy– будет выведена справка по ключам утилиты.Загрузить Apache Kafka и полный дистрибутив EM-*-distrib.zip продукта EM на сервер, скриптами которого будет производиться установка.
Поэтапно разархивировать дистрибутивы:
unzip EM-*-distrib.zip unzip EM-*-owned-distrib.zip unzip dependency-resolver-*-distrib.zipСледующим скриптом производим склейку дистрибутива:
groovy -cp ./src merge.groovy --report ./Report.json EM-*-party-distrib.zip EM-*-owned-distrib.zipВАЖНО! Сохранять последовательность
party-,owned-архивов.Распаковать получившийся единый архив:
unzip -o EM-*-owned-distrib.zip unzip -o EVTD-scripts-*-distrib.zip -d install unzip -o EVTD-kafka-*-distrib.zip -d install/AnsibleПерейти в директорию ролей установки:
cd install/AnsibleСоздать директорию files:
mkdir filesВ директорию files загружаем дистрибутив kafka_2.13-*.tgz, с которого будет производиться установка. Дистрибутив предварительно необходимо скачать с официального сайта Apache Kafka:
mv /home/dev_user/EM/kafka_2.13-*.tgz ./filesУбедиться, что созданы директории files (там находится kafka_2.13-*.tgz) и inventories с подкаталогом „!EXAMPLE!“. Копируем директорию inventories/“!EXAMPLE!“ в созданную директорию, например, inventories/DEV:
mkdir inventories/DEV cp -r inventories/'!EXAMPLE!'/* inventories/DEV/Заполнить файл inventory в скопированной директории, указывая в секции IP-адреса хостов. ВАЖНО! Не следует даже при установке на тот же хост указывать localhost или 127.0.0.1.
Поместить в подкаталог SSL хранилище сертификатов, содержащее подписанный сертификат брокера и сертификат доверенного УЦ с именем kafka-server.jks. В подкаталог ssl_admin помещаем хранилище сертификатов c TLS-сертификатом, у которого есть права администратора доступа согласно ролевой модели с именем kafka-admin.jks. Сертификат должен быть выпущен УЦ, которому доверяют узлы брокера техсервиса передачи.
Тип хранилищ kafka-server.jks и kafka-admin.jks должен быть JKS (p12 не подходит).
Перейти в подкаталог 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 }}"Заполнить чувствительную информацию в файле vault.yml. Прежде всего файл требуется очистить от старых значений-примеров. Для этого необходимо воспользоваться утилитой ansible-vault (идет в комплекте с пакетом ansible). Для шифрования пароля следует выполнить команду на сервере, с которого производится развертывание EVTD, например:
ansible-vault encrypt_string -n kafka_password 'PA$$W0Rd', где:–n– имя переменной;'PA$$W0Rd'- шифруемый пароль.
При выполнении команды будет интерактивно запрошен ключ шифрования и подтверждение ключа – его необходимо запомнить. В результате полученный вывод команды необходимо вставить в файл vault.yml с новой строки.
Необходимо с одним и тем же значением ключа шифрования осуществить заполнение для переменных:
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'
Запуск установки компонента#
Перейти в подкаталог 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!».Запустить установку и запуск компонента командой:
ansible-playbook -i inventories/DEV/inventory zk_and_kafka.yml --ask-vault-pass, где
DEV– имя подкаталога. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей, созданный в п. 11. После выполнения команды не должно быть строк с префиксом «FAILED!». В результате успешного завершения работы playbook имеем настроенный хост/кластер с работающим компонентом EVTD (в процессе установки автоматически происходит запуск компонента и выполняются smoke-тесты на проверку корректности запуска).
Создание топиков и прав доступа#
Для добавления администраторов доступа необходимо в имеющийся файл vars.yml в блок
kafkaдобавить параметрadmin_rights, в котором указать список DN. Пример:kafka: admin_rights: - <DN сертификата клиента>Запустить добавление администраторов командой:
ansible-playbook -i inventories/DEV/inventory admin_rights.yml --ask-vault-passПосле запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей. После выполнения команды не должно быть строк с префиксом «FAILED!».
Для создания топиков необходимо добавить следующие блоки в имеющийся файл vars.yml по образцу:
kafka_topics: list: - name: <имя создаваемого топика> partitions: <количество партиций> configs: # дополнительные конфигурации топика - retention.ms=<очистка топиков по времени в мс> kafka_acls: - principal: <DN сертификата клиента> producer: true # в данном случае клиент выступает поставщиком. В случае потребителя указывается «consumer: true» topics: <имя топика, к которому подключается клиент>Запустить команду создания топиков и адресов:
ansible-playbook -i inventories/DEV/inventory kafka_topics_acls.yml --ask-vault-pass, где
DEV– имя подкаталога. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей. После выполнения команды не должно быть строк с префиксом «FAILED!». В результате будут созданы топики и выданы соответствующие права сертификатам с указанными DN.