Управление секретами¶
Продуктовые сервисы требуют credentials для подключения к PostgreSQL, Redis и MinIO. Чарты поддерживают три способа их передачи — выбирайте подходящий.
Способ 1: secretEnv (Helm-managed Secret)¶
Helm создаёт K8s Secret из значений secretEnv при helm install. Самый простой способ.
# values-jailbreak.yaml
secretEnv:
DATABASE_URL: "postgresql+asyncpg://genai_admin:MyPassword123@postgres:5432/genai_db"
S3_ACCESS_KEY: "<minio-user>"
S3_SECRET_KEY: "<minio-password>"
Плюсы: не нужно ничего создавать вручную.
Минусы: пароли видны в values.yaml и в helm history — нежелательно для production.
Способ 2: Существующий K8s Secret (рекомендуется для production)¶
Создайте Secret вручную до helm install, затем укажите его в extraEnvVars.
Шаг 1: создать Secret¶
kubectl create secret generic jailbreak-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://genai_admin:MyPassword123@postgres:5432/genai_db" \
--from-literal=S3_ACCESS_KEY="<minio-user>" \
--from-literal=S3_SECRET_KEY="<minio-password>"
Или через YAML-манифест:
# secret-jailbreak.yaml
apiVersion: v1
kind: Secret
metadata:
name: jailbreak-creds
namespace: genai
type: Opaque
stringData:
DATABASE_URL: "postgresql+asyncpg://genai_admin:MyPassword123@postgres:5432/genai_db"
S3_ACCESS_KEY: "<minio-user>"
S3_SECRET_KEY: "<minio-password>"
Шаг 2: указать в values.yaml через extraEnvVars¶
# values-jailbreak.yaml
image:
name: registry.appsec.global/appsecgenai-release/jailbreak
tag: "<VERSION>"
imagePullSecrets:
- name: harbor-cr
# secretEnv не указываем — credentials берём из существующего Secret
extraEnvVars:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: jailbreak-creds
key: DATABASE_URL
- name: S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: jailbreak-creds
key: S3_ACCESS_KEY
- name: S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: jailbreak-creds
key: S3_SECRET_KEY
env:
ENVIRONMENT: "production"
AUTH_ENABLED: "true"
OTEL_SDK_DISABLED: "true"
S3_BUCKET: "jailbreak-reports"
global:
url:
redisUrl: { svc: redis, port: 6379, scheme: redis, path: /0 }
natsUrl: { svc: nats, port: 4222, scheme: nats }
s3Endpoint: { svc: minio, port: 9000, scheme: none }
Способ 3: envFrom (все ключи из Secret сразу)¶
Если Secret уже содержит все нужные переменные с правильными именами — используйте envFrom:
Все ключи Secret'а станут переменными окружения пода. Удобно когда Secret содержит именно те имена переменных, что ожидает сервис (DATABASE_URL, S3_ACCESS_KEY, S3_SECRET_KEY).
Шаблон Secret'а для каждого сервиса¶
Создайте один Secret на сервис со всеми нужными credentials:
Сервисы с PostgreSQL + MinIO (большинство)¶
kubectl create secret generic <service>-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://<user>:<password>@<pg-host>:5432/<db>" \
--from-literal=S3_ACCESS_KEY="<minio-user>" \
--from-literal=S3_SECRET_KEY="<minio-password>"
Применимо к: jailbreak, results, scan-profile, model-mgmt, orchestrator.
asr и cv (дополнительные credentials для весов моделей)¶
kubectl create secret generic asr-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://..." \
--from-literal=S3_ACCESS_KEY="<minio-user>" \
--from-literal=S3_SECRET_KEY="<minio-password>" \
--from-literal=MODEL_WEIGHTS_S3_ACCESS_KEY="<minio-user>" \
--from-literal=MODEL_WEIGHTS_S3_SECRET_KEY="<minio-password>"
license-service (без S3)¶
kubectl create secret generic license-service-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://..."
auth-service (без S3, с Keycloak client secret)¶
kubectl create secret generic auth-service-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://..." \
--from-literal=KEYCLOAK_CLIENT_SECRET="<client-secret-uuid>"
Общий Secret для всех сервисов (альтернатива)¶
Если PostgreSQL и MinIO одни для всех сервисов — создайте один общий Secret и ссылайтесь на него из каждого values.yaml:
kubectl create secret generic genai-common-creds -n genai \
--from-literal=DATABASE_URL="postgresql+asyncpg://genai_admin:MyPassword123@postgres:5432/genai_db" \
--from-literal=S3_ACCESS_KEY="<minio-user>" \
--from-literal=S3_SECRET_KEY="<minio-password>" \
--from-literal=MODEL_WEIGHTS_S3_ACCESS_KEY="<minio-user>" \
--from-literal=MODEL_WEIGHTS_S3_SECRET_KEY="<minio-password>"
Затем в каждом values.yaml:
extraEnvVars:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: genai-common-creds
key: DATABASE_URL
- name: S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: genai-common-creds
key: S3_ACCESS_KEY
- name: S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: genai-common-creds
key: S3_SECRET_KEY
Сводная таблица: какие ключи нужны каждому сервису¶
| Сервис | DATABASE_URL | S3_ACCESS_KEY / S3_SECRET_KEY | MODEL_WEIGHTS_S3_* | KEYCLOAK_CLIENT_SECRET |
|---|---|---|---|---|
model-mgmt |
✓ | ✓ (+ MINIO_ACCESS/SECRET_KEY алиасы) | — | — |
scan-profile |
✓ | ✓ (+ MINIO_ACCESS/SECRET_KEY алиасы) | — | — |
auth-service |
✓ | — | — | ✓ |
license-service |
✓ | — | — | — |
results |
✓ | ✓ | — | — |
jailbreak |
✓ | ✓ | — | — |
orchestrator |
✓ | — | — | — |
asr |
✓ | ✓ | ✓ | — |
cv |
✓ | ✓ | ✓ | — |
ui-gateway |
— | — | — | — |
ui |
— | — | — | — |
MINIO_ACCESS_KEY / MINIO_SECRET_KEY
model-mgmt и scan-profile имеют устаревший код, который читает MINIO_ACCESS_KEY / MINIO_SECRET_KEY параллельно с S3_ACCESS_KEY / S3_SECRET_KEY. Передавайте оба набора с одинаковыми значениями.