Работа системы в Kubernetes (legacy)
Эта страница описывает legacy-версию Helm-чарта. Для новых установок используйте актуальную инструкцию Работа системы в Kubernetes.
Установка с помощью Helm-чарта c параметрами по умолчанию
Важно!: Данный вариант установки не предоставляет возможность горизонтального масштабирования CodeScoring. Для установки CodeScoring с поддержкой горизонтального масштабирования обратитесь к соответствующему разделу документации ниже.
Важно!: Необходимо наличие настроенного default StorageClass в кластере. По умолчанию создаются тома объемом 20 GiB
Порядок установки:
-
Создать namespace.
-
Создать secret для доступа к приватному реестру Docker-образов системы "CodeScoring", используя адрес (
REGISTRY_URL), логин (USERNAME) и пароль (PASSWORD), полученные от вендора. -
Установить Helm предпочтительным способом.
-
Выполнить следующие команды для добавления актуального Helm-репозитория на локальную машину:
-
Создать файл
values.yamlсо следующим содержимым:Важно!: Пожалуйста, замените значения в полях с чувствительными данными на собственные. К таким полям относятся
secretKey,defaultSuperuserUsername,defaultSuperuserPassword,defaultSuperuserEmail, а также все поля, содержащиеusernameилиpassword. Также важно учитывать, что все подобные переменные являются обязательными. -
Выполнить команду для установки чарта
Изменение пароля администратора
Для изменения пароля администратора без ручного редактирования файла values.yaml можно использовать следующую команду:
Расширенные настройки параметров Helm-чарта
Важно!: Настоятельно рекомендуется вносить необходимые изменения до установки CodeScoring, в противном случае может потребоваться полная переустановка системы. Данные инструкции предполагают, что специалист имеет опыт работы с кластером Kubernetes и утилитой Helm.
Для удобного редактирования параметров CodeScoring можно скачать и распаковать исходный код Helm-чарта командой:
В файле values.yaml можно отредактировать нужные переменные, и после этого, находясь в каталоге с исходным кодом Helm-чарта, выполнить команду установки
Подключение к внешним PostgreSQL и Redis
По умолчанию PostgreSQL и Redis запускаются в отдельных StatefulSet. Данный вариант может не подходить для использования в production-окружении , т.к. не является отказоустойчивым.
Важно: При использовании собственной базы данных необходимо убедиться, что она соответствует требованиям.
Подключение к внешнему Redis
Для подключения к внешнему Redis, необходимо выполнить следующие действия:
- Отключить развертывание Redis, указав переменную -
redis.enabled: false - В переменных
codescoring.config.djangoCachesRedisUrlsиcodescoring.config.hueyRedisUrlуказать строки подключения для внешнего Redis.
Подключение к внешнему Redis с использованием TLS
Для подключения к внешнему Redis с использованием TLS, дополнительно необходимо:
- Задать значение
trueв переменнойcodescoring.trustedCA.enabled - Добавить корневой сертификат сервера Redis в
codescoring.trustedCA.certificates - В переменных
codescoring.config.djangoCachesRedisUrlsиcodescoring.config.hueyRedisUrlуказать строки подключения для внешнего Redis в форматеrediss://redis.example.com:6379/0, где 0 - номер базы данных в Redis.
Подключение к PostgreSQL через пулер Pgbouncer
Важно!: Подключение к внешней PostgreSQL необходимо выполнять с использованием пулера соединений.
Данный вариант подходит, если в существующей инфраструктуре уже развернута PostgreSQL, но пулер соединений не используется. Helm-чарт развернет пулер Pgbouncer и подключит его к существующей PostgreSQL. Необходимо выполнить следующие действия:
-
Отключить развертывание PostgreSQL, указав переменную -
postgresql.enabled: false -
Подключить пулер Pgbouncer к внешней PostgreSQL, заменив соответствующие параметры на нужные:
Подключение к внешнему пулеру PostgreSQL
Данный вариант подходит, если в существующей инфраструктуре уже развернута PostgreSQL и пулер соединений (например, PgBouncer). В этом случае развертывание пулера Pgbouncer не требуется. Необходимо выполнить следующие действия:
- Отключить развертывание PostgreSQL, указав переменную -
postgresql.enabled: false - Отключить развертывание Pgbouncer, указав переменную -
pgbouncer.enabled: false - Подключить codescoring напрямую к внешнему пулеру, в секции
codescoring.configпараметры:
- Включить использование внешнего пулера и настроить параметры подключения в секции
codescoring.config.externalPooler:
Важно!: Внешний пулер соединений должен поддерживать работу в двух режимах: транзакционном и сессионном. Данные для подключения к пулам указываются в соответствующих секциях: externalPooler.transactionPool и externalPooler.sessionPool.
Настройка томов (PV)
По умолчанию чарт создает необходимые тома через Dynamic Volume Provisioning с использованием StorageClass по умолчанию (default). В случае, если данный вариант развертывания томов не подходит, присутствует возможность гибко настроить создание томов несколькими способами.
Важно!: Описанные ниже опции являются взаимоисключающими. Необходимо выбрать ТОЛЬКО ОДИН вариант развертывания для каждого тома. Допускается выбор разных вариантов развертывания для разных томов.
Для изменения размера создаваемых томов (за исключением локальных) необходимо изменить параметр size в соответствующих секциях
Dynamic Volume Provisioning с использованием требуемого StorageClass
Задать требуемый StorageClass можно в следующих переменных:
codescoring.persistentVolumes.analysisRoot.storageClasscodescoring.persistentVolumes.mediaRoot.storageClasscodescoring.persistentVolumes.djangoStatic.storageClasscodescoring.backup.persistentVolume.storageClassredis.persistentVolume.storageClass(если используется встроенный Redis)postgresql.persistentVolume.storageClass(если используется встроенная PostgreSQL)
В этом случае, будут созданы тома с использованием заданного StorageClass
PersistentVolumeClaim для заранее созданных PersistentVolume
Название предварительно созданных томов можно задать в следующих переменных:
codescoring.persistentVolumes.analysisRoot.volumeNamecodescoring.persistentVolumes.mediaRoot.volumeNamecodescoring.persistentVolumes.djangoStatic.volumeNamecodescoring.backup.persistentVolume.volumeNameredis.persistentVolume.volumeName(если используется встроенный Redis)postgresql.persistentVolume.volumeName(если используется встроенная PostgreSQL)
В этом случае будут созданы только PersistentVolumeClaim для томов, заданных в этих переменных
Использование предварительно созданных PersistentVolumeClaim
Название предварительно созданных PVC можно задать в следующих переменных:
codescoring.persistentVolumes.analysisRoot.existingClaimcodescoring.persistentVolumes.mediaRoot.existingClaimcodescoring.persistentVolumes.djangoStatic.existingClaimcodescoring.backup.persistentVolume.existingClaimredis.persistentVolume.existingClaim(если используется встроенный Redis)postgresql.persistentVolume.exsistingClaim(если используется встроенная PostgreSQL)
В этом случае указанное название PVC будет подставлено в секцию volumes для Pod напрямую.
Использование локальных томов
При отсутствии в кластере Kubernetes внешнего хранилища данных возможен запуск CodeScoring с использованием локальных томов. В этом случае данные будут хранится на одной из нод кластера.
Для создания локальных томов необходимо выполнить следующие действия:
-
Присвоить значение
trueследующим переменным:codescoring.persistentVolumes.analysisRoot.localVolume.enabledcodescoring.persistentVolumes.mediaRoot.localVolume.enabledcodescoring.persistentVolumes.djangoStatic.localVolume.enabledcodescoring.backup.persistentVolume.localVolume.enabledredis.persistentVolume.localVolume.enabled(если используется встроенный Redis)postgresql.persistentVolume.localVolume.enabled(если используется встроенная PostgreSQL)
-
Задать путь до каталога на ноде кластера, в котором будут размещены данные в следующих переменных:
codescoring.persistentVolumes.analysisRoot.localVolume.pathcodescoring.persistentVolumes.mediaRoot.localVolume.pathcodescoring.persistentVolumes.djangoStatic.localVolume.pathcodescoring.backup.persistentVolume.localVolume.pathredis.persistentVolume.localVolume.path(если используется встроенный Redis)postgresql.persistentVolume.localVolume.path(если используется встроенная PostgreSQL)
-
Указать название ноды, на которой будет создан локальный том в следующих переменных:
codescoring.persistentVolumes.analysisRoot.localVolume.nodeHostnamecodescoring.persistentVolumes.mediaRoot.localVolume.nodeHostnamecodescoring.persistentVolumes.djangoStatic.localVolume.nodeHostnamecodescoring.backup.persistentVolume.localVolume.nodeHostnameredis.persistentVolume.localVolume.nodeHostname(если используется встроенный Redis)postgresql.persistentVolume.localVolume.nodeHostname(если используется встроенная PostgreSQL)
Допускается использование разных нод для разных томов.
Настройка хранилища для временных файлов сканирований
По умолчанию временные файлы в процессе сканирования хранятся в директории /tmp внутри контейнеров, к которой монтируются Ephemeral Volumes типа emptyDir:
codescoring.huey.ipcsQueue.ephemeralVolumescodescoring.huey.tasksOsaContainerImageScan.ephemeralVolumescodescoring.huey.tasksOsaPackageScan.ephemeralVolumes
Однако в некоторых случаях может потребоваться использовать Persistent Volume вместо Ephemeral Volume. В таком случае следует закомментировать соответствующие секции в ephemeralVolumes для одного или нескольких сервисов, в зависимости от того, для каких сервисов требуется монтировать тома:
После необходимо выставить значение enabled: true в одной или нескольких из следующих секций:
codescoring.huey.persistentVolumes.hueyTmpcodescoring.huey.persistentVolumes.hueyPackageScanTmpcodescoring.huey.persistentVolumes.hueyContainerImageScanTmp
В результате будут созданы PersistentVolumeClaim для соответствующих сервисов. Стоит отметить, что возможности конфигурирования данных томов полностью соответствуют описанным в секции Настройка томов (PV).
При горизонтальном масштабировании сервисов, необходимо произвести настройку томов в соответствии с инструкцией в разделе Горизонтальное масштабирование CodeScoring.
Горизонтальное масштабирование CodeScoring
Важно!: Для горизонтального масштабирования системы CodeScoring необходимо наличие в кластере Kubernetes возможности создания томов с типом доступа ReadWriteMany (RWX)
Для горизонтального масштабирования CodeScoring необходимо создать тома analysis-root, media-root и django-static с типом доступа ReadWriteMany.
Для этого необходимо заменить значение ReadWriteOnce на ReadWriteMany в переменных:
codescoring.persistentVolumes.analysisRoot.accessModescodescoring.persistentVolumes.mediaRoot.accessModescodescoring.persistentVolumes.djangoStatic.accessModes
Затем, необходимо закоментировать переменные:
codescoring.backend.affinitycodescoring.frontend.affinity
Если этого не сделать, то все поды будут запущены только на одной ноде кластера.
Настройка ограничения ресурсов (resource limits)
По умолчанию requests и limits не заданы. Это сделано для обеспечения возможности запуска системы CodeScoring в кластерах с малым количеством ресурсов (например, minikube) c целью тестирования.
При запуске в production-окружении может потребоваться настроить ограничение ресурсов. Это можно сделать, задав следующие переменные:
postgresql.resources(при использовании встроенной PostgreSQL)redis.resources(при использовании встроенного Redis)codescoring.backend.resourcescodescoring.frontend.resourcescodescoring.huey.highPriorityQueue.resourcescodescoring.huey.ipcsQueue.resourcescodescoring.huey.tasksOsaContainerImageScan.resourcescodescoring.huey.tasksOsaPackageScan.resourcescodescoring.huey.tasksPolicy.resourcescodescoring.huey.tasksMedia.resources
Возможно указание как resources и limits вместе, так и по отдельности, например:
Ниже приведены примерные значения limits для платформе CodeScoring с 8-10 проектами:
Также возможна настройка ресурсов init-контейнеров. Для сервиса backend они настраиваются в разделе
Для всех прочих сервисов init-контейнеры являются однотипными и выполняют функции wait-for для обеспечения последовательного запуска сервисов. Ресурсы для них настраиваются в разделе
Добавление сертификата удостоверяющего центра (CA)
Для доступа CodeScoring к ресурсам с TLS-сертификатами, подписанными корпоративным удостоверяющим центром (CA) необходимо:
- Присвоить переменной
codescoring.trustedCA.enabledзначениеtrue - Добавить корневой сертификат удостоверяющего центра (RootCA) в формате PEM в переменную
codescoring.trustedCA.certificatesв форматеключ: значение, где ключ - имя файла сертификата, включая расширение.crt, значение - сертификат в формате PEM.
Например:
В случае наличия нескольких корневых CA необходимо добавить их в отдельные ключи, например:
Управление секретами
По умолчанию для шаблонов ipcs-backend, pgbouncer и postgresql предусмотрены объекты типа Secret. Значения переменных в этих объектах заполняются из содержимого values.
Также присутствует возможность подключать внешние хранилища секретов. Для этого в кластере должен должен быть установлен External Secrets Operator (ESO). Он добавляет в кластер необходимые CRD (Custom Resource Definition) и обеспечивает связь с хранилищем секретов.
Для подключения ESO к внешнему хранилищу секретов необходимо сконфигурировать провайдера для SecretStore в разделе codescoring.secretStore.
Далее, необходимо настроить объекты ExternalSecret для получения секретов из внешнего хранилища в разделах codescoring.config.externalSecret, pgbouncer.externalSecret, postgresql.externalSecret.
Вся конфигурация осуществляется в соответствии с документацией ESO.
Важно!: Некоторые провайдеры могут тарифицировать запросы к хранилищам секретов. Интервал запроса данных регулируется параметром externalSecret.refreshInterval для каждого отдельного сервиса.
Мониторинг
Для сбора метрик с сервисов в чарте предусмотрены ресурсы ServiceMonitor. Метрики собираются с сервисов backend и osa-api. Для использования ServiceMonitor в кластере должен быть установлен и настроен Prometheus Operator.
ServiceMonitor настраивается в следующих разделах values: codescoring.backend.prometheus.serviceMonitor, codescoring.osa_api.prometheus.serviceMonitor.
Также для вышеуказанных сервисов предусмотрены ресурсы PrometheusRule, необходимые для настройки правил алертинга. Настройка данных ресурсов осуществляется в следующих разделах values: codescoring.backend.prometheus.alerts, codescoring.osa_api.prometheus.alerts.
Все настройки осуществляются в соответствии с документацией Prometheus Operator.
Обновление системы
Для обновления системы необходимо актуализировать helm-репозиторий командой
и далее выполнить команду обновления платформы, где CHART_VERSION - версия чарта, на которую происходит обновление
