Belajar GitOps - FluxCD - Sealed Secrets
Episode 22 of 36

Belajar GitOps - FluxCD - Sealed Secrets

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.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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.

Apa itu Sealed Secrets

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.

  • Public/private key encryption: cluster memiliki pasangan kunci — kunci privat disimpan controller, kunci publik disebarkan ke pengguna.
  • Controller-based decryption: controller membaca SealedSecret, mendekripsinya dengan kunci privat, lalu membuat Secret native.
  • Git-native: SealedSecret aman di-commit karena isinya ciphertext; cluster GitOps tetap bisa menerapkan manifest secara seragam.

Perbedaan dengan SOPS (episode 20) dan ESO (episode 21) perlu ditegaskan:

AspekSOPSESOSealed Secrets
Tempat secretGit (ciphertext)Backend eksternalGit (SealedSecret)
Kunci di clusterPerlu (age/gpg/KMS)Kredensial backendSatu pasang kunci controller
Rotasi otomatisTidakYaTidak
KompleksitasSedangTinggiRendah

Instalasi Controller dan Kubeseal

Controller Sealed Secrets

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:

clusters/prod/flux-system/sealed-secrets.yaml
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: true

Saat 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 CLI

Kubeseal adalah CLI untuk menyegel secret. Untuk mode online, kubeseal bicara langsung ke controller dan mengambil kunci publik:

Instal kubeseal dan ambil sertifikat
kubeseal --version
kubeseal --controller-namespace sealed-secrets \
  --controller-name sealed-secrets \
  --fetch-cert > public-cert.pem

Manajemen Sertifikat

--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.

Penggunaan dengan Flux

Menyegel Secret

Buat Secret biasa (lokal, tanpa menerapkannya ke cluster), lalu seal dengan kubeseal:

Menyegel secret
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.yaml

Hasilnya adalah manifest SealedSecret — perhatikan nilai DB_PASSWORD sudah berupa blok AgBy3i4O... terenkripsi:

clusters/prod/apps/sealedsecret.yaml
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: Opaque

Commit dan Automatic Unsealing

Commit 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.

Alur GitOps Workflow

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.

Manajemen Kunci

  • Backup sertifikat: backup Secret sealed-secrets-key ke tempat aman (misal dienkripsi SOPS atau Vault). Kehilangan kunci privat berarti seluruh SealedSecret tidak bisa dibuka lagi.
  • Rotasi kunci: hapus secret kunci dan restart controller untuk membuat pasangan baru, lalu seal ulang semua secret. Karena mengganggu, lakukan secara terencana.
  • Multi-cluster: tiap cluster punya pasangan kunci sendiri — SealedSecret untuk cluster A tidak bisa dibuka di cluster B. Bila ingin satu SealedSecret berlaku di banyak cluster, restore secret kunci yang sama ke semua cluster; bila ingin isolasi, biarkan tiap cluster independen.

Backup kunci dengan:

Backup dan restore kunci
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-secrets

Penutup

Episode 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:

  • Kunci privat di controller, publik di pengguna: sealing tidak butuh kunci privat.
  • Git sebagai rumah secret: SealedSecret aman di-commit, tidak seperti Secret biasa.
  • Integrasi Flux mulus: controller diinstal lewat HelmRelease, SealedSecret diterapkan Flux, unsealing otomatis.
  • Backup kunci wajib: tanpa sealed-secrets-key, semua secret tidak bisa dibuka.
  • Pahami scope: binding default per nama dan namespace, atur scope sesuai kebutuhan.

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!

Belajar GitOps - FluxCD - Sealed Secrets | Belajar FluxCD & GitOps