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

Управление секретами

Продуктовые сервисы требуют 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>"
kubectl apply -f secret-jailbreak.yaml

Шаг 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:

# values-jailbreak.yaml
# ...

envFrom:
  - secretRef:
      name: jailbreak-creds

Все ключи 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. Передавайте оба набора с одинаковыми значениями.