Развертывание оркестратора
28 сентября 2026
ID 305654
Для работы оркестратора необходимы следующие компоненты:
- Redis;
- Redis Sentinel;
- MongoDB;
- KNBE (бэкенд-сервис оркестратора, входит в поставку решения).
В качестве узлов кластера вы можете задействовать уже используемые хосты (виртуальные машины, далее ВМ, или физические серверы) или выделить отдельные хосты. Хосты должны работать под управлением ОС Linux с установленным Docker Engine.
Аппаратные и программные требования
Для работы компонентов оркестратора на узлах должно быть установлено следующее ПО и его зависимости:
- pacemaker;
- pcs;
- docker.io;
- openjdk-17-jre-headless.
Для расчета необходимых свободных ресурсов на конкретном узле в зависимости от схемы развертывания и количества управляемых устройств вы можете использовать таблицу ниже.
Таблица расчета необходимых вычислительных ресурсов на узлах
Компонент решения | Виртуальный процессор (vCPU) | ОЗУ, ГБ | Диск, ГБ | IOPS |
|---|---|---|---|---|
50 управляемых устройств | ||||
Redis | 2 | 1 | 100 | 1000 |
Redis Sentinel | 2 | 1 | ||
MongoDB | 2 | 2 | ||
KNBE | 4 | 4 | ||
100 управляемых устройств | ||||
Redis | 2 | 1 | 100 | 1000 |
Redis Sentinel | 2 | 1 | ||
MongoDB | 4 | 4 | ||
KNBE | 4 | 4 | ||
250 управляемых устройств | ||||
Redis | 2 | 2 | 100 | 1000 |
Redis Sentinel | 2 | 2 | ||
MongoDB | 4 | 4 | ||
KNBE | 6 | 4 | ||
500 управляемых устройств | ||||
Redis | 2 | 2 | 100 | 1000 |
Redis Sentinel | 2 | 2 | ||
MongoDB | 6 | 4 | ||
KNBE | 6 | 6 | ||
1000 управляемых устройств | ||||
Redis | 4 | 2 | 100 | 1000 |
Redis Sentinel | 2 | 2 | ||
MongoDB | 6 | 6 | ||
KNBE | 6 | 8 | ||
2000 управляемых устройств | ||||
Redis | 4 | 4 | 200 | 2000 |
Redis Sentinel | 2 | 4 | ||
MongoDB | 6 | 8 | ||
KNBE | 6 | 10 | ||
Пример расчета:
На первом и втором узле будут развернуты все компоненты, на третьем – только MongoDB и Redis Sentinel. Следовательно, если требуется подключить до 50 устройств, то на первом и втором узле должно быть доступно по 10 vCPU, 8 ГБ ОЗУ, 100 ГБ дискового пространства и по 1000 IOPS (на каждом), на третьем узле – 4 vCPU, 3 ГБ ОЗУ, 100 ГБ дискового пространства и 1000 IOPS.
В этой статье описан сценарий развертыванию оркестратора в виде минимального отказоустойчивого кластера на трех узлах: Node_1, Node_2 и Node_3. Узлы создаются в виде виртуальных машин. Схема развертывания показана ниже.

Схема развертывания оркестратора на трех узлах
Отказоустойчивость оркестратора достигается за счет настройки виртуального IP-адреса (Virtual IP, VIP), что подразумевает подключение узлов Node_1 и Node_2 в один L2-сегмент сети. Если необходимо разместить узлы Node_1 и Node_2 в разных подсетях, то необходимо обеспечить отказоустойчивость средствами клиентского приложения или используя другие технологии (DNS Health Checking, BGP Anycast).
- Подготовьте необходимые файлы для развертывания
- Скачайте образ ОС для использования на узлах:
- Astra Linux 1.8.3 – из личного кабинета https://lk.astra.ru/
При использовании Astra Linux устанавливайте требуемые пакеты из репозитория, поддерживающего версию Astra Linux 1.8.3.
- Ubuntu 22.04 – из репозитория
https://cloud-images.ubuntu.com/jammy/current(например, дистрибутивjammy-server-cloudimg-amd64.img).
- Astra Linux 1.8.3 – из личного кабинета https://lk.astra.ru/
- Загрузите образы контейнеров, которые будут использоваться для развертывания соответствующих компонентов оркестратора:
mongo:5.0.7, собранный с помощью исполняемых файлов из комплекта поставки Kaspersky NGFW;astra/ubi18-redis7015:1.8.2из Astra Container Registry для Astra Linux 1.8 илиredis:6.2.20из Docker Hub для Ubuntu 22.04;knbe-1.0.0.release.*.cis.amd64_en-US_ru-RU.tgzиз комплекта поставки Kaspersky NGFW.
- Скачайте образ ОС для использования на узлах:
- Создайте три ВМ каждого узла
- Настройте переменные среды
На каждом узле задайте перечисленные ниже переменные среды. При необходимости измените значения переменных.
Переменные среды задаются на время сеанса пользователя. Если сессия прервалась, переменные необходимо задать заново.
export HACLUSTER_PASS="SmplPss"export ORC_KEY_PASS="SmplPss"export NODE_1="192.168.1.101"export NODE_1_HOSTNAME="knbe-orc-1"export NODE_2="192.168.1.102"export NODE_2_HOSTNAME="knbe-orc-2"export NODE_3="192.168.1.103"export NODES_VIP="192.168.1.100"export NODES_NET_MASK="24"export NODES_VIP_ETH="eth0"export MONGO_ADMIN_PASS="SmplPss"export MONGO_KNAAS_PASS="SmplPss"Переменная
ORC_ENC_PASSдолжна быть не менее 32 символов.export ORC_ENC_PASS="SmplPssSmplPssSmplPssSmplSmplPss"export ORC_CONTAINER_NAME="knaas-orc:2.25.03.release.39.cis.amd64_en-US_ru-RU"Установка выполняется от имени пользователя
sdwan. - Установите необходимые пакеты
На каждом узле установите docker:
sudo apt install docker.io -ysudo usermod -aG docker $USERНа узлах Node_1 и Node_2 установите pacemaker, corosync и pcs:
sudo apt install pacemaker corosync pcs -yНа узле Node_1 установите OpenJDK, чтобы получить доступ к входящему в его состав keytool:
sudo apt install openjdk-17-jre-headless -y - Настройте кластер с помощью Corosync/Pacemaker
Настройка выполняется на узлах Node_1 и Node_2. Узел Node_3 является арбитром и не участвует в обработке запросов.
- Очистите содержимое файла
hostsфайл на узлах Node_1 и Node_2:sudo sed -i "/^127\.0\.1\.1\s.*$HOSTNAME/d" /etc/hosts - Добавьте A-записи хостов в
/etc/hostsна узлах Node_1 и Node_2:echo "$NODE_1 $NODE_1_HOSTNAME" | sudo tee -a /etc/hostsecho "$NODE_2 $NODE_2_HOSTNAME" | sudo tee -a /etc/hosts - Задайте пароль для стандартного пользователя hacluster на узлах Node_1 и Node_2:
echo "hacluster:$HACLUSTER_PASS" | sudo chpasswd - Запустите сервисы на узлах Node_1 и Node_2:
sudo systemctl enable --now pcsd corosync pacemaker - Удалите создаваемый по умолчанию кластер на Node_1:
sudo pcs cluster destroy --force - Выполните аутентификацию кластера на узле Node_1:
sudo pcs host auth $NODE_1_HOSTNAME $NODE_2_HOSTNAME -u hacluster -p $HACLUSTER_PASS - Инициализируйте кластер на узле Node_1:
sudo pcs cluster setup orc-ha $NODE_1_HOSTNAME $NODE_2_HOSTNAME --force - Запустите кластер на Node_1:
sudo pcs cluster start --allsudo pcs cluster enable --all - Выполните настройку кластера на узлах Node_1 и Node_2:
sudo pcs property set stonith-enabled=falsesudo pcs property set no-quorum-policy=stopsudo pcs property set symmetric-cluster=true - Проверьте статус кластера на любом из узлов:
sudo pcs status
Список узлов должен состоять из двух и они должны быть онлайн:
Node List:* Online: [ knbe-orc-1 knbe-orc-2 ]- Создайте ресурс с виртуальным IP-адресом на узле Node_1:
sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=$NODES_VIP cidr_netmask=$NODES_NET_MASK nic=$NODES_VIP_ETH op monitor interval=2s meta target-role="Started" - Настройте приоритеты использования ресурса для узлов на Node_1:
sudo pcs constraint location VirtualIP prefers $NODE_1_HOSTNAME=200sudo pcs constraint location VirtualIP prefers $NODE_2_HOSTNAME=0
- Очистите содержимое файла
- Создайте и установите сертификаты
Все действия c сертификатами необходимо выполнить на узле Node_1.
- Создайте структуру каталогов для хранения сертификатов компонентов установки на узле Node_1:
mkdir -p -m 0755 $HOME/ssl/camkdir -p -m 0755 $HOME/ssl/mongomkdir -p -m 0755 $HOME/ssl/redismkdir -p -m 0755 $HOME/ssl/redis-sentinelmkdir -p -m 0755 $HOME/ssl/orc - Создайте самоподписанный корневой сертификат.
Для этого создайте закрытый ключ:
openssl genpkey -algorithm RSA -out $HOME/ssl/ca/certificate.key -pkeyopt rsa_keygen_bits:4096Затем создайте корневой сертификат:
openssl req -x509 -new -key $HOME/ssl/ca/certificate.key \-subj "/C=RU/ST=Moscow/O=Kaspersky/CN=*" \-addext "basicConstraints=critical,CA:TRUE" \-addext "keyUsage=critical,keyCertSign" \-days 3650 -out $HOME/ssl/ca/certificate.pem - Создайте сертификаты компонентов инсталляции:
- MongoDB
Создайте закрытый ключ:
openssl genpkey -algorithm RSA -out $HOME/ssl/mongo/cert.key -pkeyopt rsa_keygen_bits:4096Создайте сертификат:
openssl req -x509 -new -key $HOME/ssl/mongo/cert.key \-subj "/C=RU/ST=Moscow/L=Moscow/O=LK/OU=LK/CN=mongo" \-addext "subjectAltName=DNS:mongo,IP:127.0.0.1,IP:$NODE_1,IP:$NODE_2,IP:$NODE_3,IP:$NODES_VIP" \-CA $HOME/ssl/ca/certificate.pem \-CAkey $HOME/ssl/ca/certificate.key \-out $HOME/ssl/mongo/cert.pem \-days 365Объедините созданный ключ и сертификат в один файл:
cat $HOME/ssl/mongo/cert.key $HOME/ssl/mongo/cert.pem > $HOME/ssl/mongo/combined.pem - Redis
Создайте закрытый ключ:
openssl genpkey -algorithm RSA -out $HOME/ssl/redis/cert.key -pkeyopt rsa_keygen_bits:4096Создайте сертификат:
openssl req -x509 -new -key $HOME/ssl/redis/cert.key \-subj "/C=RU/ST=Moscow/L=Moscow/O=LK/OU=LK/CN=redis" \-addext "subjectAltName=DNS:redis,IP:127.0.0.1,IP:$NODE_1,IP:$NODE_2,IP:$NODE_3,IP:$NODES_VIP" \-CA $HOME/ssl/ca/certificate.pem \-CAkey $HOME/ssl/ca/certificate.key \-out $HOME/ssl/redis/cert.pem \-days 365Сконвертируйте ключ:
openssl pkcs8 -topk8 -in $HOME/ssl/redis/cert.key -out $HOME/ssl/redis/key.pem -nocrypt - Redis Sentinel
Создайте закрытый ключ:
openssl genpkey -algorithm RSA -out $HOME/ssl/redis-sentinel/cert.key -pkeyopt rsa_keygen_bits:4096Создайте сертификат:
openssl req -x509 -new -key $HOME/ssl/redis-sentinel/cert.key \-subj "/C=RU/ST=Moscow/L=Moscow/O=LK/OU=LK/CN=redis-sentinel" \-addext "subjectAltName=DNS:redis-sentinel,IP:127.0.0.1,IP:$NODE_1,IP:$NODE_2,IP:$NODE_3,IP:$NODES_VIP" \-CA $HOME/ssl/ca/certificate.pem \-CAkey $HOME/ssl/ca/certificate.key \-out $HOME/ssl/redis-sentinel/cert.pem \-days 365Сконвертируйте ключ:
openssl pkcs8 -topk8 -in $HOME/ssl/redis-sentinel/cert.key -out $HOME/ssl/redis-sentinel/key.pem -nocrypt - Бэкенд-сервис оркестратора
Создайте закрытый ключ:
openssl genpkey -algorithm RSA -out $HOME/ssl/orc/cert.key -pkeyopt rsa_keygen_bits:4096Сконвертируйте ключ:
openssl pkcs8 -topk8 -in $HOME/ssl/orc/cert.key -out $HOME/ssl/orc/key.pem -nocryptСоздайте сертификат:
openssl req -x509 -new -key $HOME/ssl/orc/cert.key \-subj "/C=RU/ST=Moscow/L=Moscow/O=LK/OU=LK/CN=orc" \-addext "subjectAltName=DNS:orc,IP:127.0.0.1,IP:$NODE_1,IP:$NODE_2,IP:$NODE_3,IP:$NODES_VIP" \-CA $HOME/ssl/ca/certificate.pem \-CAkey $HOME/ssl/ca/certificate.key \-out $HOME/ssl/orc/cert.pem \-days 365Создайте хранилище ключей (PKCS12 KeyStore):
openssl pkcs12 -export \-in $HOME/ssl/orc/cert.pem \-inkey $HOME/ssl/orc/cert.key \-certfile $HOME/ssl/ca/certificate.pem \-out $HOME/ssl/orc/keyStore.p12 \-name "orc" \-passout env:ORC_KEY_PASS && \chmod 644 $HOME/ssl/orc/keyStore.p12Добавьте в хранилище CA-сертификат:
keytool -importcert -alias ca \-file $HOME/ssl/ca/certificate.pem \-keystore $HOME/ssl/orc/keyStore.p12 \-storetype PKCS12 \-storepass $ORC_KEY_PASS \-trustcacerts -nopromptСоздайте хранилище доверенных сертификатов (PKCS12 TrustStore):
openssl pkcs12 -export \-name "orc" \-inkey $HOME/ssl/orc/cert.key \-in $HOME/ssl/orc/cert.pem \-certfile $HOME/ssl/ca/certificate.pem \-out $HOME/ssl/orc/trustStore.p12 \-passout env:ORC_KEY_PASS && \chmod 644 $HOME/ssl/orc/trustStore.p12Добавьте в хранилище CA-сертификат:
keytool -importcert -alias ca \-file $HOME/ssl/ca/certificate.pem \-keystore $HOME/ssl/orc/trustStore.p12 \-storetype PKCS12 \-storepass $ORC_KEY_PASS \-trustcacerts -nopromptРаспространите сертификаты на узлы:
Выполните на узле Node_1:
scp -r ssl $NODE_2:/tmpscp -r ssl $NODE_3:/tmpВыполните на узлах Node_2 и Node_3:
cp -r /tmp/ssl $HOME
- MongoDB
- Создайте структуру каталогов для хранения сертификатов компонентов установки на узле Node_1:
- Создайте сеть Docker на всех узлах:
docker network create \--driver=bridge \--subnet=10.11.11.0/24 \--gateway=10.11.11.1 \--opt com.docker.network.bridge.name=knaas_aio_int \knaas_aio_int - Установите и настройте компоненты:
- MongoDB
Для использования MongoDB необходимо включить у CPU расширение системы команд AVX. Для этого при развертывании ВМ задайте режим CPU
host-passthrough, если для развертывания вы используете KVM.- Запустите контейнеры:
Создайте Docker volume на всех узлах:
docker volume create --name orc_dbs_dataСоздайте и запустите контейнер на узле Node_1:
docker run -d --name=mongo-1 \--hostname=mongo-1 \--volume orc_dbs_data:/data/db \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/cert.pem:ro \--volume $HOME/ssl/mongo/combined.pem:/ssl/certs/mongo/combined.pem:ro \--volume /data/configdb \--env=TZ=Europe/Moscow \--network=knaas_aio_int \-p 27017:27017 \--restart=unless-stopped \--runtime=runc \mongo:5.0.7 \mongod --bind_ip_all --replSet knaas --tlsMode requireTLS --tlsCertificateKeyFile /ssl/certs/mongo/combined.pem --tlsCAFile /ssl/certs/ca/cert.pem --tlsDisabledProtocols TLS1_0,TLS1_1Создайте и запустите контейнер на узле Node_2:
docker run -d --name=mongo-2 \--hostname=mongo-2 \--volume orc_dbs_data:/data/db \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/cert.pem:ro \--volume $HOME/ssl/mongo/combined.pem:/ssl/certs/mongo/combined.pem:ro \--volume /data/configdb \--env=TZ=Europe/Moscow \--network=knaas_aio_int \-p 27017:27017 \--restart=unless-stopped \--runtime=runc \mongo:5.0.7 \mongod --bind_ip_all --replSet knaas --tlsMode requireTLS --tlsCertificateKeyFile /ssl/certs/mongo/combined.pem --tlsCAFile /ssl/certs/ca/cert.pem --tlsDisabledProtocols TLS1_0,TLS1_1Создайте и запустите контейнер на узле Node_3:
docker run -d --name=mongo-3 \--hostname=mongo-3 \--volume orc_dbs_data:/data/db \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/cert.pem:ro \--volume $HOME/ssl/mongo/combined.pem:/ssl/certs/mongo/combined.pem:ro \--volume /data/configdb \--env=TZ=Europe/Moscow \--network=knaas_aio_int \-p 27017:27017 \--restart=unless-stopped \--runtime=runc \mongo:5.0.7 \mongod --bind_ip_all --replSet knaas --tlsMode requireTLS --tlsCertificateKeyFile /ssl/certs/mongo/combined.pem --tlsCAFile /ssl/certs/ca/cert.pem --tlsDisabledProtocols TLS1_0,TLS1_1 - Настройте набор репликации (replica set):
Инициируйте replica set на узле Node_1:
docker exec -i mongo-1 mongosh --tls \--tlsCertificateKeyFile /ssl/certs/mongo/combined.pem \--tlsCAFile /ssl/certs/ca/cert.pem <<EOFrs.initiate({_id: 'knaas',version: 1,members: [{_id: 0, host: '$NODE_1:27017', priority: 2},{_id: 1, host: '$NODE_2:27017', priority: 1},{_id: 2, host: '$NODE_3:27017', arbiterOnly: true}]})EOFНа узле Node_1 добавьте в БД пользователя admin:
docker exec -i mongo-1 mongosh --tls \--tlsCertificateKeyFile /ssl/certs/mongo/combined.pem \--tlsCAFile /ssl/certs/ca/cert.pem <<EOFdb.getSiblingDB("admin").createUser({user:"admin",pwd:"$MONGO_ADMIN_PASS",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})EOFНа узле Node_1 добавьте в БД пользователя knaas:
docker exec -i mongo-1 mongosh --tls \--tlsCertificateKeyFile /ssl/certs/mongo/combined.pem \--tlsCAFile /ssl/certs/ca/cert.pem <<EOFdb.getSiblingDB("admin").auth("admin","$MONGO_ADMIN_PASS");db.getSiblingDB("knaas").createUser({user:"knaas",pwd:"$MONGO_KNAAS_PASS",roles:["readWrite"]})EOF
- Запустите контейнеры:
- Redis
Для Ubuntu 22.04 используйте образ
redis:6.2.20вместоregistry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2.- Создайте том Docker volume на всех узлах:
docker volume create --name redis_data - Создайте и запустите контейнер на узле Node_1:
docker run -d \--name redis-master \-p 6379:6379 \-v redis_data:/data \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/ca.pem:ro \--volume $HOME/ssl/redis/cert.pem:/ssl/certs/redis/cert.pem:ro \--volume $HOME/ssl/redis/cert.key:/ssl/keys/redis/key.pem:ro \registry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2 \redis-server \--port 0 \--bind 0.0.0.0 \--protected-mode no \--tls-port 6379 \--tls-replication yes \--tls-cert-file /ssl/certs/redis/cert.pem \--tls-key-file /ssl/keys/redis/key.pem \--tls-ca-cert-file /ssl/certs/ca/ca.pem - Создайте и запустите контейнер на узле Node_2:
docker run -d \--name redis-replica \-p 6379:6379 \-v redis_data:/data \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/ca.pem:ro \--volume $HOME/ssl/redis/cert.pem:/ssl/certs/redis/cert.pem:ro \--volume $HOME/ssl/redis/cert.key:/ssl/keys/redis/key.pem:ro \registry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2 \redis-server \--port 0 \--bind 0.0.0.0 \--protected-mode no \--tls-port 6379 \--tls-replication yes \--tls-cert-file /ssl/certs/redis/cert.pem \--tls-key-file /ssl/keys/redis/key.pem \--tls-ca-cert-file /ssl/certs/ca/ca.pem \--replicaof $NODE_1 6379
- Создайте том Docker volume на всех узлах:
- Redis Sentinel
Для Ubuntu 22.04 используйте образ
redis:6.2.20вместоregistry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2.- Создайте том Docker volume на всех узлах:
docker volume create --name redis_sentinel_data - Создайте и запустите контейнер на узле Node_1:
docker run -d \--name redis-sentinel-1 \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/ca.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.pem:/ssl/certs/redis/cert.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.key:/ssl/keys/redis/key.pem:ro \-p 26379:26379 \registry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2 \sh -c "cat > /sentinel.conf <<EOFport 0bind 0.0.0.0protected-mode notls-port 26379tls-cert-file /ssl/certs/redis/cert.pemtls-key-file /ssl/keys/redis/key.pemtls-ca-cert-file /ssl/certs/ca/ca.pemtls-auth-clients optionaltls-replication yestls-cluster yessentinel monitor mymaster $NODE_1 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 60000sentinel parallel-syncs mymaster 1sentinel announce-ip $NODE_1sentinel announce-port 26379EOFredis-server /sentinel.conf --sentinel" - Создайте и запустите контейнер на узле Node_2:
docker run -d \--name redis-sentinel-2 \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/ca.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.pem:/ssl/certs/redis/cert.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.key:/ssl/keys/redis/key.pem:ro \-p 26379:26379 \registry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2 \sh -c "cat > /sentinel.conf <<EOFport 0bind 0.0.0.0protected-mode notls-port 26379tls-cert-file /ssl/certs/redis/cert.pemtls-key-file /ssl/keys/redis/key.pemtls-ca-cert-file /ssl/certs/ca/ca.pemtls-auth-clients optionaltls-replication yestls-cluster yessentinel monitor mymaster $NODE_1 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 60000sentinel parallel-syncs mymaster 1sentinel announce-ip $NODE_2sentinel announce-port 26379EOFredis-server /sentinel.conf --sentinel" - Создайте и запустите контейнер на узле Node_3:
docker run -d \--name redis-sentinel-3 \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/ca.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.pem:/ssl/certs/redis/cert.pem:ro \--volume $HOME/ssl/redis-sentinel/cert.key:/ssl/keys/redis/key.pem:ro \-p 26379:26379 \registry.astralinux.ru/library/astra/ubi18-redis7015:1.8.2 \sh -c "cat > /sentinel.conf <<EOFport 0bind 0.0.0.0protected-mode notls-port 26379tls-cert-file /ssl/certs/redis/cert.pemtls-key-file /ssl/keys/redis/key.pemtls-ca-cert-file /ssl/certs/ca/ca.pemtls-auth-clients optionaltls-replication yestls-cluster yessentinel monitor mymaster $NODE_1 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 60000sentinel parallel-syncs mymaster 1sentinel announce-ip $NODE_3sentinel announce-port 26379EOFredis-server /sentinel.conf --sentinel"
- Создайте том Docker volume на всех узлах:
- Веб-сервис оркестратора
- Перенесите образ контейнера оркестратора из комплекта поставки на узлы Node_1 и Node_2.
- Загрузите образ контейнера в Docker engine:
docker load -i "${ORC_CONTAINER_NAME//:/_}.tar" - Создайте том Docker volume на всех узлах:
docker volume create --name orc_data - Создайте и запустите контейнер на узле Node_1:
docker run -d --name=orc-1 \--hostname=orc-1 \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/cert.pem:ro \--volume $HOME/ssl/ca/certificate.key:/ssl/keys/ca/key.pem:ro \--volume $HOME/ssl/orc/trustStore.p12:/ssl/certs/orc/trustStore.p12:ro \--volume $HOME/ssl/orc/keyStore.p12:/ssl/certs/orc/keyStore.p12:ro \--volume $HOME/ssl/orc/cert.pem:/ssl/certs/orc/cert.pem:ro \--volume $HOME/ssl/orc/key.pem:/ssl/keys/orc/key.pem:ro \--volume orc_data:/data \-p 8080:8080 \--env=TZ=Europe/Moscow \--env=KNAAS_EULA_AGREED=yes \--env="JAVA_OPTS=-Xms2048m -Xmx3560m -Dspring.data.mongodb.database=knaas -Dorc.security.encryption.password=$ORC_ENC_PASS -Dspring.data.mongodb.uri=mongodb://knaas:$MONGO_KNAAS_PASS@$NODE_1:27017,$NODE_2:27017,$NODE_3:27017/knaas?replicaSet=knaas&tls=true -Dspring.redis.redisson.sentinel-servers-config.subscription-mode=master -Dspring.redis.redisson.sentinel-servers-config.master-name=mymaster -Dspring.redis.redisson.sentinel-servers-config.add-sentinel-address=rediss://$NODE_1:26379,rediss://$NODE_2:26379,rediss://$NODE_3:26379 -Dspring.redis.redisson.sentinel-servers-config.ssl-truststore=file:///ssl/certs/orc/trustStore.p12 -Dspring.redis.redisson.sentinel-servers-config.ssl-truststore-password=$ORC_KEY_PASS -Dspring.redis.redisson.sentinel-servers-config.ssl-keystore=file:///ssl/certs/orc/keyStore.p12 -Dspring.redis.redisson.sentinel-servers-config.ssl-keystore-password=$ORC_KEY_PASS -Dorc.openflow.tls.ca-private.certificate.path=/ssl/keys/ca/key.pem -Dorc.openflow.tls.ca-public.certificate.path=/ssl/certs/ca/cert.pem -Dgrpc.tls.certificate.path=/ssl/certs/orc/cert.pem -Dgrpc.tls.private.key.path=/ssl/keys/orc/key.pem -Dgrpc.tls.ca.certificate.path=/ssl/certs/ca/cert.pem -Dserver.ssl.enabled=true -Dserver.ssl.trust-store=/ssl/certs/orc/trustStore.p12 -Dserver.ssl.trust-store-password=$ORC_KEY_PASS -Dserver.ssl.trust-store-type=pkcs12 -Dserver.ssl.key-store=/ssl/certs/orc/keyStore.p12 -Dserver.ssl.key-store-password=$ORC_KEY_PASS -Dserver.ssl.key-store-type=pkcs12 -Dorc.sdn.grpc.timeout=60s" \--network=knaas_aio_int \--workdir=/opt/b4n/orc \--restart=unless-stopped \hub.brain4net.com/$ORC_CONTAINER_NAME - Создайте и запустите контейнер на узле Node_2:
docker run -d --name=orc-2 \--hostname=orc-2 \--volume $HOME/ssl/ca/certificate.pem:/ssl/certs/ca/cert.pem:ro \--volume $HOME/ssl/ca/certificate.key:/ssl/keys/ca/key.pem:ro \--volume $HOME/ssl/orc/trustStore.p12:/ssl/certs/orc/trustStore.p12:ro \--volume $HOME/ssl/orc/keyStore.p12:/ssl/certs/orc/keyStore.p12:ro \--volume $HOME/ssl/orc/cert.pem:/ssl/certs/orc/cert.pem:ro \--volume $HOME/ssl/orc/key.pem:/ssl/keys/orc/key.pem:ro \--volume orc_data:/data \-p 8080:8080 \--env=TZ=Europe/Moscow \--env=KNAAS_EULA_AGREED=yes \--env="JAVA_OPTS=-Xms2048m -Xmx3560m -Dspring.data.mongodb.database=knaas -Dorc.security.encryption.password=$ORC_ENC_PASS -Dspring.data.mongodb.uri=mongodb://knaas:$MONGO_KNAAS_PASS@$NODE_1:27017,$NODE_2:27017,$NODE_3:27017/knaas?replicaSet=knaas&tls=true -Dspring.redis.redisson.sentinel-servers-config.subscription-mode=master -Dspring.redis.redisson.sentinel-servers-config.master-name=mymaster -Dspring.redis.redisson.sentinel-servers-config.add-sentinel-address=rediss://$NODE_1:26379,rediss://$NODE_2:26379,rediss://$NODE_3:26379 -Dspring.redis.redisson.sentinel-servers-config.ssl-truststore=file:///ssl/certs/orc/trustStore.p12 -Dspring.redis.redisson.sentinel-servers-config.ssl-truststore-password=$ORC_KEY_PASS -Dspring.redis.redisson.sentinel-servers-config.ssl-keystore=file:///ssl/certs/orc/keyStore.p12 -Dspring.redis.redisson.sentinel-servers-config.ssl-keystore-password=$ORC_KEY_PASS -Dorc.openflow.tls.ca-private.certificate.path=/ssl/keys/ca/key.pem -Dorc.openflow.tls.ca-public.certificate.path=/ssl/certs/ca/cert.pem -Dgrpc.tls.certificate.path=/ssl/certs/orc/cert.pem -Dgrpc.tls.private.key.path=/ssl/keys/orc/key.pem -Dgrpc.tls.ca.certificate.path=/ssl/certs/ca/cert.pem -Dserver.ssl.enabled=true -Dserver.ssl.trust-store=/ssl/certs/orc/trustStore.p12 -Dserver.ssl.trust-store-password=$ORC_KEY_PASS -Dserver.ssl.trust-store-type=pkcs12 -Dserver.ssl.key-store=/ssl/certs/orc/keyStore.p12 -Dserver.ssl.key-store-password=$ORC_KEY_PASS -Dserver.ssl.key-store-type=pkcs12 -Dorc.sdn.grpc.timeout=60s" \--network=knaas_aio_int \--workdir=/opt/b4n/orc \--restart=unless-stopped \hub.brain4net.com/$ORC_CONTAINER_NAME
- MongoDB
- Проверьте работу оркестратора
После выполнения всех команд контейнеры должны быть запущены и не должны перезапускаться. Оркестратор отвечает по порту 8080 на заданном виртуальном IP. Вы можете убедиться, что оркестратор запущен и доступен по указанному виртуальному IP, выполнив простую проверку, при которой ответ будет пустым:
curl -k https://$NODES_VIP:8080Чтобы проверить прохождение аутентификации на оркестраторе, вы можете выполнить такой скрипт на python:
test_auth.py
import requestsimport sysfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)ip = sys.argv[1]sess = requests.Session()sess.verify = Falsetry:response=sess.get(f'https://{ip}:8080/api/core/users/current')response=sess.post((f'https://{ip}:8080/api/authentication'), data={'j_username': 'admin', 'j_password': 'admin'},headers={'X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})response=sess.get(f'https://{ip}:8080/api/core/users/current')print(response.status_code)print(response.content)except Exception as e:print(f"Error - {e}")Запустите скрипт, выполнив:
python3 test_auth.py $NODES_VIPПример успешного ответа:
200b'{"id":"9cb4bba3-6b82-472d-8347-4e217dac00cb","login":"admin","firstName":"Administrator","lastName":"Administrator","email":"admin@example.com","rbacPermission":{"id":"permission-0","name":"Full access"},"role":"ROLE_PLATFORM_ADMIN","requiredRequestConfirmation":false,"state":"ONLINE","currentTenants":[],"type":"LOCAL","groups":[],"enabled2fa":false,"initialized2fa":false}' - Смените стандартный пароль администратора
Для смены пароля администратора выполните скрипт change_password.py:
python3 change_password.py 192.168.200.100:8080Код скрипта change_password.py:
import requestsimport sysimport getpassimport jsonfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)ip = sys.argv[1]sess = requests.Session()sess.verify = Falseusername = input("Enter the orchestrator user login: ")password = getpass.getpass(f"Enter the current password for the user {username}: ")try:response=sess.get('https://'+ ip +'/api/core/users/current')response=sess.post(('https://'+ ip +'/api/authentication'), data={'j_username': username, 'j_password': password},headers={'X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})if response.status_code != 200:if response.status_code == 403 and response.json()[0]['code'] == "required_2fa_code":secFA_code = getpass.getpass(f"Enter the two-factor authentication code: ")response=sess.post(('https://'+ ip +'/api/authentication'), data={'j_username': username, 'j_password': password, 'code': secFA_code},headers={'X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})if response.status_code != 200:print(f"Authentication failed.")sys.exit(1)else:print(f"Authentication failed.")sys.exit(1)except Exception as e:print(f"Authentication failed. Error: {e}")sys.exit(1)sess.get('https://'+ ip +'/api/core/users/current')sess.headers.update({'Accept': 'application/json','content-type': 'application/json','X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})response.status_code = 400while response.status_code != 200:new_password = getpass.getpass(f"Enter a new password for the user {username}: ")new_password2 = getpass.getpass(f"Repeat the new password for the user {username}: ")if new_password != new_password2:print()print("The new password you entered does not match")print()else:payload = {"password": new_password}response=sess.post(('https://'+ ip +'/api/core/users/password/validate'), data=json.dumps(payload),headers={'X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})if response.status_code != 200:print()print("Weak password!")print()payload = {"password": new_password}try:response=sess.put(('https://'+ ip +'/api/core/users/current/password'), data=json.dumps(payload),headers={'X-CSRF-TOKEN': sess.cookies['CSRF-TOKEN']})if response.status_code != 200:print("Failed to change password!")elif response.status_code == 200:print()print("Password successfully changed!")print()except Exception as e:print("Failed to change password", e)