Skip to content

Production Setup

Требования к инфраструктуре

Для production окружения рекомендуется следующая архитектура:

Рекомендуемая архитектура нод

  • 2 ноды с лейблом app-worker-api — для API, фронтенда и Redis (требуется для соблюдения HA — высокой доступности)
  • 1 нода с лейблом app-worker-calc — для фоновых заданий и прогона агрегаций
  • 1 нода с лейблом app-worker-scan — для запуска сканов

Рекомендуемые характеристики нод

Для обеспечения высокой производительности и возможности горизонтального масштабирования при росте нагрузки, каждая нода должна иметь следующие характеристики:

  • 12 CPU
  • 32GB RAM
  • SSD/SAN disk 100GB (500 IOPS read/write)

Для больших кластеров: В кластерах с большим количеством нод (10+ нод) требования к отдельным нодам могут быть снижены благодаря распределению нагрузки и возможности горизонтального масштабирования. В таких случаях допустимо использование нод с меньшими характеристиками (например, 8 CPU, 16-24GB RAM), при условии обеспечения достаточной общей мощности кластера и возможности масштабирования при росте нагрузки. Рекомендуется провести нагрузочное тестирование для валидации конфигурации. Дополнительно заранее распределите ноды по лейблам (app-worker-api, app-worker-calc, app-worker-scan) и убедитесь, что под каждое лейбло выделено достаточно ресурсов, чтобы все привязанные к нему компоненты действительно разместились на нужных нодах.

Внешние сервисы

PostgreSQL:

  • Версия: 13.x или выше (рекомендуется 16.x)
  • Доступность: из кластера Kubernetes
  • Ресурсы: 8 CPU, 16GB RAM, SSD с 300+ IOPS
  • Резервное копирование: настроено на Вашей стороне

Redis:

  • Версия: 7.x
  • Доступность: из кластера Kubernetes

Подготовка production конфигурации

Шаг 1. Создайте конфигурационный файл my-production-config.yaml (файл оверрайдов).

Если вы хотите использовать пример файла из чарта, сначала скачайте чарт для просмотра:

helm pull oci://registry.hexway.io/charts/vampy --version $RELEASE_VERSION --untar
cd vampy
cp values.override.production-example.yaml ../my-production-config.yaml
cd ..

Или создайте файл my-production-config.yaml самостоятельно с необходимыми настройками.

⚠️ Важно: Не изменяйте файл values.yaml в чарте. Все ваши настройки должны быть в файле my-production-config.yaml (файл оверрайдов), который передается через флаг -f.

Шаг 2. Отредактируйте конфигурацию my-production-config.yaml:

Ниже — пример настроек внешней PostgreSQL и Redis. В тот же файл при необходимости можно добавить Ingress, пользователей по умолчанию, requests и limits ресурсов, количество реплик, распределение по нодам и другие параметры. Полный перечень — в values.yaml чарта (см. раздел «Просмотр чарта и установка с локального чарта» в Установка чарта).

# Настройки БД PostgreSQL
database:
  host: "your-postgres-host.example.com"
  port: "5432"
  name: "vampy"
  secretsKeyRefs:
    username:
      name: "<release_name>-vampy-config"  # Замените "<release_name>" на значение переменной $RELEASE_NAME
      key: "EXT_PG_USERNAME"
    password:
      name: "<release_name>-vampy-config"  # Замените "<release_name>" на значение переменной $RELEASE_NAME
      key: "EXT_PG_PASSWORD"

# Отключаем встроенный Postgres
vPostgres:
  enabled: false

# Настройка Redis
redis:
  host: "your-redis-host.example.com"
  port: "6379"

vRedis:
  enabled: false

⚠️ Важно:

  • В YAML файле в поле name секрета необходимо вручную указать имя секрета в формате <имя_релиза>-vampy-config, где <имя_релиза> — это значение переменной окружения $RELEASE_NAME, установленной в разделе Переменные, используемые в инструкции. Например, если $RELEASE_NAME="vampy", то имя секрета будет vampy-vampy-config.
  • База данных PostgreSQL должна быть создана заранее на внешнем сервере.
  • Пользователь БД должен иметь права на создание таблиц, индексов и выполнение миграций (права CREATE, ALTER, SELECT, INSERT, UPDATE, DELETE на схему базы данных).

Рекомендуются параметры для распределения нагрузки по нодам:

# NodeSelector для распределения нагрузки
vEngine:
  nodeSelector:
    kubernetes.io/affinity-node-label: app-worker-api

vBackgroundSeparated:
  enabled: true
  modes:
    cpuLoadScan:
      nodeSelector:
        kubernetes.io/affinity-node-label: app-worker-scan
    cpuLoadCalc:
      nodeSelector:
        kubernetes.io/affinity-node-label: app-worker-calc
    businessFlow:
      nodeSelector:
        kubernetes.io/affinity-node-label: app-worker-api
    highPriorityCalc:
      nodeSelector:
        kubernetes.io/affinity-node-label: app-worker-api

Примечание: Чтобы назначить ноде лейбл для nodeSelector, выполните: kubectl label nodes <имя_ноды> <лейбл>=<значение> (например, kubectl label nodes worker-1 kubernetes.io/affinity-node-label=app-worker-api).

Шаг 3. Создайте Kubernetes Secret для доступа к БД:

kubectl create secret generic ${RELEASE_NAME}-vampy-config \
  --namespace=$RELEASE_NAMESPACE \
  --from-literal=EXT_PG_USERNAME='your_db_user' \
  --from-literal=EXT_PG_PASSWORD='your_db_password' \
  --from-literal=EXT_REDIS_USERNAME='your_redis_user' \
  --from-literal=EXT_REDIS_PASSWORD='your_redis_password'

⚠️ Важно: Если вы создаёте секрет вручную (до установки Helm чарта), Helm может выдавать предупреждение о том, что секрет не управляется Helm. Чтобы избежать этого, после создания секрета выполните следующие команды для добавления аннотаций Helm:

kubectl label secret ${RELEASE_NAME}-vampy-config -n $RELEASE_NAMESPACE app.kubernetes.io/managed-by=Helm --overwrite

kubectl annotate secret ${RELEASE_NAME}-vampy-config -n $RELEASE_NAMESPACE meta.helm.sh/release-name=$RELEASE_NAME --overwrite

kubectl annotate secret ${RELEASE_NAME}-vampy-config -n $RELEASE_NAMESPACE meta.helm.sh/release-namespace=$RELEASE_NAMESPACE --overwrite

Альтернативно, вы можете использовать другой секрет (не ${RELEASE_NAME}-vampy-config), которым Helm не будет пытаться управлять.

Шаг 4. Установите чарт:

Вы можете установить чарт напрямую из удалённого репозитория (рекомендуемый способ):

helm upgrade --install $RELEASE_NAME oci://registry.hexway.io/charts/vampy \
  --version $RELEASE_VERSION \
  -n $RELEASE_NAMESPACE \
  --create-namespace \
  -f my-production-config.yaml

Или, если вы скачали чарт локально и находитесь в директории чарта:

helm upgrade --install $RELEASE_NAME . \
  -n $RELEASE_NAMESPACE \
  --create-namespace \
  -f my-production-config.yaml

Шаг 5. Проверьте размещение подов на нужных нодах:

kubectl get pods -n $RELEASE_NAMESPACE -o wide

Настройка для высоконагруженных окружений

Если в вашей системе более 1 скана в минуту, настройте профиль шины событий:

commonConfig:
  eventBus:
    profile: "highload"  # вместо "default"

Доступные профили:

Профиль Макс. задержка вычислений Назначение
default 60 сек Малонагруженные системы
highload 300 сек Много репозиториев, параллельных сканов