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