В GitOps-процессе Git — источник истины для манифестов, но значения секретов в репозиторий попадать не должны. В Git хранятся только ссылки на секреты, а значения берутся из Stronghold в кластере.

Инструменты на этой странице (External Secrets Operator, argocd-vault-plugin, SOPS) разработаны для HashiCorp Vault. Stronghold совместим с API Vault, поэтому их можно направить на Stronghold.

Выбор подхода

Подходы различаются тем, что хранится в Git и куда попадает значение секрета:

ПодходЧто хранится в GitГде оказывается значение секретаИнструменты
External Secrets OperatorМанифесты ExternalSecret со ссылками на пути StrongholdSecret Kubernetes (etcd)Argo CD, Flux
argocd-vault-pluginМанифесты с плейсхолдерами <path:...#key>Отрендеренные манифесты Argo CD и Secret Kubernetes (etcd)Argo CD
SOPS с ключом механизма TransitЗашифрованные файлыSecret Kubernetes (etcd) после расшифровкиFlux, Argo CD с плагином
CSI или env-injector модуля secrets-store-integrationМанифесты подов с аннотациями или томами CSIТолько в подеArgo CD, Flux

При использовании External Secrets Operator или модуля secrets-store-integration в Git не попадают ни значения, ни зашифрованные данные, а права на чтение задаются ролями Stronghold. Сравнение способов доставки секретов в поды приведено на странице «Доставка секретов в поды Kubernetes».

External Secrets Operator с Argo CD или Flux

Храните в Git манифесты SecretStore (или ClusterSecretStore) и ExternalSecret. Argo CD или Flux применяет их как обычные ресурсы, а оператор создаёт Secret со значениями из Stronghold:

apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: myapp-db
  namespace: myapp
spec:
  refreshInterval: 15m
  secretStoreRef:
    name: stronghold
    kind: SecretStore
  target:
    name: myapp-db
  dataFrom:
    - extract:
        key: myapp/db

Настройка SecretStore и роли Kubernetes auth описана в разделе «Доставка секретов в поды Kubernetes».

Если Argo CD показывает Secret как рассинхронизированный, исключите сгенерированные оператором Secret из отслеживания Argo CD, так как их нет в Git.

argocd-vault-plugin

argocd-vault-plugin подставляет значения в манифесты при рендеринге в Argo CD. В Git хранятся плейсхолдеры:

apiVersion: v1
kind: Secret
metadata:
  name: myapp-db
  namespace: myapp
type: Opaque
stringData:
  password: <path:secret/data/myapp/db#password>

Плагин настраивается переменными окружения в repo-server Argo CD, например:

env:
  - name: AVP_TYPE
    value: vault
  - name: VAULT_ADDR
    value: https://stronghold.example.com
  - name: AVP_AUTH_TYPE
    value: k8s
  - name: AVP_K8S_ROLE
    value: argocd-repo-server

Отрендеренные манифесты с открытыми значениями видны Argo CD и могут кешироваться. Выдавайте роли плагина доступ только к нужным путям и ограничьте, кто может просматривать манифесты приложений в Argo CD.

SOPS с механизмом Transit

SOPS умеет шифровать файлы ключом механизма секретов Transit через API, совместимый с Vault. Зашифрованные файлы хранятся в Git, а Flux расшифровывает их при применении.

  1. Создайте ключ шифрования:

    d8 stronghold secrets enable transit
    d8 stronghold write -f transit/keys/sops
  2. Зашифруйте файл:

    export VAULT_ADDR=https://stronghold.example.com
    export VAULT_TOKEN=<токен с правами на transit/encrypt/sops>
    sops --encrypt --hc-vault-transit $VAULT_ADDR/v1/transit/keys/sops secret.yaml > secret.enc.yaml

Для расшифровки во Flux контроллеру kustomize-controller нужен токен Stronghold с правами на transit/decrypt/sops. Токен хранится в Secret кластера, поэтому используйте отдельную политику и короткий срок жизни с продлением.

Механизм секретов GitOps

Для управления конфигурацией самого Stronghold (политики, методы аутентификации, точки монтирования) используйте встроенный механизм секретов GitOps. Он отслеживает Git-репозиторий, проверяет подписи коммитов и применяет декларативную конфигурацию через API Stronghold. Формат описан в разделе «Формат конфигурации».

Механизм GitOps не доставляет секреты в приложения: используйте его вместе с одним из подходов выше.