Package: ul-data-gateway-sdk
Data adapterВходной слой поступления данных от приборов или других источниковПримерный флоу данных от прибора такой:данные поступают от прибора в балансирощик данныхпопадают в сервис юдпсервис юдп отправляет пакет в очередь в виде сообщения, оформляя сообщение в нужную структуру, выдавая идентификатор конкретному запросуворкер разбора конкретного протокола разбирает пакетворкер рассылает в распределитель сообщение уже с распаршенными данными, если они валидны, так же отправляет его же в сбор метаданныхворкер метаданных сохраняет логи по конкретному приборуворкер распределителя отправляет сообщение в нужную интеграциюворкер интеграции конкретного провайдера читает из очереди и отправляет в нужный сервисСервисыСервис это библиотека, сервис это то что в рантайме всегдаdata_gateway__broker__amqpсервис брокера очередей сообщенийdata_gateway__device_smp__udp_serverсервис приложения, написанный на GO. слушает порт UDP и отправляет в очередь на разбор пакета. Технически ему не важен протокол. Ожидает сообщения из очереди с айди сообщения запроса. так же слушает очередь прибора для отправки к конкретному приборуdata_gateway__balancerБалансировщик нагрузки.ВСЕ ВНЕШНИЕ ПОРТЫ ДОЛЖНЫ ПРОБРАСЫВАТЬСЯ ЧЕРЕЗ НЕГОmon_*mon__metrics__aggregator,mon__metrics__dashboard,mon__process_explorer__server,mon__process_explorer__container,mon__log__aggregatorсервисы сбора аналитических данныхПеременные среды для деплояDD_API_KEY- api ключ datadogDH_PARAM- для шифрования в nginxSSH_ID_RSA- приватный ключ доступа на сервер для развертывания{CI_BRANCH}_DATABASE_ENDPOINT- эндпоинт для коннекта к базе данных. Содержит в себе юзернейм, пароль и название самой базы данных{CI_BRANCH}_APPLICATION_BROKER_ENDPOINT- эндпоинт для коннекта к броокеру сообщений (rabbitmq). Содержит в себе юзернейм и парольГлобальные зависимостиubuntu 20.04bashmakepython3.8.6pyenvpipenvdocker-compose1.27.4docker19.03.13Командыобновление репозитория до последнего состояния в веткеmakecleanupЭто обновит пакеты и почистит все необходимоеЗапуск локальноmakeupЗапустит все необходимые контейнерыТестовая нагрузка на сервисынагрузит воркер СМП одним тестовым сообщением. добавит его в очередьmakeworker_SMP_loadнагрузит воркер СМП одним реальным сообщением от прибора. добавит его в очередьmakeworker_SMP_load_real_raw_dataнагрузит воркер распределителя интеграцииmakeintegration_router_loadmakeload_UDP_SMP_getsetmakeDEV_load_UDP_SMP_getsetСистемные командыmakeupdate-ci-imagesРабота с GrafanaВ данный момент графана крутится на 4011 порту, т.е. дабы получить туда доступ, то небходимо, например, перейти по адресу 192.168.10.92:4011Рабочих дашборда 2 - Docker and system monitoring && RabbitMQ-OverviewDocker and system monitoringНа данном дашборде указаныф все метрики по серверу и контейнерам, кол-во свободного дискового пространства, ЦПУ. RAM, SWAP и т.д. как для сервера, так и для контейнера
Алерты приходяи при превышении пороговых значений по ЦПУ, RAM, Disc Space, а также если кол-во контейнеров падает ниже 14 (необходима ручная подстройка, если в какой-то момент добавятся ещё сервисы)RabbitMQ-OverviewДублирует админку RabbitMQ с точки зрения сбора показателейKAFKAЕсли речь идёт о наших сертификатах - всё описано в файле  kafka_ssl_startup.sh и kafka_generate_client_ssl.sh
Это создание сертификатов как серверных, так и клиентскихз с использованием нашего CA севрераСледующий блок посвящён генерации SSL ключей для kafka. Основным источником информации послужилитуториал одинитуториал дваА также личный опытДля генерации калючей, необходимыkeytoolиopensslПервым шагом - необходимо сгенерировать CA  ключ (приватный)opensslgenrsa-outroot.keyи самим же его подписатьopensslreq-new-x509-keyroot.key-outroot.crtи для безопасностиchmod600root.key
chmod644root.crtЗапомним эти два ключа, они нам ещё пригодятсяДля простоты использования и копирования, в дальнейшщих командах используется переменнаяDOMAIN, в которой лежит URL, на котором будет в будущем торчать KAFKAСоздаём хранилище сертификатов. Оно одно для всех брокеров Kafka. В нашем случае, там должен лежать только CA сертификатkeytool-keystorekafka.truststore.jks-aliasCARoot-import-fileroot.crtUse the fully-qualified domain name (FQDN)Создаём хранилище ключей для брокера, их может быть много, так что длоя каждого брокера оно должно быть своё
На вопросWhat is your first and last name?Отвечаем DNS именемkeytool-keystorekafka01.keystore.jks-alias$DOMAIN-validity365-genkey-keyalgRSA-extSAN=DNS:$DOMAINДостаём из хранилища сертификат брокера...keytool-keystorekafka01.keystore.jks-alias$DOMAIN-certreq-filekafka01.unsigned.crt...подписываем его нашим CA сертификатом...opensslx509-req-CAroot.crt-CAkeyroot.key-inkafka01.unsigned.crt-outkafka01.signed.crt-days365-CAcreateserial...и кладём сертификат брокера обратно в его хранилище, вместе с CA сертификатомkeytool-keystorekafka01.keystore.jks-aliasCARoot-import-fileroot.crt
keytool-keystorekafka01.keystore.jks-alias$DOMAIN-import-filekafka01.signed.crtВ сухом остатке, для корректной работы SSL, нам нобходимы только пароли, а также truestore & keystore(s)И генерация Ключей для клиента. Надеюсь, вы ещё не потеряли ваши CA ключи, они вам сейчас понадобятся
Начинаем генерацию клиентского интерфейса с генерации  RSA 2048 ключа в паре с сертификатом (Всё это добро сразу кладётся в хранилище)keytool-keystorekafka.keystore.jks-aliaslocalhost-genkeypair-keyalgrsaДостаём неподписаный ключ из хранилища и полдписываем его CA сертифифкатомkeytool-keystorekafka.keystore.jks-aliaslocalhost-certreq-filecert-req-file
opensslx509-req-CAroot.crt-CAkeyroot.key-incert-req-file-outcertificate.pem-days365-CAcreateserialДля авторизации по SSL вам, как клиенту, понадобится ещё и приватник, так что и его достаём из хранилищаkeytool-importkeystore-srckeystorekafka.keystore.jks-srcaliaslocalhost-destaliasnotebook-destkeystoreclient.p12-deststoretypePKCS12
opensslpkcs12-inclient.p12-nodes-nocerts-outca-keyИменование сервисов%prefix%__%pod_name%__%pod_service_name%%prefix%mon - мониторинг, вспомогательный сервисservice - приложение, которое работает автономно, обрабатывает запросы или работает в фонеmanager - приложение, которое запускается только ради команды, затем гаснет%pod_name%data_loggerintegrationintegration_*mtsdevice_*ncp_smpsmpwater5communication%pod_service_name%*_%semantic_name%_workerpushpullchrono*_%transport_protocol%_server*_%semantic_name%_dbstatecachecommon*_api*_web*_appbrokerРабота с KubernetesТ.к. удалённо все наши сервисы уже работают в кубере, надол уметь с ним работать. Минимально я вам уже рассказал про то, как оно изнутри
рабоатет и как писать конфиги, то сейчас  о полезных командахВыдаёт список подов/сервисов/секретов/деплойментов одного неймспейса:kubectlgetpods/svc/secrets/deploymentsВ любую команду, связанную с сервисами, деплойментами. подами или секретами можно докинуть ключ-Aили--all-namespacesдля получения списка подов со всех неймспейсов
или-n <namespace>--namespace=<namespace>для пролучения списка подов с конкретного неймспейса
Выдаёт список нейсмспейсовkubectlgetnamespacesВЫдаёт конфиг конкретного пода (перемнные проброшенные, контейнера и их порты)kubectldescribepod<pod_name>Меняет рабочий неймспейс на тот, что вы уукажитеkubectlconfigset-context--current--namespace=<namespace>Заходим внутрь подаkubectlexec-it<pod_name>--/bin/bashПолучение логов подаkubectllogs<pod_name>