DEV Community

Cover image for 🎯 Scenario #13 β€” Encrypt Secrets Using Sealed Secrets (Bitnami) in Kubernetes
Latchu@DevOps
Latchu@DevOps

Posted on

🎯 Scenario #13 β€” Encrypt Secrets Using Sealed Secrets (Bitnami) in Kubernetes

This is a must-know skill for DevOps, GitOps, ArgoCD, Flux, and secure CI/CD workflows.

You will learn to:

βœ… Install Sealed Secrets controller
βœ… Create a Kubernetes Secret
βœ… Encrypt it into a SealedSecret (safe to commit to Git)
βœ… Apply the encrypted object
βœ… Verify the controller decrypts it back into a real Secret

Sealed Secrets = Git-safe encrypted secrets.


⚠️ Requirements

This scenario requires:

  • Any Kubernetes cluster (GKE, EKS, AKS, Minikube)
  • Access to install CRDs (cluster-admin recommended)

βœ… Step 1 β€” Install the Sealed Secrets Controller (on Cluster)

Install using Helm (recommended):

helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets-controller sealed-secrets/sealed-secrets \
  --namespace kube-system
Enter fullscreen mode Exit fullscreen mode

Verify:

kubectl -n kube-system get pods | grep sealed-secrets
Enter fullscreen mode Exit fullscreen mode

You should see:

sealed-secrets-controller-xxxxx   Running
Enter fullscreen mode Exit fullscreen mode

1


βœ… Step 2 β€” Install kubeseal CLI (local machine / Cloud Shell)

For Cloud Shell or Linux:

curl -L -O https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.32.2/kubeseal-0.32.2-linux-amd64.tar.gz
tar -xzvf kubeseal-0.32.2-linux-amd64.tar.gz kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
Enter fullscreen mode Exit fullscreen mode

Verify:

kubeseal --version
Enter fullscreen mode Exit fullscreen mode

2


βœ… Step 3 β€” Create a Secret (DO NOT APPLY)

Create a file:

#mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
  namespace: default
type: Opaque
data:
  username: YWRtaW4=
  password: U2VjdXJlMTIzIQ==
Enter fullscreen mode Exit fullscreen mode

This YAML contains sensitive base64 values β†’ NEVER commit this.

Now we will encrypt it.


βœ… Step 4 β€” Encrypt Secret into SealedSecret

Run:

kubeseal --controller-namespace kube-system --format yaml \
  < mysecret.yaml > mysealedsecret.yaml
Enter fullscreen mode Exit fullscreen mode

Check output:

cat mysealedsecret.yaml
Enter fullscreen mode Exit fullscreen mode

You will see something like:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: db-credentials
  namespace: default
spec:
  encryptedData:
    password: AgDY72jkLJ8z...
    username: AgJ80QKlhxn...
Enter fullscreen mode Exit fullscreen mode

βœ” Safe to store in Git
βœ” Only decryptable by the controller running in your cluster

!3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mznguimzz4132dcpc76l.png)


βœ… Step 5 β€” Apply the SealedSecret

kubectl apply -f mysealedsecret.yaml
Enter fullscreen mode Exit fullscreen mode

The controller will automatically:

  • Decrypt the sealed data
  • Create the real Kubernetes Secret

Verify:

kubectl get secret db-credentials
Enter fullscreen mode Exit fullscreen mode

You will see:

db-credentials   Opaque   2      5s
Enter fullscreen mode Exit fullscreen mode

4


βœ… Step 6 β€” Check Decrypted Secret Values

Run:

kubectl get secret db-credentials -o jsonpath='{.data.username}' | base64 -d
Enter fullscreen mode Exit fullscreen mode

Output:

admin
Enter fullscreen mode Exit fullscreen mode

Check password:

kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -d
Enter fullscreen mode Exit fullscreen mode

Output:

Secure123!
Enter fullscreen mode Exit fullscreen mode

βœ” Decrypted successfully
βœ” Exactly what you defined
βœ” But the secret in Git is encrypted

5


🌟 Thanks for reading! If this post added value, a like ❀️, follow, or share would encourage me to keep creating more content.


β€” Latchu | Senior DevOps & Cloud Engineer

☁️ AWS | GCP | ☸️ Kubernetes | πŸ” Security | ⚑ Automation
πŸ“Œ Sharing hands-on guides, best practices & real-world cloud solutions

Top comments (0)