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:`Подробнее о шифровании секретов`