This chart vendors the upstream Bitnami Sealed Secrets controller (as a Helm dependency) and optionally provisions global platform secrets that can be consumed by multiple applications across environments.
It is intended to be deployed via the Argo CD App‑of‑Apps pattern (root application enables or disables this chart). Application‑specific secrets belong in each application chart/repo; only cross‑cutting or organization‑wide credentials should live here.
sealed-secrets alias sealedsecrets)globalExampleSecret) enabled per environmentvalues.dev-01.yaml, values.stag-01.yaml, etc.)| Location | Use Case | |———-|———-| | This chart (global) | Shared certs, platform API tokens, object storage creds used by multiple charts/services | | Individual app chart | Secret only one workload uses (e.g., service specific API key) |
globalExampleSecret:
enabled: true # Toggle rendering of the demo global sealed secret
name: my-global-secret # Name of the resulting Secret after unsealing
namespace: my-namespace # Target namespace for the unsealed Secret
The template templates/sealed-my-global-secret.yaml renders only when globalExampleSecret.enabled: true.
To add more global secrets, replicate the pattern with additional templated SealedSecrets or extend the existing structure (data.*).
The root Argo CD app defines an Application pointing at charts/sealed-secrets. Syncing that application installs the controller CRDs (if not already present) and any enabled global sealed secrets.
Manual Helm install (for local testing):
helm dependency update ./sealed-secrets
helm upgrade --install sealed-secrets ./sealed-secrets -n sealed-secrets --create-namespace -f sealed-secrets/values.dev-01.yaml
By default, the controller will generate an ephemeral key pair. For portability (e.g., disaster recovery, identical dev/stage/prod behavior) you should pre‑create and label a key so future rotations are controlled.
mkdir -p sealing-key && cd sealing-key
openssl req -x509 -days 3650 -nodes -newkey rsa:4096 \
-keyout platform-sealing.key \
-out platform-sealing.crt \
-subj "/CN=sealed-secret/O=sealed-secret"
kubectl -n sealed-secrets create secret tls platform-sealing-key \
--cert=platform-sealing.crt --key=platform-sealing.key
kubectl -n sealed-secrets label secret platform-sealing-key \
sealedsecrets.bitnami.com/sealed-secrets-key=active
The controller will use the secret labeled active for sealing/unsealing. Keep the private key safe (store in a secure vault / backup system).
Securely archive platform-sealing.key and platform-sealing.crt (e.g., encrypted storage, KMS‑backed secrets manager). Without the private key you cannot decrypt previously sealed secrets.
Create a new key pair, label it active, remove label from old key. Reseal secrets if rotation policy demands.
my-secret.yaml) WITHOUT committing it to Git.kubeseal --cert platform-sealing.crt --scope cluster-wide --format yaml < my-secret.yaml > sealed-my-secret.yaml
sealed-my-secret.yaml.Scopes you can use:
--scope cluster-wide (default here; secret usable in any namespace)--scope namespace-wide --namespace <ns>--scope strict --name <name> --namespace <ns> (most restrictive)Choose the narrowest scope that fits your use case.
Duplicate the template with a guard:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name:
namespace:
spec:
encryptedData:
key:
template:
type: Opaque
Populate encrypted values in environment overrides.
Secret objects containing plaintext data.| Symptom | Cause | Action |
|———|——-|——–|
| Secret not created | Wrong scope vs target namespace | Reseal with correct scope |
| Decryption failed | Wrong controller key (rotated / missing) | Restore original key or reseal with new cert |
| Multiple keys active | Label conflict | Ensure only one secret has sealed-secrets-key=active |
Internal use unless stated otherwise.