External Secrets Provider
The external_secrets provider renders External Secrets Operator
resources from a SecretsClaim. It supports both directions:
- Pull (
externalSecrets) — anexternal-secrets.io/v1ExternalSecretthat fetches keys from an external provider into a Kubernetes Secret. - Push (
pushSecrets) — anexternal-secrets.io/v1alpha1PushSecretthat pushes a generated secret to an external provider.
This provider does not configure your secrets backend. It references an existing
SecretStoreorClusterSecretStore. Installing the External Secrets Operator, creating the store, and configuring its provider (AWS Secrets Manager/Parameter Store, Vault, Azure Key Vault, …) are separate concerns. See the External Secrets documentation.
Example
kind: SecretsClaim
name: secret_a
system: system:system_a
owner: group:group_a
version: "1.0"
providers:
external_secrets:
name: app-tenant-env
secretStore:
name: app-tenant-env
kind: SecretStore # SecretStore | ClusterSecretStore (default SecretStore)
externalSecrets: # pull
refreshInterval: 90d
secrets:
- secretName: rds_conn
remoteRef: rds_conn
pushSecrets: # push
- secretName: my-postgres
refreshInterval: 90d
generator:
name: pg-generator
kind: PasswordA claim must declare secretStore and at least one of externalSecrets or
pushSecrets.
Fields
providers.external_secrets
| Field | Required | Description |
|---|---|---|
name | Yes | Entity/external name; recorded as an annotation. |
secretStore | Yes | Reference to an existing store (below). |
externalSecrets | One of | Pull configuration. |
pushSecrets | One of | Push configuration. |
secretStore
| Field | Required | Description |
|---|---|---|
name | Yes | Name of the existing SecretStore/ClusterSecretStore. |
kind | No | SecretStore or ClusterSecretStore. Defaults to SecretStore. |
externalSecrets (pull)
| Field | Required | Description |
|---|---|---|
refreshInterval | No | How often to refresh. Defaults to 1y. |
secrets[] | No | List of pulled keys. |
secrets[].secretName | Yes | Kubernetes Secret key. |
secrets[].remoteRef | No | Remote key; defaults to secretName. |
pushSecrets[] (push)
| Field | Required | Description |
|---|---|---|
secretName | Yes | Target remote name and default remote key. |
refreshInterval | No | Push refresh interval. Defaults to 5m. |
updatePolicy | No | Defaults to Replace. |
deletionPolicy | No | Defaults to None. |
conversionStrategy | No | Defaults to None. |
generator | Yes | Generator used to produce the secret value. |
data / template | No | Accepted by the schema but not rendered — see Notes. |
generator.conversionStrategy | No | Accepted by the schema but not rendered — see Notes. |
generator
| Field | Required | Description |
|---|---|---|
name | Yes | Name of the generator resource. |
kind | No | Generator kind. Defaults to Password. |
apiVersion | No | Defaults to generators.external-secrets.io/v1. |
outputKey | No | Secret key produced. Defaults to password. |
Supported generator kinds: ACRAccessToken, ClusterGenerator,
ECRAuthorizationToken, Fake, GCRAccessToken, GithubAccessToken,
QuayAccessToken, Password, STSSessionToken, UUID, VaultDynamicSecret,
Webhook, Grafana. These are External Secrets generator resource kinds — they
identify which controller-side generator produces the value; they are not cloud
integrations implemented by Firestartr.
Rendered resources
ExternalSecret
metadata.name: normalized claim name.spec.refreshInterval:externalSecrets.refreshIntervalor1y.spec.secretStoreRef:{ name, kind }fromsecretStore(kind defaults toSecretStore).spec.target:{ name: <normalized claim name>, creationPolicy: Owner, deletionPolicy: Delete }.spec.data[]: one entry persecrets[], withsecretKey=secretNameandremoteRef.key=remoteReforsecretName.
All secrets in a single claim are merged into one ExternalSecret with
multiple data entries.
PushSecret
metadata.name:<secretName>-<claim-name>normalized.spec.updatePolicy/spec.deletionPolicy/spec.refreshInterval.spec.secretStoreRefs[]:{ kind, name }fromsecretStore.spec.selector.generatorRef:{ apiVersion, kind, name }fromgenerator.spec.data[]:conversionStrategyand amatchwithremoteRef.remoteKey = secretNameandsecretKey = generator.outputKey || password.
One PushSecret is rendered per pushSecrets entry.
Both resources carry firestartr.dev/claim-ref and firestartr.dev/external-name
annotations.
Notes
- Reference, not configuration. The store must already exist. The rendered resources only point at it.
- Renderer modes. A
SecretsClaimrenders in theexternalSecretsandallrenderer modes, and also under the legacyterraformmode. data,template, andgenerator.conversionStrategyare declarative-only. The claim schema accepts them onpushSecrets[], but the renderer does not copy them into the generatedPushSecret. Only the top-levelpushSecrets[].conversionStrategyis rendered.- One pull target per claim. Because all pulled keys share a single
ExternalSecret, they share one target Secret named after the claim.