Перейти к содержанию

NATS JetStream

NATS JetStream — шина событий платформы. Обеспечивает at-least-once delivery для задач атак и уведомлений между сервисами.

Назначение

Все задачи атак (jailbreak, asr, cv) передаются через NATS. orchestrator публикует задания, компоненты-атакующие подписываются на них. При первом запуске bootstrap создаёт 6 JetStream-потоков.

JetStream потоки

Stream Subjects Retention Max Age Назначение
ATTACKS attacks.*.* limits 7 дней Задания атак
SCANS scans.* limits 30 дней Жизненный цикл сканирований
RESULTS results.*.* limits 90 дней Результаты атак
ARTIFACTS artifacts.*.* limits 30 дней Артефакты
VULNERABILITIES vulnerabilities.*.* limits 90 дней Уязвимости
NOTIFICATIONS notifications.* workq 7 дней Уведомления

Зависимости

Входящие (кто подключается)

Сервис Роль
orchestrator publisher (SCANS, ATTACKS)
jailbreak (preparator/attacker/judge/reporter) consumer/publisher
asr (preparator/attacker/judge/reporter) consumer/publisher
cv (preparator/attacker/judge/reporter) consumer/publisher
results consumer (RESULTS)
model-mgmt consumer (уведомления)

Исходящие

Нет.

Values

Параметр По умолчанию Обязателен Описание
persistence.enabled false нет Включить PVC для JetStream storage
global.image.tag да Версия образа
global.imagePullSecrets[0].name да imagePullSecret

Пример values.yaml

# values-nats.yaml
persistence:
  enabled: true          # рекомендуется для production

global:
  image:
    registry: registry.appsec.global
    repositoryPrefix: appsecgenai-release
    tag: "<VERSION>"
  imagePullSecrets:
    - name: harbor-cr

Установка

helm upgrade --install nats \
  oci://registry.appsec.global/appsecgenai-release/charts/nats \
  --version <VERSION> -n genai --create-namespace \
  --wait \
  -f values-nats.yaml

Внешний NATS

Если NATS уже развёрнут отдельно — установите nats.enabled: false и укажите координаты в global.deps.nats.

Wizard (values.yaml)

nats:
  enabled: false          # не ставить in-cluster NATS

global:
  deps:
    nats:
      host: nats.example.com
      port: 4222
      scheme: tls          # tls:// если NATS за TLS (default: nats://)
      # bootstrap: true    # создать 6 JetStream потоков в существующем NATS

bootstrap: идемпотентность

Потоки создаются идемпотентно (stream add возвращает existing без ошибки). Оставить bootstrap: true на каждый update — безопасно. При встроенном NATS (nats.enabled: true) bootstrap не нужен — потоки создаются Helm hook Job автоматически.

Ручная установка (k8s-manual)

При ручной установке каждого сервиса задайте natsUrl в global.url:

# values-<service>.yaml
global:
  url:
    # Внешний NATS через TLS — строковый формат (передаётся as-is)
    natsUrl: "tls://nats.example.com:4222"

Bootstrap JetStream потоков

При установке через Wizard потоки создаются автоматически. При ручной установке — создайте после старта NATS.

Реальные потоки из production (subjects используют > — wildcard NATS):

Stream Subjects Используется
ATTACKS attacks.> orchestrator → jailbreak/asr/cv
SCANS scans.> orchestrator
RESULTS results.> jailbreak/asr/cv → results
ARTIFACTS artifacts.> атакующие сервисы
VULNERABILITIES vulnerabilities.> атакующие сервисы
NOTIFICATIONS notifications.> уведомления
# Port-forward к NATS
kubectl port-forward svc/nats 4222:4222 -n genai &
sleep 2

# Создать 6 потоков (идемпотентно)
for STREAM in ATTACKS SCANS RESULTS ARTIFACTS VULNERABILITIES NOTIFICATIONS; do
  SUBJ=$(echo "${STREAM}" | tr '[:upper:]' '[:lower:]')
  nats stream add ${STREAM} \
    --subjects "${SUBJ}.>" \
    --storage file \
    --replicas 1 \
    --retention limits \
    --discard old \
    --max-msgs=-1 --max-bytes=-1 --max-age=0 \
    --dupe-window 2m \
    --no-confirm 2>/dev/null && echo "✓ ${STREAM}" || echo "→ ${STREAM} already exists"
done

nats CLI

# macOS
brew install nats-io/nats-tools/nats

# или через Docker (без установки)
docker run --rm --network host natsio/nats-box:latest \
  nats --server nats://localhost:4222 stream ls

Bootstrap потоков

Wizard автоматически создаёт 6 JetStream-потоков при global.deps.nats.bootstrap: true. При ручной установке создайте потоки вручную через nats stream add после старта сервера.