Kubernetes ========== Раздел описывает развёртывание платформы Citeck в среде Kubernetes: управление ресурсами подов и контейнеров, настройку Helm chart, а также генерацию ключей шифрования. .. contents:: .. _k8s-resource-management: Менеджмент ресурсов подов и контейнеров ---------------------------------------- Ниже описаны минимальные требования к ресурсам MEM/CPU для стабильной работы микросервисов в сочетании с XMX/XMS параметрами java. На данной конфигурации было произведено нагрузочное тестирование в **1000** одновременно работающих пользователей, длительностью в **1** час. Состав сценария и распределение нагрузки: - логин в систему и просмотр главной страницы с загрузкой меню, дашборда, информации о пользователе (20%); - просмотр журнала контрактов (30%); - переход на страницу просмотра контракта с загрузкой всех виджетов: информация о контракте, действия, задачи, комментарии, связи, история версий и т.д. (30%); - просмотр журнала активных задач (30%); - создание документов (20%); - старт процессов по документам (10%); - выполнение задач по процессу (50%). В ходе нагрузки было сгенерировано **2 043 398 запросов**, из них 1 запроса (0.00 %) завершилось с ошибками или превысило лимит времени выполнения. |br| Среднее время отклика - **6.88 миллисекунд**. |br| Медиана - 6 миллисекунд. |br| **90%** всех запросов обрабатывались менее чем за **16 миллисекунд**. |br| **95%** всех запросов обрабатывались менее чем за **25 миллисекунд**. |br| **99%** всех запросов обрабатывались менее чем за **47 миллисекунд**. |br| Ecos Registry ~~~~~~~~~~~~~ .. code-block:: yaml EcosRegistryApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 300m memory: 1Gi Ecos Model ~~~~~~~~~~ .. code-block:: yaml EcosModelApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 2 memory: 1Gi requests: cpu: 2 memory: 1Gi Ecos Gateway ~~~~~~~~~~~~ .. code-block:: yaml EcosGatewayApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 2 memory: 1Gi requests: cpu: 2 memory: 1Gi Ecos Apps ~~~~~~~~~ .. code-block:: yaml EcosAppsApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Process ~~~~~~~~~~~~ .. code-block:: yaml EcosProcessApp: environments: javaOpts: "-Xmx2G -Xms2G" resources: | limits: cpu: 1 memory: 3548Mi requests: cpu: 1 memory: 3548Mi Ecos Uiserv ~~~~~~~~~~~ .. code-block:: yaml EcosUiservApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 1 memory: 1Gi Ecos History ~~~~~~~~~~~~ .. code-block:: yaml EcosHistoryApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Integrations ~~~~~~~~~~~~~~~~~ .. code-block:: yaml EcosIntegrationsApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Notifications ~~~~~~~~~~~~~~~~~~ .. code-block:: yaml EcosNotificationsApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Transformations ~~~~~~~~~~~~~~~~~~~~ .. code-block:: yaml EcosTransformationsApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Ecom ~~~~~~~~~ .. code-block:: yaml EcosEcomApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Service Desk ~~~~~~~~~~~~~~~~~ .. code-block:: yaml EcosServiceDeskApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Edi ~~~~~~~~ .. code-block:: yaml EcosEdiApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Content ~~~~~~~~~~~~ .. code-block:: yaml EcosContentApp: environments: javaOpts: "-Xmx256m -Xms256m" resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 100m memory: 1Gi Ecos Proxy ~~~~~~~~~~ .. code-block:: yaml EcosProxyApp: resources: | limits: cpu: 1 memory: 512Mi requests: cpu: 300m memory: 256Mi Microservices Posgtresql ~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: yaml EcosMicroservicesPostgresqlApp: resources: | limits: cpu: 2 memory: 2Gi requests: cpu: 2 memory: 2Gi Mongo DB ~~~~~~~~ .. code-block:: yaml MongoDBApp: resources: | limits: cpu: 500m memory: 512Mi requests: cpu: 300m memory: 512Mi Zookeeper ~~~~~~~~~ .. code-block:: yaml ZookeeperApp: resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 500m memory: 1Gi RabbitMQ ~~~~~~~~ .. code-block:: yaml RabbitmqApp: resources: | limits: cpu: 1 memory: 1Gi requests:m cpu: 500 memory: 1Gi Ecos Indentity ~~~~~~~~~~~~~~ .. code-block:: yaml EcosIdentityApp: resources: | limits: cpu: 1 memory: 1Gi requests: cpu: 300m memory: 1Gi Onlyoffice ~~~~~~~~~~ .. code-block:: yaml OnlyofficeApp: resources: | limits: cpu: 2 memory: 2Gi requests: cpu: 100m memory: 2Gi .. |br| raw:: html
.. _helm-chart-config: Параметры конфигурации Helm chart ------------------------------------- .. note:: Доступно только в Enterprise версии. Раздел описывает параметры Helm chart, используемые для тонкой настройки развёртывания платформы Citeck в Kubernetes-кластере. Параметры позволяют управлять ресурсами, репликами, переменными окружения и другими характеристиками микросервисов. Описание параметров представлено в `примере Helm chart `_. Общее описание ~~~~~~~~~~~~~~~~~~ .. note:: ```` заменяется на имя микросервиса, например ``EcosApp``, ``RabbitmqApp`` и т.д. Общие параметры """""""""""""""""" - ``.Values.FQDN``: Доменное имя платформы - ``.Values.TenantID``: Уникальный идентификатор тенанта - ``.Values.clusterDomain``: Домен кластера Kubernetes Управление микросервисами """"""""""""""""""""""""""" - ``.Values..enabled``: Включение/отключение микросервисов - ``.Values..clearData``: Очистка данных при старте контейнера - ``.Values..type``: Тип ingress - ``.Values..apiVersion``: Версия API ingress - ``.Values..secretName``: Используемый TLS сертификат - ``.Values..albIngress.enabled``: Использовать ALB ingress контроллер Контейнеры и образы """"""""""""""""""""" - ``.Values..image.registry``: Реестр образов - ``.Values..image.repository``: Репозиторий образов - ``.Values..image.tag``: Тег образа - ``.Values..image.pullSecrets``: Секреты для доступа к реестру - ``.Values..initContainers.image.*``: Настройки init-контейнеров Vault и секреты """""""""""""""""" - ``.Values..vault.enabled``: Включение Vault - ``.Values..vault.*``: Переменные окружения и пароли для сервисов (MongoDB, PostgreSQL, Keycloak и др.) Переменные окружения """""""""""""""""""""" - ``.Values..environments.username/password``: Логин/пароль администратора - ``.Values..environments.javaOpts``: Java-опции старта микросервисов - ``.Values..environments.*``: Специфичные переменные (Solr, Alfresco, Flowable и др.) Хранилища и PVC """""""""""""""""" - ``.Values..persistence.enabled``: Включение persistent-хранилища - ``.Values..persistence.size``: Размер PVC - ``.Values..persistence.storageClass``: StorageClass PVC - ``.Values..persistence.accessModes``: Режим доступа PVC - ``.Values..persistence.existingClaim``: Использовать существующий PVC - ``.Values..persistence.backup*``: Параметры PVC для бэкапов Метрики и мониторинг """""""""""""""""""""" - ``.Values..metrics.enabled``: Включение экспорта метрик - ``.Values..metrics.config``: Конфигурация jmx-exporter - ``.Values..metrics.serviceMonitor.*``: Настройки ServiceMonitor - ``.Values..metrics.service.ports.*``: Порты метрик - ``.Values..metrics.containerSecurityContext.*``: Контекст безопасности контейнера - ``.Values..metrics.startupProbe.*``: Startup Probe - ``.Values..metrics.readinessProbe.*``: Readiness Probe - ``.Values..metrics.livenessProbe.*``: Liveness Probe Ресурсы и ограничения """""""""""""""""""""" - ``.Values..resources``: CPU и память для микросервисов - ``.Values..tolerations``: Tolerations для Pods Прочее """""""""""""""""" - ``.Values..webapp.properties.webUrl``: URL для Spring-приложений - ``.Values..x509.certs``: Сертификаты (неясное назначение) Генерация уникального ключа шифрования --------------------------------------- 1. При развертывании нового сервера необходимо каждый раз генерировать уникальный ключ шифрования. 2. Используйте следующий код для генерации AES-ключа: .. code-block:: fun main() { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(128) // AES key size 128 val secretKey = keyGen.generateKey() val base64Key = Base64.getEncoder().encodeToString(secretKey.encoded) println("Base64 Key: $base64Key") } 3. Убедитесь, что ключ по умолчанию заменен на новый. Если этого не сделать, система выдаст предупреждение в логах. :ref:`Подробнее о шифровании секретов`