Mengamankan secret langsung di Git dengan Bitnami Sealed Secrets: enkripsi kunci publik-privat, instalasi controller dan kubeseal, alur GitOps dengan FluxCD, hingga backup dan rotasi sertifikat untuk skenario multi-cluster.

Di episode 21 kalian sudah belajar External Secrets Operator — secret disimpan di backend eksternal dan dirujuk dari Git. Namun tidak semua tim punya Vault atau AWS, dan ada kalanya Git sendiri justru menjadi media yang paling praktis: secret kecil, tim kecil, atau constraint organisasi. Untuk skenario ini ada alternatif yang lebih sederhana dari SOPS: Sealed Secrets.
Episode ini membahas Sealed Secrets dari Bitnami: bagaimana enkripsi kunci publik-privat bekerja, instalasi controller dan kubeseal, alur penggunaannya bersama FluxCD, serta manajemen kunci untuk backup, rotasi, dan multi-cluster.
Sealed Secrets memakai ide yang elegan: Anda "menyegel" (seal) sebuah Kubernetes Secret menjadi SealedSecret yang hanya bisa dibuka oleh cluster tertentu. Yang membuka bukan manusia, melainkan controller.
Perbedaan dengan SOPS (episode 20) dan ESO (episode 21) perlu ditegaskan:
| Aspek | SOPS | ESO | Sealed Secrets |
|---|---|---|---|
| Tempat secret | Git (ciphertext) | Backend eksternal | Git (SealedSecret) |
| Kunci di cluster | Perlu (age/gpg/KMS) | Kredensial backend | Satu pasang kunci controller |
| Rotasi otomatis | Tidak | Ya | Tidak |
| Kompleksitas | Sedang | Tinggi | Rendah |
Controller diinstal lewat Helm chart resmi sealed-secrets dari Bitnami Labs. Sebagai aplikasi Kubernetes biasa, chart dideklarasikan sebagai HelmRepository dan HelmRelease agar Flux yang memasangnya:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: sealed-secrets
namespace: flux-system
spec:
interval: 10m
url: https://bitnami-labs.github.io/sealed-secrets
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: sealed-secrets
namespace: flux-system
spec:
interval: 10m
chart:
spec:
chart: sealed-secrets
sourceRef:
kind: HelmRepository
name: sealed-secrets
targetNamespace: sealed-secrets
install:
createNamespace: trueSaat pertama kali jalan, controller membuat Secret sealed-secrets-key yang berisi kunci privat. Kunci privat ini tidak pernah keluar cluster — hanya kunci publik yang dibagikan untuk proses sealing. Cek status controller dengan kubectl get pods -n sealed-secrets.
Kubeseal adalah CLI untuk menyegel secret. Untuk mode online, kubeseal bicara langsung ke controller dan mengambil kunci publik:
kubeseal --version
kubeseal --controller-namespace sealed-secrets \
--controller-name sealed-secrets \
--fetch-cert > public-cert.pem--fetch-cert mengunduh kunci publik sebagai sertifikat. Simpan public-cert.pem di repo atau bagikan ke CI agar tim bisa melakukan sealing tanpa akses langsung ke cluster (mode offline). Sertifikat ini publik — bukan rahasia.
Buat Secret biasa (lokal, tanpa menerapkannya ke cluster), lalu seal dengan kubeseal:
kubectl create secret generic api-db \
--namespace apps \
--from-literal=DB_PASSWORD=sup3rsecret \
--dry-run=client -o yaml > secret.yaml
kubeseal --format yaml < secret.yaml > sealed-secret.yamlHasilnya adalah manifest SealedSecret — perhatikan nilai DB_PASSWORD sudah berupa blok AgBy3i4O... terenkripsi:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: api-db
namespace: apps
annotations:
sealedsecrets.bitnami.com/namespace-wide: "true"
spec:
encryptedData:
DB_PASSWORD: AgBy3i4OcX4j...
template:
metadata:
name: api-db
namespace: apps
type: OpaqueCommit sealed-secret.yaml ke Git seperti biasa. Flux menarik manifest, menerapkan SealedSecret ke cluster, dan controller mendekripsinya menjadi Secret api-db yang dipakai aplikasi. Tidak ada langkah manual pasca-commit.
Important
SealedSecret mengikat ke nama dan namespace secara default. Gunakan scope namespace-wide atau cluster-wide bila secret akan dipakai dengan nama lain atau di namespace berbeda, agar tidak gagal saat nama berubah.
Siklus lengkapnya menjadi: developer membuat Secret sementara, menyegelnya, commit SealedSecret, review lewat pull request, Flux menerapkan, controller membuka, aplikasi membaca. Seluruh nilai rahasia yang pernah dibuat bisa dihilangkan setelah sealing — jangan simpan file secret.yaml mentah di disk atau Git.
sealed-secrets-key ke tempat aman (misal dienkripsi SOPS atau Vault). Kehilangan kunci privat berarti seluruh SealedSecret tidak bisa dibuka lagi.Backup kunci dengan:
kubectl get secret sealed-secrets-key -n sealed-secrets \
-o yaml > sealed-secrets-key-backup.yaml
kubectl apply -f sealed-secrets-key-backup.yaml -n sealed-secretsEpisode ini melengkapi rangkaian manajemen secret: SOPS untuk enkripsi field, ESO untuk backend eksternal, dan Sealed Secrets untuk enkripsi berbasis cluster yang tetap menaruh secret di Git. Dengan Sealed Secrets, developer bisa menulis secret ke Git tanpa takut bocor, dan Flux tetap menjadi satu-satunya jalur untuk menerapkan konfigurasi.
Inti yang harus dibawa pulang:
sealed-secrets-key, semua secret tidak bisa dibuka.Kita sekarang bisa mengamankan secret di satu cluster. Tapi organisasi nyata punya banyak cluster — staging, produksi, per region. Di episode 23 selanjutnya kita belajar Multi-Cluster Management: strategi cluster, bootstrap banyak cluster dengan Flux, dependency lintas cluster, hingga integrasi Cluster API dan vcluster. Sampai jumpa di episode 23!