Skip to content

ESO PushSecret composition

The operator only exports rotated tokens to Kubernetes Secrets. For anything else — external vaults, webhook endpoints, multi-cluster sync — the supported pattern is External Secrets Operator PushSecret, which references the Secret the operator writes and pushes it to any configured SecretStore.

Push to an external vault

apiVersion: external-secrets.io/v1beta1
kind: PushSecret
metadata:
  name: gitlab-ci-token-to-vault
spec:
  selector:
    secret:
      name: gitlab-ci-token       # the Secret our operator writes
  secretStoreRefs:
    - name: vault
      kind: ClusterSecretStore
  data:
    - match:
        secretKey: token
        remoteRef:
          remoteKey: secret/gitlab/ci-token

Push to a webhook

ESO has a webhook provider. Configure a SecretStore with provider: webhook, point a PushSecret at it, and ESO POSTs the secret value on change.

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: rotation-webhook
spec:
  provider:
    webhook:
      url: "https://my-endpoint.example.com/rotated"
      method: POST
      headers:
        Content-Type: application/json
      body: |
        {"token": "{{ .token }}"}
---
apiVersion: external-secrets.io/v1beta1
kind: PushSecret
metadata:
  name: gitlab-ci-token-webhook
spec:
  selector:
    secret:
      name: gitlab-ci-token
  secretStoreRefs:
    - name: rotation-webhook
  data:
    - match:
        secretKey: token
        remoteRef:
          remoteKey: token

Why not a native webhook field on the CR?

ESO's webhook provider solves the problem — auth, TLS, body templating, retries — better than we would. See Resolutions to open questions §3.