Mengelola secret dari sistem eksternal dengan External Secrets Operator: arsitektur SecretStore dan ExternalSecret, integrasi AWS Secrets Manager, Vault, hingga 1Password, sinkronisasi lewat FluxCD, dan praktik terbaik rotasi serta audit secret.

Di episode 20 kalian sudah mengenkripsi secret dengan SOPS sehingga bisa di-commit ke Git. Namun ada keterbatasan: kunci privat tetap harus ada di setiap cluster, dan rotasi otomatis tidak built-in — kalau secret berubah di sistem sumber, SOPS tidak tahu. Di sinilah pendekatan yang berbeda: simpan secret di sistem terkelola eksternal, dan biarkan operator menariknya ke cluster.
Episode ini membahas External Secrets Operator (ESO): arsitektur dan CRD-nya, integrasi dengan backend populer seperti AWS Secrets Manager dan HashiCorp Vault, cara mengintegrasikannya dengan Flux, serta praktik terbaik untuk siklus hidup secret.
ESO adalah sebuah controller di dalam cluster yang bekerja berdasarkan keinginan (desired state) yang dideklarasikan lewat CRD. Alurnya:
Yang menarik untuk GitOps: manifest yang masuk Git hanya berisi referensi dan konfigurasi, bukan nilai rahasia. Nilai sebenarnya hidup di backend eksternal dan tidak pernah ada di repo.
| CRD | Scope | Fungsi |
|---|---|---|
| SecretStore | Namespace | Koneksi ke backend, hanya berlaku dalam satu namespace |
| ClusterSecretStore | Cluster | Koneksi ke backend, bisa dipakai semua namespace |
| ExternalSecret | Namespace | Menarik nilai dari store dan membentuk Secret |
ESO mendukung banyak backend. Pemilihan biasanya mengikuti tempat organisasi sudah menyimpan rahasianya.
| Backend | Cocok untuk | Catatan |
|---|---|---|
| AWS Secrets Manager | Tim AWS | Rotasi terkelola, harga per secret |
| AWS Parameter Store | Tim AWS | Murah, bagus untuk konfigurasi non-rahasia |
| GCP Secret Manager | Tim GCP | Workload Identity |
| Azure Key Vault | Tim Azure | Managed identity |
| HashiCorp Vault | Multi-cloud | Kunci, dynamic secrets, audit lengkap |
| 1Password | Tim kecil | Simpel, akun tim |
Contoh ClusterSecretStore ke AWS Secrets Manager dengan kredensial dari Secret:
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: aws-secrets-manager
spec:
provider:
aws:
service: SecretsManager
region: ap-southeast-1
auth:
secretRef:
accessKeyIDSecretRef:
name: aws-eso-creds
key: access-key
secretAccessKeySecretRef:
name: aws-eso-creds
key: secret-access-keyTip
Di AWS gunakan IAM Roles for Service Accounts alih-alih access key: controller cukup diberi peran IAM dengan izin secretsmanager:GetSecretValue, sehingga tidak ada kredensial statis yang disimpan di cluster.
Setelah store tersedia, deklarasikan secret yang ingin dibentuk. Nilai diambil dari backend per key dan dipetakan ke data Secret:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: api-db
namespace: apps
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: api-db
creationPolicy: Owner
data:
- secretKey: DB_PASSWORD
remoteRef:
key: prod/api/db
property: password
- secretKey: DB_USER
remoteRef:
key: prod/api/db
property: usernamerefreshInterval: 1h membuat controller menarik nilai terbaru dari backend secara berkala — rotasi di backend akan tersinkron ke cluster tanpa intervensi. Periksa statusnya dengan kubectl get externalsecrets -n apps dan lihat kolom SYNCED.
Tidak ada yang istimewa secara teknis — justru itulah keuntungannya. ESO sendiri diinstal lewat HelmRelease, dan semua CRD-nya (ClusterSecretStore, ExternalSecret, termasuk Secret kredensial yang bisa dienkripsi SOPS) dideklarasikan di Git dan disinkronkan Flux:
external-secrets dideklarasikan di Git bersama HelmRepository-nya.dependsOn di Kustomization — pastikan CRD ESO dan store sudah siap sebelum aplikasi. Gunakan initContainer atau readiness probe bila aplikasi gagal karena secret belum ada.creationPolicy: Owner agar Secret ikut terhapus saat ExternalSecret dihapus, dan deletionPolicy yang sesuai untuk menghindari secret yatim.refreshInterval atau event backend; perbarui secret tanpa memodifikasi Git.Episode ini memperkenalkan pendekatan kedua dalam manajemen secret: daripada menyimpan ciphertext di Git seperti SOPS, ESO menyimpan secret di sistem eksternal dan membuat Kubernetes Secret secara otomatis. Flux mengelola konfigurasinya, ESO mengelola nilainya, dan tidak ada rahasia yang menetap di repo.
Inti yang harus dibawa pulang:
refreshInterval menyinkronkan perubahan backend ke cluster.ESO ideal bila secret sudah ada di sistem terkelola. Tapi tidak semua tim punya Vault atau AWS. Di episode 22 selanjutnya kita belajar Sealed Secrets — alternatif ringan yang tetap memakai Git sebagai tempat penyimpanan secret, dengan enkripsi berbasis kunci publik-privat Bitnami. Sampai jumpa di episode 22!