Managing External Secrets

1. Installing External Secrets Operator

helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
  -n external-secrets --create-namespace --set installCRDs=true

2. Creating SecretStore

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata: { name: aws-sm, namespace: prod }
spec:
  provider:
    aws:
      service: SecretsManager
      region: us-east-1
      auth: { jwt: { serviceAccountRef: { name: esa-sa } } }

3. Creating ClusterSecretStore

ScopeUse
SecretStoreNamespace-scoped
ClusterSecretStoreReusable across all namespaces

4. Creating ExternalSecret Resource

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata: { name: db, namespace: prod }
spec:
  refreshInterval: 1h
  secretStoreRef: { name: aws-sm, kind: SecretStore }
  target: { name: db-secret, creationPolicy: Owner }
  data:
  - secretKey: password
    remoteRef: { key: prod/db, property: password }

5. Syncing Secrets Automatically

FieldDetail
refreshIntervale.g., 1h, 15m; 0 disables
creationPolicyOwner / Merge / None
deletionPolicyDelete / Retain / Merge

6. Using Secret Templates

target:
  template:
    type: kubernetes.io/dockerconfigjson
    data:
      .dockerconfigjson: |
        { "auths": { "registry.io": { "auth": "{{ .auth | b64enc }}" }}}

7. Configuring Secret Keys

dataFrom:
- extract: { key: prod/db }   # all keys from secret
- find:    { name: { regexp: "^prod/.*" } }

8. Rotating Secrets

MethodDetail
refreshIntervalPeriodic pull from provider
Provider eventStakater Reloader restarts pods on Secret change

9. Configuring Data Transformation

Template FuncUse
b64enc / b64decBase64 encode/decode
toStringJSON to string
fromJsonParse JSON value

10. Troubleshooting Secret Sync

SymptomCause
SecretSyncErrorIAM permissions / missing key
No updatesrefreshInterval = 0
x509 errorsProvider CA bundle outdated