| Абонент: | Клиент сотовой связи, по которому предполагается отслеживать сетевые события. Абонент может быть клиентом домашнего оператора или других операторов |
|---|---|
| Автоматизированная система: | система, реализующая информационную технологию выполнения установленных функций с помощью персонала и комплекса средств автоматизации |
| ООО: | Общество с ограниченной ответственностью |
| ПО: | программное обеспечение |
| CAMEL: | (Customized Application for Mobile Enhanced Logic) стандартизованный протокол для использования в мобильных интеллектуальных платформах |
| CAP: | (CAMEL Application Part) прикладной протокол CAMEL |
| CdPN: | (Called Party Number) номер вызываемого абонента |
| CgPN: | (Calling Party Number) номер вызывающего абонента |
| GMSC: | (Gateway Mobile Switching Center) шлюзовой центр коммутации подвижной службы сети GSM. Узел, принимающий входящий вызов и определяющий, на какой обслуживающий MSC (Serving MSC) отправлять вызов |
| GSM: | (Global System for Mobile Communications) глобальный стандарт цифровой мобильной сотовой связи с разделением каналов по времени и частоте |
| gRPC: | (Remote procedure calls) система удаленного вызова процедур |
| HLR: | (Home Location Register) домашний регистр местоположения |
| HAProxy: | серверное программное обеспечение для реализации высокой доступности и балансировки нагрузки для TCP и HTTP-приложений, посредством распределения входящих запросов на несколько обслуживающих серверов. См. https://www.haproxy.org/ |
| HTTP: | (HyperText Transfer Protocol) протокол передачи гипертекста |
| IMSI: | (International Mobile Subscriber Identity) международный идентификатор мобильного абонента (индивидуальный номер абонента) |
| IMEI: | (International Mobile Equipment Identity) международный идентификатор оборудования абонентской радиостанции |
| JSON: | (JavaScript Object Notation) текстовый формат обмена данными, основанный на JavaScript |
| MSC: | (Mobile switching center) центр коммутации |
| MT: | (Mobile Terminated) входящий вызов |
| MO: | (Mobile Originated) исходящий вызов |
| MSISDN: | (Mobile Station Integrated Services Digital Network) номер мобильной станции в формате E.164 |
| NAI: | (Nature of address indicator) индикатор типа адреса |
| OSS: | (Operations Support System) система поддержки операций |
| Protocol Buffers: | язык описания интерфейса для системы удаленного вызова процедур |
| SCCP: | (Signalling connection control part) часть управления сигнальными соединениями |
| SCP: | (Signaling control point) узел управления услугами |
| STP: | (Signaling transfer point) узел маршрутизации сигнальных сообщений |
| TCAP: | (Transaction capabilities application part) прикладная часть возможностей транзакций |
| TON: | (Type of number) тип номера |
| VLR: | (Visitors location register) визитный регистр местоположения |
Данный документ (далее — Руководство) является руководством по эксплуатации программного обеспечения (далее — ПО) «CPaaS» производства компании ООО «Интерконнект», Российская Федерация.
Руководство содержит описание назначения и основных принципов работы ПО «CPaaS», архитектуру системы, требования к инфраструктуре, а также описание процедур установки, настройки, запуска, мониторинга и устранения неисправностей.
Структура и способ изложения материала предполагают наличие у читателя рабочих знаний UNIX-подобных операционных систем, платформы контейнерной оркестрации Kubernetes, а также основ построения сетей связи общего пользования.
Все IP-адреса, идентификаторы и доменные имена приведены в качестве примеров и не имеют отношения к реальным абонентам или элементам сети.
ПО «CPaaS» представляет собой программную платформу для реализации подхода CPaaS (Communication Platform as a Service) - коммуникационной платформы как услуги. ПО «CPaaS» предназначено для использования на сетях операторов подвижной и фиксированной телефонной связи, а также на внутренних корпоративных сетях юридических лиц - от медицинских клиник и магазинов до холдингов, имеющих в распоряжении собственные выделенные сети LTE/5G.
ПО «CPaaS» применяется на сетях мобильной связи стандартов GSM, UMTS, LTE, имеющих множество географически распределенных узлов связи.
ПО «CPaaS» позволяет:
STT (Speech-to-Text) — распознавание и транскрибирование аудиофайлов;
Streaming ASR (Automatic Speech Recognition) — онлайн/потоковое распознавание фраз/слов для построения IVR-решений и интеллектуальных голосовых ассистентов;
TTS (Text-to-Speech) — генерация голосовых фраз из текста;
прочие сервисы, которые доступны у отдельных поставщиков, работающих в области искусственного интеллекта или машинного обучения (AI/ML).
Скрытие реальных номеров при общении клиентов компании (например, телефонные звонки по онлайн-объявлениям);
Построение решений по аутентификации/верификации абонентов: двухфакторная аутентификация - 2FA, одноразовые пароли - OTP и т.п.;
Low/No Code решения - визуальные конструкторы IVR и т.п.;
Виртуальные Ассистенты;
Контакт-центры.
Часть функций или услуг может предоставляться существующими программными системами или подразделениями на сети оператора связи или организации - ценность объединения перечисленного функционала в ПО «CPaaS» состоит в возможности его представления в рамках целостного и единообразного API.
Варианты схем построения услуг на базе ПО «CPaaS»
ПО «CPaaS» развертывается в кластере Kubernetes (за исключением компонентов sfas_aas, Kamailio и RtpEngine, разворачиваемых на отдельном хосте) и включает следующие основные программные компоненты:
apigw — API Gateway, точка входа для запросов бизнес-приложений заказчика по HTTPS (Voice API/SMS API); взаимодействует с базой данных DB CPAAS по SQL и с сервисами cpaas_billing и sengine по gRPC;
Kamailio / RtpEngine — SIP-сервер и медиарелей; принимает сигнальный (SIP/SIPS) и медийный (RTP/SRTP) трафик от сетей PSTN и оператора связи, взаимодействует с sipaas_nas по RADIUS, записывает данные в DB CPAAS по SQL и передает SIP/RTP трафик сервису sfas_aas;
sipaas_nas — компонент учета сетевого доступа (NAS) SIP-подсистемы; обменивается данными с apigw по HTTP, с Kamailio по RADIUS и с DB CPAAS по SQL;
sipaas_api — API-компонент SIP-подсистемы, обеспечивающий чтение и запись данных в DB CPAAS по SQL;
DB CPAAS (PostgreSQL, кластер
cpaas-app — основное клиентское приложение платформы (Erlang/OTP); взаимодействует с сервисом распознавания речи VOSK server по gRPC, с хранилищем S3 по HTTP и с сервисом radio-silence по HTTP;
cpaas_billing — модуль биллинга; взаимодействует с apigw по gRPC и с DB CPAAS по SQL;
sengine — сервисный движок обработки сценариев; взаимодействует с apigw по gRPC, с сервисом TTS и хранилищем S3 по HTTP, а также со сервисом sfas_aas по AMQP/gRPC;
TTS — сервис синтеза речи (Text-to-Speech), предоставляющий sengine аудиофайлы голосовых сообщений по HTTP;
VOSK server — сервер распознавания речи (STT), развертывается в нескольких экземплярах; используется компонентами cpaas-app (по gRPC) и sfas_aas (по протоколу IFA/gRPC);
radio-silence — сервис определения тишины в аудиопотоке, взаимодействует с cpaas-app по HTTP;
sfas_aas — сервис распознавания и обработки речи как услуги; взаимодействует с хранилищем S3 по HTTP, с брокером сообщений RabbitMQ по AMQP, с sengine по gRPC, с VOSK server по IFA/gRPC, с Kamailio/RtpEngine по SIP/RTP;
S3 — объектное хранилище, совместимое с S3, для хранения медиафайлов (голосовые приветствия, аудиозаписи разговоров, файлы сценариев);
RabbitMQ (кластер
Traefik — контроллер маршрутизации входящего трафика (Ingress);
MetalLB — балансировщик нагрузки для предоставления внешних IP-адресов сервисам;
CNPG Operator (CloudNativePG) — оператор Kubernetes для управления кластером PostgreSQL.
Взаимодействие с внешними системами (бизнес-приложения заказчика, сети PSTN и оператора связи) осуществляется по протоколам HTTPS, SIP(S)/(S)RTP и gRPC.
ПО «CPaaS» оперирует следующими конфиденциальными данными:
абонентские номера, информация о вызовах и сообщениях;
учётные данные для подключения к БД, брокеру сообщений и объектному хранилищу.
Меры обеспечения безопасности:
учётные данные и ключи доступа хранятся в Kubernetes Secrets и не передаются в открытом виде;
взаимодействие между компонентами ограничено рамками namespace
доступ к реестру образов контейнеров ограничен секретом
сетевая изоляция обеспечивается политиками Kubernetes (Kyverno / NetworkPolicy);
административные изменения конфигурации применяются только после перезапуска компонента.
Компонент apigw предоставляет внешний REST API платформы, через который реализуются Voice API, SMS API и управление вспомогательными ресурсами (SIP-транкинг, визуальные сценарии IVR, файлы сценариев и т.п.). API построен по модели ресурсов (аккаунт, вызов, сообщение, конференция и т.д.) и использует версионирование путей: устаревающая версия
Идентификатор аккаунта и токен доступа являются конфиденциальными данными и передаются получателю отдельным защищённым каналом, не публикуются в настоящем документе.
Ниже приведён перечень ресурсов и операций API, сгруппированных по функциональному назначению.
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | / | Получение списка учётных записей (основной и субаккаунтов) |
| POST | / | Создание субаккаунта |
| GET | / | Получение учётной записи |
| POST | / | Обновление учётной записи |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка вызовов (входящих и исходящих) |
| POST | …/ | Инициация исходящего вызова |
| GET | …/ | Получение вызова |
| POST | …/ | Обновление активного вызова: коллбэки, статус (canceled/ |
| DELETE | …/ | Удаление неактивного вызова (статус canceled/ |
| POST | …/ | Создание записи активного вызова |
| POST | …/ | Запуск транскрибирования вызова в реальном времени |
| POST | …/ | Остановка транскрибирования вызова в реальном времени |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка конференций аккаунта |
| GET | …/ | Получение конференции |
| POST | …/ | Завершение конференции (действие update) |
| DELETE | …/ | Удаление завершённой конференции |
| GET | …/ | Получение списка участников конференции |
| POST | …/ | Добавление участника в конференцию |
| GET | …/ | Получение участника конференции |
| POST | …/ | Обновление участника активной конференции |
| DELETE | …/ | Удаление участника из конференции |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка сообщений |
| POST | …/ | Отправка сообщения |
| GET | …/ | Получение сообщения |
| DELETE | …/ | Удаление сообщения |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка записей аккаунта |
| GET | …/ | Получение метаданных записи |
| GET | …/ | Получение медиафайла записи в формате WAV |
| GET | …/ | Получение медиафайла записи в формате MP3 |
| DELETE | …/ | Удаление метаданных записи и связанных медиафайлов |
| GET | …/ | Получение транскрипций указанной записи |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение транскрипций аккаунта |
| GET | …/ | Получение транскрипции |
| DELETE | …/ | Удаление транскрипции |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка стран, для которых доступны номера |
| GET | …/ | Получение информации по стране |
| GET | …/ | Поиск доступных для подключения мобильных номеров по стране |
| GET | …/ | Получение списка подключённых номеров |
| POST | …/ | Подключение нового номера |
| GET | …/ | Получение подключённого номера |
| POST | …/ | Обновление настроек номера (в т.ч. Voice Callback) |
| DELETE | …/ | Отключение номера |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка SIP-доменов |
| POST | …/ | Создание SIP-домена |
| GET | …/ | Получение SIP-домена |
| POST | …/ | Обновление SIP-домена |
| GET | …/ | Получение списка списков учётных данных SIP |
| POST | …/ | Создание списка учётных данных SIP |
| GET | …/ | Получение списка учётных данных SIP |
| POST | …/ | Обновление списка учётных данных SIP |
| DELETE | …/ | Удаление списка учётных данных SIP |
| GET | …/ | Получение учётных данных в списке |
| POST | …/ | Добавление учётных данных в список |
| GET | …/ | Получение учётных данных SIP |
| POST | …/ | Обновление учётных данных SIP |
| DELETE | …/ | Удаление учётных данных SIP |
| GET | …/ | Получение привязок списков учётных данных к домену |
| POST | …/ | Привязка списка учётных данных к домену |
| GET | …/ | Получение привязки списка учётных данных |
| DELETE | …/ | Удаление привязки списка учётных данных |
| GET | …/ | Получение списка контроля доступа по IP (ACL) |
| POST | …/ | Создание списка контроля доступа по IP |
| GET | …/ | Получение списка контроля доступа по IP |
| POST | …/ | Обновление списка контроля доступа по IP |
| DELETE | …/ | Удаление списка контроля доступа по IP |
| GET | …/ | Получение IP-адресов в списке ACL |
| POST | …/ | Добавление IP-адреса в список ACL |
| GET | …/ | Получение IP-адреса из списка ACL |
| POST | …/ | Обновление IP-адреса в списке ACL |
| DELETE | …/ | Удаление IP-адреса из списка ACL |
| GET | …/ | Получение привязок ACL по IP к домену |
| POST | …/ | Привязка списка ACL по IP к домену |
| GET | …/ | Получение привязки ACL по IP |
| DELETE | …/ | Удаление привязки ACL по IP |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение списка API-ключей |
| POST | …/ | Создание нового именованного API-ключа |
| GET | …/ | Получение API-ключа |
| POST | …/ | Обновление API-ключа |
| DELETE | …/ | Удаление API-ключа |
Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | …/ | Получение записей об использовании услуг |
| GET | …/ | Получение списка триггеров по использованию |
| POST | …/ | Создание триггера по использованию |
| GET | …/ | Получение триггера по использованию |
| POST | …/ | Обновление триггера по использованию |
| DELETE | …/ | Удаление триггера по использованию |
Ресурсы для подключения собственного оператора связи (Bring Your Own Carrier). Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | / | Получение списка BYOC-транков |
| POST | / | Создание BYOC-транка |
| GET | / | Получение BYOC-транка |
| POST | / | Обновление BYOC-транка |
| DELETE | / | Удаление BYOC-транка |
| GET | / | Получение списка политик подключения |
| POST | / | Создание политики подключения |
| GET | …/ | Получение политики подключения |
| POST | …/ | Обновление политики подключения |
| DELETE | …/ | Удаление политики подключения |
| GET | …/ | Получение целевых узлов политики подключения |
| POST | …/ | Добавление целевого узла в политику подключения |
| GET | …/ | Получение целевого узла политики подключения |
| POST | …/ | Обновление целевого узла политики подключения |
| DELETE | …/ | Удаление целевого узла политики подключения |
Ресурсы для хранения и версионирования файлов, используемых сценариями (аналог статического хостинга для IVR-сценариев). Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | / | Получение списка сервисов |
| POST | / | Создание сервиса |
| GET | / | Получение сервиса |
| POST | / | Обновление сервиса |
| DELETE | / | Удаление сервиса |
| GET | …/ | Получение списка файлов (Assets) сервиса |
| POST | …/ | Создание файла (Asset) |
| GET | …/ | Получение файла (Asset) |
| POST | …/ | Обновление файла (Asset) |
| DELETE | …/ | Удаление файла (Asset) |
| GET | …/ | Получение списка групп файлов (AssetGroups) |
| POST | …/ | Создание группы файлов |
| GET | …/ | Получение группы файлов |
| POST | …/ | Обновление группы файлов |
| DELETE | …/ | Удаление группы файлов |
| GET | …/ | Получение файлов, входящих в группу |
| POST | …/ | Добавление файла в группу |
| PATCH | …/ | Полная замена набора файлов в группе |
| GET | …/ | Получение файла из группы |
| POST | …/ | Обновление файла в группе |
Ресурсы конструктора визуальных сценариев (Low/No-Code IVR, упомянутого в разделе назначения комплекса) и их выполнения. Базовый путь:
| Метод | Путь | Описание |
|---|---|---|
| GET | / | Получение списка сценариев (Flow) |
| POST | / | Создание сценария |
| POST | / | Валидация сценария |
| GET | / | Получение сценария |
| POST | / | Обновление сценария |
| DELETE | / | Удаление сценария |
| GET | …/ | Получение списка версий (ревизий) сценария |
| GET | …/ | Получение конкретной версии сценария |
| GET | …/ | Получение тестовых пользователей сценария |
| POST | …/ | Обновление тестовых пользователей сценария |
| GET | …/ | Получение списка выполнений (Executions) сценария |
| POST | …/ | Запуск выполнения сценария |
| GET | …/ | Получение выполнения сценария |
| POST | …/ | Обновление выполнения сценария |
| DELETE | …/ | Удаление выполнения сценария |
| GET | …/ | Получение контекста выполнения сценария |
| GET | …/ | Получение шагов выполнения сценария |
| GET | …/ | Получение шага выполнения сценария |
| GET | …/ | Получение контекста шага выполнения сценария |
Аппаратные требования ПО «CPaaS» складываются из требований к узлам кластера Kubernetes, на котором развертывается основная часть компонентов платформы, и требований к отдельному хосту для компонентов sfas_aas, Kamailio и RtpEngine, разворачиваемых вне кластера Kubernetes.
Минимальная отказоустойчивая конфигурация кластера Kubernetes включает 3 ноды со следующими характеристиками каждая:
Таблица 1. Минимальные требования к узлу кластера Kubernetes
| Характеристика | Значение |
|---|---|
| Количество узлов (нод) | 3 |
| Количество ядер центрального процессора (на узел) | Не менее 2 |
| Тактовая частота центрального процессора | Не менее 2.00GHz |
| Объём оперативной памяти (на узел) | Не менее 4Gb |
| Операционная система | РЕД ОС и другие ОС семейства Linux |
При развертывании кластера в однонодовой конфигурации (без отказоустойчивости) суммарные требования к единственному узлу составляют не менее 6 vCPU и не менее 12Gb оперативной памяти — то есть сумма ресурсов трех нод минимальной конфигурации.
Компоненты sfas_aas, Kamailio и RtpEngine, отвечающие за прием и обработку SIP/RTP-трафика, разворачиваются на отдельном хосте вне кластера Kubernetes.
Таблица 2. Минимальные требования к хосту sfas / Kamailio / RtpEngine
| Характеристика | Значение |
|---|---|
| Количество ядер центрального процессора | Не менее 2 |
| Тактовая частота центрального процессора | Не менее 2.00GHz |
| Объём оперативной памяти | Не менее 4Gb |
| Операционная система | РЕД ОС и другие ОС семейства Linux |
Указанные конфигурации являются минимальными и могут быть увеличены в зависимости от ожидаемой нагрузки (количества единовременных вызовов, объема обрабатываемого голосового трафика и подключаемых сервисов AI/ML).
Тип развертывания — кластер Kubernetes для основной части компонентов; отдельный выделенный хост — для sfas_aas/Kamailio/RtpEngine. Поддерживается развертывание как на виртуальных машинах (VM), так и на физических серверах (Bare Metal).
К работе с ПО «CPaaS» должны допускаться только должностные лица, имеющие:
опыт работы с UNIX-подобными операционными системами;
практические навыки работы с Kubernetes и Helm;
знание основ администрирования PostgreSQL и RabbitMQ;
базовые знания протокола SIP и понимание принципов телефонии (сигнализация, установление и завершение вызова, передача медиатрафика по RTP/SRTP);
изучившие настоящее руководство по эксплуатации.
В состав установочного пакета входят:
Helm-чарты (или эквивалентные HelmChart-манифесты) для инфраструктурного уровня: Kyverno, cert-manager, MetalLB, Traefik, CNPG Operator (с плагином резервного копирования plugin-barman-cloud), CSI S3, операторы RabbitMQ (rabbitmq-cluster-operator, rabbitmq-messaging-topology-operator);
Helm-чарты прикладного уровня: cpaas-app (основное приложение), billing (биллинг), api-gw (API Gateway), sengine (сервисный движок сценариев), copula-webui (веб-консоль управления);
вспомогательные чарты инициализации базы данных: миграция схемы и наполнение справочных данных (тарифы и категории использования для биллинга);
образы контейнеров из корпоративного реестра образов;
Kubernetes-манифесты для конфигурации кластеров PostgreSQL, RabbitMQ (включая топологию — виртуальные хосты, пользователи, обменники, очереди, правила) и прочих вспомогательных ресурсов.
Компоненты sfas_aas, Kamailio и RtpEngine в состав установочного пакета Kubernetes не входят и устанавливаются отдельно, на выделенном хосте вне кластера (см. раздел «Требования к хосту компонентов sfas / Kamailio / RtpEngine»). Их сетевые адреса указываются в параметрах конфигурации чартов api-gw и sengine соответственно.
Для выполнения установки необходим доступ к корпоративному реестру образов и Helm-репозиторию (
Для выполнения установки войдите в систему с правами, достаточными для работы с кластером Kubernetes. Все дальнейшие действия выполняются в командной строке терминала.
Развертывание ПО «CPaaS» выполняется в кластере Kubernetes с использованием MetalLB в качестве балансировщика нагрузки. Установка выполняется последовательно в шесть шагов.
Создание namespace:
kubectl create namespace infrastructure kubectl create namespace cpaas
Добавить в оба namespace секрет для доступа к реестру образов контейнеров (
Политики Kyverno (опционально):
helm install kyverno kyverno \ --repo https://kyverno.github.io/kyverno/ \ --version 3 .8.1 -n infrastructure
После установки Kyverno применяется политика, автоматически добавляющая секрет доступа к registry во все поды, создаваемые Helm-чартами (файл
apiVersion : kyverno.io/v1kind : ClusterPolicymetadata :name : add-imagepullsecret-helm-jobsspec :rules :- name : add-imagepullsecret-helm-jobsmatch :any :- resources :kinds :- Pod namespaces :- infrastructure - cpaas selector :matchExpressions :- key : helmcharts.helm.cattle.io/chartoperator : Existsmutate :patchStrategicMerge :spec :imagePullSecrets :- name : sifox-imagepull-secretkubectl apply -f kyverno-policy.yaml
Cert-manager (опционально):
helm install cert-manager cert-manager \ --repo <REPO_AUTH>/helm/cert-manager-chart/ \ --version v1.20.2 -n infrastructure \ --set installCRDs = true \ --set imagePullSecrets [ 0 ] .name= sifox-imagepull-secret
Файл
imagePullSecrets :- name : sifox-imagepull-secretcontroller :image :repository : registrytag : v0.15.3speaker :image :repository : registrytag : v0.15.3frr :enabled : false
Установка MetalLB:
helm install metallb metallb \ --repo <REPO_AUTH>/helm/metallb-chart/ \ --version v0.15.3 -n infrastructure \ -f metallb-values.yaml
Настройка пула IP-адресов выполняется на следующем шаге (см. «Шаг 2. Настройка сетевой инфраструктуры»).
Установка CRD и контроллера Traefik:
helm install traefik <REPO_AUTH>/helm/traefik/traefik-39.0.9.tgz -n infrastructure
Оператор CloudNativePG управляет жизненным циклом кластеров PostgreSQL в Kubernetes.
Файл
imagePullSecrets :- name : sifox-imagepull-secretimage :repository : <REGISTRY>/cpaas/demo/repo-docker/cloudnative-pgtag :"1.29.0" tolerations :- key :"node-role.kubernetes.io/control-plane" operator :"Exists" effect :"NoSchedule"
Установка:
helm install cnpg-operator cloudnative-pg \ --repo <REPO_AUTH>/helm/cloudnative-pg-chart/ \ --version 0 .28.0 -n infrastructure\ -f cnpg-operator-values.yaml
Дополнительно устанавливается плагин
helm install plugin-barman-cloud plugin-barman-cloud \ --repo <REPO_AUTH>/helm/plugin-barman-cloud-chart/ \ --version 0 .6.0 -n infrastructure
CSI S3 (опционально) — подключение объектного хранилища как тома:
helm install csi-s3 csi-s3 \ --repo <REPO_AUTH>/helm/k8s-csi-s3-chart/ \ --version 0 .43.7 -n infrastructure\ --set imagePullSecret = sifox-imagepull-secret
Для работы кластера RabbitMQ в Kubernetes требуется установка двух операторов: rabbitmq-cluster-operator (управление кластерами RabbitMQ) и rabbitmq-messaging-topology-operator (управление топологией — виртуальными хостами, пользователями, обменниками, очередями и правилами через Kubernetes-манифесты).
helm install rabbitmq-cluster-operator rabbitmq-cluster-operator \ --repo <REPO_AUTH>/helm/rabbitmq-cluster-operator-chart/ -n infrastructure helm install rabbitmq-messaging-topology-operator rabbitmq-messaging-topology-operator \ --repo <REPO_AUTH>/helm/rabbitmq-messaging-topology-operator-chart/ -n infrastructure
После установки MetalLB необходимо добавить пул внешних IP-адресов (свободные адреса из подсети инфраструктуры). Файл
apiVersion : metallb.io/v1beta1kind : IPAddressPoolmetadata :name : cpaas-poolnamespace : infrastructurespec :addresses :- <SUBNET_CIDR> --- apiVersion : metallb.io/v1beta1kind : L2Advertisementmetadata :name : cpaas-l2namespace : infrastructurespec :ipAddressPools :- cpaas-pool
Применение:
kubectl apply -f metallb-ippool.yaml
Выделенный из пула адрес в дальнейшем указывается в аннотациях MetalLB (
Для маршрутизации трафика приложений CPaaS отдельно от инфраструктурных сервисов создаётся выделенный класс Ingress Traefik, ограниченный namespace
service :annotations :<metallb annotations> ingressClass :isDefaultClass : falsename :"cpaas" providers :kubernetesCRD :ingressClass :"cpaas" namespaces : ["cpaas" ]kubernetesIngress :ingressClass :"cpaas" namespaces : ["cpaas" ]publishedService :enabled : true
Установка:
helm install traefik-cpaas <REPO_AUTH>/helm/traefik/traefik-39.0.9.tgz -n cpaas \ -f traefik-cpaas-values.yaml
Файл
apiVersion : v1kind : Secretmetadata :name : cpaas-rdbms-superusernamespace : cpaastype : kubernetes.io/basic-authstringData :username : postgrespassword : <PG_SUPERUSER_PASSWORD>--- apiVersion : v1kind : Secretmetadata :name : cpaas-rdbms-appnamespace : cpaastype : kubernetes.io/basic-authstringData :username : cpaaspassword : <PG_APP_PASSWORD>
Применение:
kubectl apply -f pg-secrets.yaml
Имя кластера —
Файл
apiVersion : postgresql.cnpg.io/v1kind : Clustermetadata :name : cpaas-rdbmsnamespace : cpaasspec :instances : 2imageName : <REGISTRY>/cpaas/demo/repo-docker/pg_cloudnative_containers:16.2.0.3imagePullSecrets :- name : sifox-imagepull-secretbootstrap :initdb :database : cpaasowner : cpaasdataChecksums : trueencoding : UTF8secret :name : cpaas-rdbms-appenableSuperuserAccess : truesuperuserSecret :name : cpaas-rdbms-superusermanaged :roles :- name : cpaasensure : presentlogin : truesuperuser : truecreatedb : truecreaterole : truereplication : truepasswordSecret :name : cpaas-rdbms-apppostgresql :shared_preload_libraries :- periods - pg_partman_bgw parameters :max_connections :"100" shared_buffers :"1024MB" effective_cache_size :"4096MB" maintenance_work_mem :"128MB" timezone :"UTC" pg_partman_bgw.dbname :"cpaas" pg_partman_bgw.interval :"3600" storage :size : 20GistorageClass : fast.ru-1caffinity :enablePodAntiAffinity : truenodeSelector :sifox.com/storage :"yes"
Применение и ожидание состояния
kubectl apply -f pg-cluster.yaml kubectl -n cpaas get cluster cpaas-rdbms -w
Внутри кластера приложения подключаются к PostgreSQL по адресу
При необходимости внешнего доступа к PostgreSQL создаются сервисы типа
apiVersion : v1kind : Servicemetadata :name : cpaas-rdbms-lb-rwnamespace : cpaasannotations :metallb.universe.tf/allow-shared-ip :"<LB_VIP>" metallb.universe.tf/loadBalancerIPs :"<LB_VIP>" spec :type : LoadBalancerports :- name : postgresport : 5432protocol : TCPtargetPort : 5432selector :cnpg.io/cluster : cpaas-rdbmsrole : primary--- apiVersion : v1kind : Servicemetadata :name : cpaas-rdbms-lb-ronamespace : cpaasannotations :metallb.universe.tf/allow-shared-ip :"<LB_VIP>" metallb.universe.tf/loadBalancerIPs :"<LB_VIP>" spec :type : LoadBalancerports :- name : postgresport : 5433protocol : TCPtargetPort : 5432selector :cnpg.io/cluster : cpaas-rdbmsrole : replica--- apiVersion : v1kind : Servicemetadata :name : cpaas-rdbms-lb-rnamespace : cpaasannotations :metallb.universe.tf/allow-shared-ip :"<LB_VIP>" metallb.universe.tf/loadBalancerIPs :"<LB_VIP>" spec :type : LoadBalancerports :- name : postgresport : 5434protocol : TCPtargetPort : 5432selector :cnpg.io/cluster : cpaas-rdbmscnpg.io/podRole : instance
Применение и проверка:
kubectl apply -f cnpg-svc.yaml kubectl get svc -n cpaas
Имя —
Файл
apiVersion : rabbitmq.com/v1beta1kind : RabbitmqClustermetadata :name : cpaas-rmqnamespace : cpaasspec :replicas : 1resources :requests :cpu : 100mmemory : 300Mirabbitmq :additionalPlugins :- rabbitmq_management - rabbitmq_consistent_hash_exchange additionalConfig : |management.path_prefix = /cpaas-rmq service :type : LoadBalancerannotations :<metallb annotations> affinity :nodeAffinity :requiredDuringSchedulingIgnoredDuringExecution :nodeSelectorTerms :- matchExpressions :- key : sifox.com/storageoperator : Invalues : ["yes" ]
Применение:
kubectl apply -f rmq-cluster.yaml kubectl -n cpaas get rabbitmqcluster cpaas-rmq -w
Для управления кластером через веб-интерфейс RabbitMQ Management настраивается Ingress по пути
apiVersion : policy/v1kind : PodDisruptionBudgetmetadata :name : cpaas-rmqnamespace : cpaasspec :maxUnavailable : 1selector :matchLabels :app.kubernetes.io/name : cpaas-rmq--- apiVersion : networking.k8s.io/v1kind : Ingressmetadata :name : cpaas-rmqnamespace : cpaasspec :ingressClassName : cpaasrules :- http :paths :- path : /cpaas-rmqpathType : Prefixbackend :service :name : cpaas-rmqport :number : 15672kubectl apply -f rmq-ingress.yaml
Применение топологии (виртуальные хосты, обменники, очереди):
kubectl apply -f rmq-topology.yaml
После успешного развертывания ожидаемый результат команд проверки:
$ rabbitmqctl list_vhosts / cpaas $ rabbitmqctl list_users default_user_IkVHNimNqhpYPffh_v1 [administrator] cpaas [policymaker] $ rabbitmqctl list_permissions -p cpaas user configure write read default_user_IkVHNimNqhpYPffh_v1 .* .* .* cpaas .* .* .* $ rabbitmqctl list_exchanges -p cpaas name type durable auto_delete x-cpaas topic true false dlx-cpaas topic true false amq.topic topic true false amq.direct direct true false $ rabbitmqctl list_queues -p cpaas name type durable auto_delete messages q_call quorum true false 0 q_billing_se_back_notifications quorum true false 0 q_cdr_ext quorum true false 0 q_normalizer quorum true false 0 q_transcriber quorum true false 0 q_billing_filer quorum true false 0 q_filer quorum true false 0 q_billing_usage quorum true false 0 q_combiner quorum true false 0 q_trimmer quorum true false 0 q_convertor quorum true false 0 q_sengine quorum true false 0 q_logs quorum true false 0 q_billing_trigger quorum true false 0
Дополнительно применяется топология очередей интеграции с сервисом sfas_aas (
Файл
db :host : cpaas-rdbms-rw.cpaas.svc.cluster.localport : 5432name : cpaasuser : cpaaspasswordSecret :name : cpaas-rdbms-appkey : passwordmigrate :image : <REGISTRY>/common/debug-tools-k8s/debug-k8s-s3:latestcommand : upversion :"" archive :url :"<REPO_AUTH>/cpaas/cpaasdb/db_migrate/ansible-role-db-cpaas.v0.3.14.tar.gz" authSecret :"" imagePullSecret : sifox-imagepull-secret
Установка (запускает job миграции):
helm upgrade --install cpaas-db-migrate <HELM_OCI>/cpaas/helm/cpaas-db-migrate \ --version 0 .0.1 -n cpaas\ -f db-migrate-values.yaml
После выполнения job необходимо убедиться, что миграции применены без ошибок:
kubectl exec -it -n cpaas cpaas-rdbms-1 -- psql -c"\c cpaas" -c"SELECT * FROM schema_migrations;"
Отдельным вспомогательным чартом выполняется наполнение служебных справочников биллинга: создаётся тариф по умолчанию и базовые расценки по категориям использования (исходящие/входящие вызовы, конференц-связь, запись и хранение разговоров, транскрибация, распознавание речи, подключенные номера, сообщения). Данные задаются в виде идемпотентных SQL-запросов (
db :host : cpaas-rdbms-rw.cpaas.svc.cluster.localport : 5432name : cpaasuser : cpaaspasswordSecret :name : cpaas-rdbms-appkey : passwordqueries :- "INSERT INTO cpaas.tariffs AS t (id, friendly_name, price_unit) VALUES (1, 'default tariff', 'rub') ON CONFLICT (id) DO UPDATE SET friendly_name = EXCLUDED.friendly_name, price_unit = EXCLUDED.price_unit WHERE t.friendly_name != 'default tariff' OR t.price_unit != 'rub'" - "DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM cpaas.tariff_usage_prices WHERE tariff_id = 1 AND usage_category = '<USAGE_CATEGORY>') THEN INSERT INTO cpaas.tariff_usage_prices (tariff_id, usage_category, price_unit, price_per_unit, usage_unit, num_of_units) VALUES (1, '<USAGE_CATEGORY>', 'rub', <PRICE>, '<UNIT>', 1); ELSE UPDATE cpaas.tariff_usage_prices SET price_unit = 'rub', price_per_unit = <PRICE>, usage_unit = '<UNIT>', num_of_units = 1 WHERE tariff_id = 1 AND usage_category = '<USAGE_CATEGORY>'; END IF; END $$" imagePullSecret : sifox-imagepull-secret
Аналогичные запросы (с собственными значениями
helm upgrade --install cpaas-db-insert <HELM_OCI>/cpaas/helm/cpaas-db-insert \ --version 0 .0.1 -n cpaas\ -f values-db-insert.yaml
Прикладные компоненты устанавливаются в namespace
Файл
erlCookie : <ERL_COOKIE>replicaCount : 1image :repository : <REGISTRY>tag :"0.5.4" imagePullSecrets :- name : sifox-imagepull-secretdebug :mq :'false' rs :'false' stt :'false' s3 :'false' tppapi :'false' Vosk :sttCheck :'false' channel1Host :"asr-stt" channel1Port : 5001channel1EndpointsNum : 2channel2Host :"asr-stt" channel2Port : 5001channel2EndpointsNum : 2TppApi :check :'false' rmq :username : cpaaspassword : <RMQ_PASSWORD>vhost : cpaasexchange : x-cpaashaVip : cpaas-rmqhaAmqpPort : 5672s3 :endpoint :"<S3 ENDPOINT>" access_key : <S3_ACCESS_KEY>secret_key : <S3_SECRET_KEY>tmp_bucket : cpaas-app-tmpradioSilence :repository : <REGISTRY>tag :"1.6.2"
Установка:
helm install cpaas-app <HELM_OCI>/cpaas/helm/cpaas-app \ --version 0 .0.8 -n cpaas\ -f cpaas-app-values.yaml
Файл
replicaCount : 1image :repository : <REGISTRY>tag :"v0.0.34" imagePullSecrets :- name : sifox-imagepull-secretresources :requests :memory :"28Mi" cpu :"50m" limits :memory :"256Mi" cpu :"1000m" secrets :pgPassword : <PG_PASSWORD>rmqPassword : <RMQ_PASSWORD>Billing :domainId : 1domainName :"PROD" clusterId : 1defaultTariffId : 1pg :hostname : cpaas-rdbms-rwport : 5432database : cpaasusername : cpaasrmq :host : cpaas-rmqport : 5672user : cpaasvhost : cpaasexchange : x-cpaasgrpc :apigwHost : api-gwapigwPort : 8001
Установка:
helm install billing <HELM_OCI>/cpaas/helm/billing \ --version 0 .0.1 -n cpaas\ -f values-billing.yaml
Файл
image :repository : <REGISTRY>tag :"v0.14.2" imagePullSecrets :- name : sifox-imagepull-secretCpaasApiGw :s3AccessKey : <S3_ACCESS_KEY>grpcClients :sipaas :enabled : truehost :"<SIPAAS_HOST>" secrets :pgPassword : <PG_PASSWORD>s3SecretKey : <S3_SECRET_KEY>
Параметр
Установка:
helm install api-gw <HELM_OCI>/cpaas/helm/api-gw \ --version 0 .0.4 -n cpaas\ -f values-api-gw.yaml
Файл
replicaCount : 2image :repository : <REGISTRY>tag :"v0.9.14" imagePullSecrets :- name : sifox-imagepull-secretpersistence :storageClass : fast.ru-1csize :"1Gi" mountPath :"/mnesia" resources :requests :memory :"128Mi" cpu :"150m" limits :memory :"512Mi" cpu :"500m" secrets :s3AccessKeyId : <S3_ACCESS_KEY>s3SecretAccessKey : <S3_SECRET_KEY>rmqPassword : <RMQ_PASSWORD>Sengine :domainId : 1domainName :"PROD" clusterId : 1instanceId : 0sfas :channels :- name :"sfas_channel_1" ip :"<SFAS_HOST>" port : 8000s3 :endpoints :- "<S3 ENDPOINT>" mediaBucket : cacherecordBucket : recordsrmq :user : cpaasip : cpaas-rmqport : 5672vhost : cpaasexchange : x-cpaasgrpcClients :apigwChannel1 :host : api-gwport : 8001endpointsNum : 4apigwChannel2 :host : api-gwport : 8001endpointsNum : 4
Параметр
Установка:
helm install sengine <HELM_OCI>/cpaas/helm/sengine \ --version 0 .0.2 -n cpaas\ -f values-sengine.yaml
Файл
image :tag :"0.4.1" imagePullSecrets :- name : sifox-imagepull-secretservice :loadBalancerIP :"<LB_VIP>" annotations :<metallb annotations> secrets :appApiKey : <APP_API_KEY>dbUsername : cpaasdbPassword : <PG_PASSWORD>appConfig :springDatasourceUrl :"jdbc:postgresql://cpaas-rdbms-rw:5432/cpaas" apiGwBasePath :"http://<LB_VIP>:80" grpcClientApiGwAddress :"static://billing:8014" loggingLevelRoot :"INFO"
При установке веб-консоли выполняется вспомогательный init-контейнер, загружающий актуальную сборку статического веб-интерфейса (консоль и административная панель) из корпоративного репозитория артефактов и распаковывающий её в общий с основным контейнером том. Загрузка пропускается, если версия уже загруженной сборки совпадает с ожидаемой (файл
initContainers :- name : wget-modelsimage :"<REGISTRY>/cpaas/demo/repo-docker/alpine:3.19.1" command : ["sh" ,"-c" ]args :- | EXPECTED="<REPO_AUTH>/cpaas/web-ui/copula-console/copula-console-v0.3.16.tgz:/ workspace/static/console/:3" if [ -f /workspace/static/ver.txt ] && [ "$(cat /workspace/static/ver.txt)" = "$EXPECTED" ]; then echo "Static already up to date, skip"; exit 0; fi mkdir -p /workspace/static/console /workspace/static/console2 /workspace/static/adm wget -O /tmp/console.tgz "<REPO_AUTH>/cpaas/web-ui/copula-console/copula- console-v0.3.16.tgz" tar -xzf /tmp/console.tgz -C /workspace/static/console --strip-components=3 wget -O /tmp/console-admin.tgz "<REPO_AUTH>/cpaas/web-ui/copula-console-admin/copula-console-admin-v0.0.2.tgz" tar -xzf /tmp/console-admin.tgz -C /workspace/static/adm --strip-components=3 echo "$EXPECTED" > /workspace/static/ver.txt volumeMounts :- name : staticmountPath : /workspace/static/
Установка:
helm install copula-webui <HELM_OCI>/cpaas/helm/copula-webui \ --version 0 .0.3 -n cpaas\ -f values-copula-webui.yaml
После установки веб-консоль доступна по адресу, указанному в
Компоненты sfas_aas, Kamailio и RtpEngine, отвечающие за прием и обработку сигнального (SIP) и медийного (RTP) трафика, в состав Kubernetes-инсталляции не входят и устанавливаются отдельно, на выделенном хосте вне кластера. Аппаратные требования к такому хосту приведены в разделе «Требования к хосту компонентов sfas / Kamailio / RtpEngine».
Для установки должны быть выделены вычислительные мощности согласно аппаратным требованиям, указанным выше. Установка выполняется с использованием предоставляемого набора ansible-скриптов.
Перед установкой необходимо выполнить корректировку переменных и шаблонов ansible в соответствии с целевым окружением.
Установка FreeSWITCH и sfas_aas:
ansible-playbook --vault-password-file = .vault.pass -u <имя пользователя> -v -i hosts cpaas-not-k8s.yml
Аналогичным образом выполняется установка Kamailio, RtpEngine и дополнительных компонентов:
ansible-playbook --vault-password-file = .vault.pass -u <имя пользователя> -v -i hosts kamailio.yml
Интеграция внешнего хоста с компонентами, развернутыми в кластере, задаётся исключительно параметрами конфигурации соответствующих Helm-чартов:
Таблица 3. Параметры интеграции с компонентами вне кластера Kubernetes
| Внешний компонент | Чарт / | Назначение |
|---|---|---|
| Kamailio / | адрес узла, принимающего SIP/ | |
| sfas_aas | адрес и порт канала взаимодействия sengine с sfas_aas (обработка речи, аудио) | |
| sfas_aas | топология RabbitMQ: очереди | передача записей разговоров ( |
После изменения адреса внешнего хоста в файлах
Настоящий раздел описывает прикладную настройку ПО «CPaaS» после установки: создание аккаунта, подключение номеров и настройку SIP-транков для исходящих и входящих вызовов. Параметры развёртывания компонентов (Helm-чарты, Kubernetes-манифесты) описаны в разделе «Установка ПО «CPaaS»».
Настройка аккаунта выполняется напрямую через базу данных и API.
Идентификатор аккаунта (
SELECT * FROM cpaas.accounts;-[ RECORD 1 ]------+----------------------------------------------- sid | <ACCOUNT_SID> parent_account_sid | <ACCOUNT_SID> auth_token | <AUTH_TOKEN> date_created | <TIMESTAMP> date_updated | <TIMESTAMP> friendly_name | <ACCOUNT_NAME> status | active type | full is_main | t
Значение
Для работы с исходящими вызовами в справочники базы данных добавляется поддерживаемая страна и номер, с которым платформа регистрируется у оператора связи:
INSERT INTO cpaas.countries (code, country, available, description, system_start, system_end)VALUES ('RU' ,'Russian Federation' ,'t' ,' ' ,'<TIMESTAMP>' ,'infinity' );INSERT INTO cpaas.available_phone_numbers(friendly_name, phone_number, locality, sms_enabled, voice_enabled, available, type , country_code)VALUES ('<FRIENDLY_NAME>' ,'<PHONE_NUMBER>' ,'<CITY>' ,true ,true ,true ,'sim_card' ,'RU' );
Адрес обращения к API (
kubectl get ingress -n cpaas api-gw -o yaml apiVersion : networking.k8s.io/v1kind : Ingressmetadata :name : api-gwnamespace : cpaasspec :ingressClassName : cpaasrules :- http :paths :- path : /2010-04-01/AccountspathType : Prefixbackend :service :name : api-gwport :number : 4000- path : /v1pathType : Prefixbackend :service :name : api-gwport :number : 4000status :loadBalancer :ingress :- ip : <LB_VIP>
Подготовка окружения для работы с API:
export APIGW_ENDPOINT = "http://<LB_VIP>" export APIGW_AUTH = "<ACCOUNT_SID>:<AUTH_TOKEN>"
Проверка доступа (получение списка подключённых номеров):
curl -X GET " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/IncomingPhoneNumbers" \ -H 'accept: application/json' \ -u $APIGW_AUTH | jq'.'
curl -X POST " $APIGW_ENDPOINT /v1/ConnectionPolicies" \ -H 'accept: application/json' -H'Content-Type: application/json' \ -d '{ "AuthUsername": "<PHONE_NUMBER>@<CARRIER_SIP_DOMAIN>", "Domain": "<CARRIER_SIP_DOMAIN>", "FriendlyName": "<NAME>", "Password": "<CARRIER_SIP_PASSWORD>", "Realm": "<CARRIER_SIP_REALM>", "Register": true, "Username": "<PHONE_NUMBER>" }' \ -u $APIGW_AUTH | jq'.'
В ответе возвращается идентификатор политики подключения (
curl -X POST " $APIGW_ENDPOINT /v1/ConnectionPolicies/<CONNECTION_POLICY_SID>/Targets" \ -u " $APIGW_AUTH " -H"Accept: application/json" -H"Content-Type: application/json" \ -d '{"Target":"sip:<CARRIER_SIP_DOMAIN>:5060;transport=udp","FriendlyName":"<NAME>","E nabled":true}'
curl -X POST " $APIGW_ENDPOINT /v1/ByocTrunks? FriendlyName=<NAME>&ConnectionPolicySid=<CONNECTION_POLICY_SID>" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
curl -X POST " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/SIP/Domains? DomainName=<CARRIER_SIP_DOMAIN>&FriendlyName=<NAME>" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
SELECT * FROM cpaas.trunks;
curl -X POST " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/SIP/Domains? DomainName=<SBC_EXTERNAL_IP>&FriendlyName=<NAME>" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
curl -X POST " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/SIP/IpAccessControlLists? FriendlyName=<NAME>" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
curl -X POST " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/SIP/Domains/<DOMAIN_SID>/Auth/ Calls/IpAccessControlListMappings?IpAccessControlListSid=<ACL_SID>" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
curl -X POST " $APIGW_ENDPOINT /2010-04-01/Accounts/<ACCOUNT_SID>/SIP/IpAccessControlLists/ <ACL_SID>/IpAddresses? FriendlyName=<CARRIER_NAME>&IpAddress=<CARRIER_SIP_IP>&CidrPrefixLength=32" \ -H 'accept: application/json' -u$APIGW_AUTH | jq'.'
Запуск, перезапуск и остановка ПО «CPaaS» осуществляются стандартными средствами Kubernetes.
# 1. Снять PostgreSQL с гибернации kubectl annotate cluster cpaas-rdbms -n cpaas cnpg.io/hibernate- # 2. Дождаться готовности БД kubectl -n cpaas wait --for= condition = Ready cluster/cpaas-rdbms --timeout= 300s# 3. Запустить RabbitMQ kubectl scale rabbitmqcluster cpaas-rmq -n cpaas --replicas = 1 # 4. Дождаться готовности RabbitMQ kubectl -n cpaas wait --for= condition = Ready rabbitmqcluster/cpaas-rmq --timeout= 300s# 5. Запустить приложение kubectl scale deployment cpaas-app -n cpaas --replicas = 1
# Перезапустить приложение kubectl rollout restart deployment cpaas-app -n cpaas # Перезапустить RabbitMQ kubectl delete pod -l app.kubernetes.io/name = cpaas-rmq -n cpaas# Перезапустить PostgreSQL (с сохранением данных) kubectl -n cpaas cnpg restart cpaas-rdbms
# 1. Остановить приложение kubectl scale deployment cpaas-app -n cpaas --replicas = 0 # 2. Остановить RabbitMQ kubectl scale rabbitmqcluster cpaas-rmq -n cpaas --replicas = 0 # 3. Перевести PostgreSQL в гибернацию kubectl annotate cluster cpaas-rdbms -n cpaas --overwrite cnpg.io/hibernate = true
Обновление и удаление ПО «CPaaS» выполняются с помощью штатных механизмов Kubernetes и Helm.
Перед обновлением рекомендуется создать резервную копию базы данных и сохранить актуальные файлы конфигурации (
Обновление конфигурации без смены версии:
helm upgrade cpaas-app <HELM_OCI>/cpaas/helm/cpaas-app \ --version 0 .0.8 -n cpaas\ -f cpaas-app-values.yaml
Обновление до новой версии:
helm upgrade cpaas-app <HELM_OCI>/cpaas/helm/cpaas-app \ --version <NEW_VERSION> -n cpaas \ -f cpaas-app-values.yaml
Откат к предыдущей версии:
helm rollback cpaas-app -n cpaas
Удаление приложения:
helm uninstall cpaas-app -n cpaas
Удаление namespace
Удаление всего namespace CPaaS вместе с данными:
kubectl delete namespace cpaas
Удаление инфраструктурных компонентов:
helm uninstall metallb -n infrastructure helm uninstall traefik -n infrastructure helm uninstall cnpg-operator -n infrastructure kubectl delete namespace infrastructure
Проверка работоспособности ПО «CPaaS» осуществляется путём проверки текущего состояния всех компонентов.
Для выполнения проверки необходимо обладать правами на чтение ресурсов в namespace
Просмотр статуса всех подов и кластеров:
# Состояние подов платформы kubectl get pods -n cpaas # Состояние подов инфраструктуры kubectl get pods -n infrastructure # Статус кластеров PostgreSQL и RabbitMQ kubectl -n cpaas get cluster,rabbitmqcluster
Все поды должны находиться в состоянии
Проверка состояния PostgreSQL:
kubectl -n cpaas get cluster cpaas-rdbms -w
Проверка состояния RabbitMQ:
kubectl -n cpaas get rabbitmqcluster cpaas-rmq -w
Проверка доступности PostgreSQL изнутри пода:
kubectl -n cpaas exec -it <pod-name> --\ psql postgresql://cpaas:<PASSWORD>@cpaas-rdbms-rw.cpaas.svc.cluster.local:5432/cpaas \ -c "SELECT 1"
Проверка очередей RabbitMQ:
kubectl -n cpaas exec -it cpaas-rmq-server-0 --\ rabbitmqctl list_queues -p cpaas name messages
Журналы ПО «CPaaS» собираются стандартными средствами Kubernetes и доступны через
Уровни протоколирования основного приложения задаются в конфигурации. Доступны следующие уровни:
Таблица 4. Уровни логирования
| Уровень | Описание |
|---|---|
| Критические ошибки, влияющие на работоспособность | |
| Предупреждения, не блокирующие работу платформы | |
| Важные события штатной работы (подключения, старт) | |
| Информационные сообщения (уровень по умолчанию) | |
| Подробная отладочная информация |
По умолчанию ПО «CPaaS» протоколирует события с уровнем
ПО «CPaaS» использует JSON-формат для структурированного логирования:
{ "level" :"notice" ,"msg" :"RabbitMQ connection established" ,"time" :"2024-01-15T10:23:45.123456789Z" ,"component" :"cpaas-app" }
Команды для работы с журналами:
Просмотр журнала основного приложения (последние 100 строк):
kubectl - n cpaas logs- l app= cpaas- app-- tail= 100
Просмотр журнала в режиме реального времени:
kubectl - n cpaas logs- l app= cpaas- app- f
Просмотр только ошибок:
kubectl - n cpaas logs- l app= cpaas- app-- tail= 500 | grep'"level":"error"'
Просмотр журнала PostgreSQL:
kubectl - n cpaas logs cpaas- rdbms- 1 - c postgres-- tail= 100
Просмотр журнала RabbitMQ:
kubectl - n cpaas logs cpaas- rmq- server- 0 -- tail= 100
Если в журнале появляются записи об ошибках подключения к RabbitMQ или к сервису ASR, необходимо проверить доступность соответствующего сервиса и корректность его настроек в
ПО «CPaaS» предоставляет метрики для внешних систем мониторинга по протоколу HTTP в формате Prometheus. Адрес и порт экспортера задаются в конфигурации (по умолчанию
Основные метрики cpaas-app:
Таблица 5. Прикладные метрики CPaaS
| Метрика | Тип | Описание |
|---|---|---|
| counter | Общее количество обработанных вызовов | |
| gauge | Количество активных (текущих) вызовов | |
| counter | Количество сообщений, успешно отправленных в RabbitMQ | |
| counter | Количество необработанных (сброшенных) сообщений | |
| counter | Количество запросов к сервису распознавания речи | |
| counter | Количество ошибок сервиса распознавания речи |
Рекомендуемые метрики для дашборда:
Мониторинг инфраструктуры Kubernetes:
Помимо прикладных метрик рекомендуется настроить мониторинг через
При организации мониторинга следует учитывать тип метрик (
Для своевременного обнаружения проблем рекомендуется настроить оповещение на перечисленные ниже условия.
Симптом: команда
Диагностика:
kubectl describe pod <pod-name> -n cpaas kubectl get events -n cpaas --sort-by = '.lastTimestamp'
Возможные причины и решения:
Нет узлов с нужными метками — проверить
kubectl get nodes --show-labels | grep sifox.com/storage
Нехватка ресурсов — проверить доступные ресурсы на узлах:
kubectl describe nodes | grep -A 5 "Allocated resources"
PersistentVolumeClaim не создан — проверить статус PVC:
kubectl get pvc -n cpaas
Симптом:
Диагностика:
kubectl -n cpaas describe cluster cpaas-rdbms kubectl -n cpaas logs cpaas-rdbms-1 -c postgres --tail = 100
Возможные причины и решения:
Секреты не созданы — убедиться в наличии необходимых секретов:
kubectl get secrets -n cpaas | grep cpaas-rdbms
StorageClass недоступен — проверить наличие и доступность StorageClass:
kubectl get storageclass
Симптом: в журналах
Диагностика:
kubectl -n cpaas logs -l app = cpaas-app --tail= 100 | grep -i rmqkubectl -n cpaas get rabbitmqcluster cpaas-rmq
Возможные причины и решения:
RabbitMQ не запущен — проверить статус пода:
kubectl get pods -n cpaas | grep rmq
Неверные учётные данные — проверить параметры
Топология не применена — убедиться, что
kubectl get -n cpaas rabbitmqvhost,rabbitmquser,rabbitmqpermission
Симптом: метрика
Диагностика:
kubectl -n cpaas logs -l app = cpaas-app --tail= 200 | grep -i stt
Возможные причины и решения:
Сервис ASR недоступен — проверить доступность хоста и порта, указанных в
STT не используется — если функционал распознавания речи не требуется, убедиться, что в конфигурации задано
При возникновении неисправностей, не описанных в данном руководстве, или при обнаружении внутренних ошибок приложения необходимо инициировать обращение в проектную команду ООО «Интерконнект» в соответствии с согласованными процедурами технической поддержки, предоставив:
версию установленного ПО:
helm list -n cpaas
описание наблюдаемого поведения и условий воспроизведения;
журналы затронутых компонентов:
kubectl -n cpaas logs -l app = cpaas-app --tail= 500 > cpaas-app.logkubectl -n cpaas logs cpaas-rmq-server-0 --tail = 200 > rmq.logkubectl -n cpaas logs cpaas-rdbms-1 -c postgres --tail = 200 > pg.log
вывод событий кластера:
kubectl get events -n cpaas --sort-by = '.lastTimestamp'