Следующий слой после Vault: сам оператор и первый потребитель. Vault-сторона уже настроена руками: движок kv (v2), auth-метод kubernetes, политика eso-read и роль eso с bound_service_account_names=external-secrets, bound_service_account_namespaces=security, audience=vault, ttl 1h/4h.
Что в PR
Flux-Kustomization external-secrets в ns security с dependsOn: vault (обе Kustomization живут в ns security, поэтому dependsOn допустим).
OCIRepositoryoci://ghcr.io/external-secrets/charts/external-secrets, tag 2.10.0 (версия чарта = appVersion). HelmRelease: installCRDs: true, валидирующий webhook и certController включены (сертификаты чарт выпускает сам, cert-manager не участвует), upgrade.remediation.strategy: uninstall — оператор без состояния, переустановка безопасна.
ClusterSecretStore/vault:
server: http://vault.security.svc:8200 — внутрикластерный адрес, потому что Vault слушает без TLS (tls_disable), и тогда ESO не нужно доверие к internal-ca. Снаружи UI остаётся на https через envoy.
path: kv, version: v2;
auth.kubernetes с mountPath: kubernetes, role: eso, serviceAccountRef → external-secrets в ns security, audiences: [vault] (Vault 1.21+ без audience аутентификацию не принимает).
ExternalSecret/vault-smoke — проверочный объект, доказывающий всю цепочку.
Что нужно сделать в Vault (одна команда)
vault kv put kv/demo username=demo password=s3cr3t
(key в ExternalSecret указывается без префикса path: demo → kv/data/demo.)
Проверка
kubectl -n security get pods
kubectl -n security get clustersecretstore vault -o jsonpath='{.status.conditions[*].reason}'
kubectl -n security get externalsecret vault-smoke -o wide
kubectl -n security get secret vault-smoke -o jsonpath='{.data.username}' | base64 -d
Ожидаемо: поды external-secrets в Running, у стора и ExternalSecret Ready=True/Valid, SecretSynced, и в Secret лежат значения из Vault.
vault-smoke — временный: как только появится первый настоящий потребитель (например токен вебхука Flux или приложение), он удаляется, а приложения получают свои externalsecret.yaml в 2–6 строк.
Следующий слой после Vault: сам оператор и первый потребитель. Vault-сторона уже настроена руками: движок `kv` (v2), auth-метод `kubernetes`, политика `eso-read` и роль `eso` с `bound_service_account_names=external-secrets`, `bound_service_account_namespaces=security`, `audience=vault`, ttl 1h/4h.
## Что в PR
- Flux-Kustomization `external-secrets` в ns `security` с `dependsOn: vault` (обе Kustomization живут в ns security, поэтому dependsOn допустим).
- `OCIRepository` `oci://ghcr.io/external-secrets/charts/external-secrets`, tag `2.10.0` (версия чарта = appVersion). `HelmRelease`: `installCRDs: true`, валидирующий webhook и certController включены (сертификаты чарт выпускает сам, cert-manager не участвует), `upgrade.remediation.strategy: uninstall` — оператор без состояния, переустановка безопасна.
- `ClusterSecretStore/vault`:
- `server: http://vault.security.svc:8200` — внутрикластерный адрес, потому что Vault слушает без TLS (`tls_disable`), и тогда ESO не нужно доверие к `internal-ca`. Снаружи UI остаётся на https через envoy.
- `path: kv`, `version: v2`;
- `auth.kubernetes` с `mountPath: kubernetes`, `role: eso`, `serviceAccountRef` → `external-secrets` в ns `security`, `audiences: [vault]` (Vault 1.21+ без audience аутентификацию не принимает).
- `ExternalSecret/vault-smoke` — проверочный объект, доказывающий всю цепочку.
## Что нужно сделать в Vault (одна команда)
```
vault kv put kv/demo username=demo password=s3cr3t
```
(`key` в ExternalSecret указывается без префикса `path`: `demo` → `kv/data/demo`.)
## Проверка
```
kubectl -n security get pods
kubectl -n security get clustersecretstore vault -o jsonpath='{.status.conditions[*].reason}'
kubectl -n security get externalsecret vault-smoke -o wide
kubectl -n security get secret vault-smoke -o jsonpath='{.data.username}' | base64 -d
```
Ожидаемо: поды `external-secrets` в Running, у стора и ExternalSecret `Ready=True`/`Valid`, `SecretSynced`, и в Secret лежат значения из Vault.
`vault-smoke` — временный: как только появится первый настоящий потребитель (например токен вебхука Flux или приложение), он удаляется, а приложения получают свои `externalsecret.yaml` в 2–6 строк.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Следующий слой после Vault: сам оператор и первый потребитель. Vault-сторона уже настроена руками: движок
kv(v2), auth-методkubernetes, политикаeso-readи рольesoсbound_service_account_names=external-secrets,bound_service_account_namespaces=security,audience=vault, ttl 1h/4h.Что в PR
external-secretsв nssecurityсdependsOn: vault(обе Kustomization живут в ns security, поэтому dependsOn допустим).OCIRepositoryoci://ghcr.io/external-secrets/charts/external-secrets, tag2.10.0(версия чарта = appVersion).HelmRelease:installCRDs: true, валидирующий webhook и certController включены (сертификаты чарт выпускает сам, cert-manager не участвует),upgrade.remediation.strategy: uninstall— оператор без состояния, переустановка безопасна.ClusterSecretStore/vault:server: http://vault.security.svc:8200— внутрикластерный адрес, потому что Vault слушает без TLS (tls_disable), и тогда ESO не нужно доверие кinternal-ca. Снаружи UI остаётся на https через envoy.path: kv,version: v2;auth.kubernetesсmountPath: kubernetes,role: eso,serviceAccountRef→external-secretsв nssecurity,audiences: [vault](Vault 1.21+ без audience аутентификацию не принимает).ExternalSecret/vault-smoke— проверочный объект, доказывающий всю цепочку.Что нужно сделать в Vault (одна команда)
(
keyв ExternalSecret указывается без префиксаpath:demo→kv/data/demo.)Проверка
Ожидаемо: поды
external-secretsв Running, у стора и ExternalSecretReady=True/Valid,SecretSynced, и в Secret лежат значения из Vault.vault-smoke— временный: как только появится первый настоящий потребитель (например токен вебхука Flux или приложение), он удаляется, а приложения получают своиexternalsecret.yamlв 2–6 строк.