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
| Scope | Use |
| SecretStore | Namespace-scoped |
| ClusterSecretStore | Reusable 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
| Field | Detail |
| refreshInterval | e.g., 1h, 15m; 0 disables |
| creationPolicy | Owner / Merge / None |
| deletionPolicy | Delete / 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
| Method | Detail |
| refreshInterval | Periodic pull from provider |
| Provider event | Stakater Reloader restarts pods on Secret change |
| Template Func | Use |
b64enc / b64dec | Base64 encode/decode |
toString | JSON to string |
fromJson | Parse JSON value |
10. Troubleshooting Secret Sync
| Symptom | Cause |
| SecretSyncError | IAM permissions / missing key |
| No updates | refreshInterval = 0 |
| x509 errors | Provider CA bundle outdated |