Operator Pattern #
Kubernetes sudah tahu cara mengelola aplikasi stateless dengan baik — rolling update, scaling, self-healing. Tapi untuk stateful application seperti database, message broker, atau monitoring stack, operasi seperti backup, failover, atau rolling upgrade memerlukan pengetahuan domain yang dalam. Operator Pattern adalah cara mengkodekan pengetahuan operasional tersebut ke dalam Kubernetes controller, sehingga kompleksitas operasional bisa dikelola secara otomatis oleh software.
Masalah yang Diselesaikan Operator #
Mengelola PostgreSQL di Kubernetes tanpa Operator:
→ Buat StatefulSet, Service, PVC secara manual
→ Konfigurasi primary-replica secara manual
→ Backup scheduled via CronJob yang di-maintain sendiri
→ Failover: deteksi manual, intervensi manual
→ Upgrade versi: prosedur panjang yang rentan error
→ Scale up replica: konfigurasi ulang replication secara manual
Mengelola PostgreSQL dengan CloudNativePG Operator:
kubectl apply -f postgres-cluster.yaml
→ Operator handle provisioning, replication, backup, failover, upgrade
→ Operator "tahu" cara mengelola PostgreSQL dengan benar
Komponen Operator: CRD dan Controller #
Operator terdiri dari dua bagian:
Custom Resource Definition (CRD) — mendefinisikan resource type baru di Kubernetes API. Setelah CRD terdaftar, kamu bisa buat resource dengan kind yang sebelumnya tidak ada.
Custom Controller — program yang watch resource tersebut dan mengambil tindakan untuk memastikan actual state sesuai desired state.
# CRD mendefinisikan resource baru: PostgresCluster
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: postgresclusters.postgresql.cnpg.io
spec:
group: postgresql.cnpg.io
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
instances:
type: integer
imageName:
type: string
scope: Namespaced
names:
plural: postgresclusters
singular: postgrescluster
kind: PostgresCluster
# Setelah CRD terdaftar, resource baru bisa dibuat
apiVersion: postgresql.cnpg.io/v1
kind: PostgresCluster # ← custom resource, bukan resource bawaan
metadata:
name: db-cluster
spec:
instances: 3
imageName: ghcr.io/cloudnative-pg/postgresql:16.1
storage:
size: 100Gi
backup:
barmanObjectStore:
destinationPath: s3://my-backup-bucket/postgres
s3Credentials:
accessKeyId:
name: aws-creds
key: ACCESS_KEY_ID
Reconciliation Loop #
Inti dari setiap Controller (dan Operator) adalah reconciliation loop:
Reconciliation Loop:
1. Watch: controller subscribe ke perubahan resource (CRD, Deployment, dll)
2. Event masuk:
→ Resource dibuat/diupdate/dihapus
→ Related resource berubah (misalnya Pod yang dimiliki mati)
→ Periodic re-sync (untuk mendeteksi drift)
3. Reconcile dipanggil:
→ Baca desired state (dari spec resource)
→ Baca actual state (dari cluster dan external system)
→ Hitung perbedaan (diff)
→ Ambil tindakan untuk membuat actual = desired
→ Update status resource
4. Kembali ke langkah 1
Prinsip: reconcile harus idempotent
→ Memanggil reconcile berkali-kali dengan input yang sama
harus menghasilkan state yang sama
→ Tidak ada "create once" logic yang akan break jika dipanggil ulang
Contoh Operator Populer #
Prometheus Operator #
Memungkinkan konfigurasi Prometheus dan Alertmanager via CRD Kubernetes-native:
# Prometheus — didefinisikan sebagai custom resource
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: main
namespace: monitoring
spec:
replicas: 2
serviceMonitorSelector: # pilih ServiceMonitor yang di-scrape
matchLabels:
release: prometheus
ruleSelector:
matchLabels:
role: alert-rules
retention: 15d
storage:
volumeClaimTemplate:
spec:
resources:
requests:
storage: 50Gi
Cert-Manager #
Otomasi provisioning dan renewal TLS certificate dari Let’s Encrypt atau CA internal:
# Certificate — didefinisikan sebagai custom resource
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: api-tls
namespace: production
spec:
secretName: api-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- api.example.com
- www.api.example.com
# Cert-Manager otomatis: request certificate, simpan ke Secret,
# dan renew sebelum expired (biasanya 30 hari sebelum expiry)
Strimzi (Kafka Operator) #
Mengelola seluruh lifecycle cluster Apache Kafka:
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.6.0
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
config:
offsets.topic.replication.factor: 3
storage:
type: persistent-claim
size: 100Gi
zookeeper:
replicas: 3
storage:
type: persistent-claim
size: 10Gi
Menemukan Operator yang Ada #
# OperatorHub.io — katalog Operator komunitas
# https://operatorhub.io/
# ArtifactHub — termasuk Helm charts dan Operator
# https://artifacthub.io/
# Install Operator via OLM (Operator Lifecycle Manager)
kubectl apply -f https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.27.0/crds.yaml
kubectl apply -f https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.27.0/olm.yaml
# Atau install langsung via manifest/Helm
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
Kapan Menulis Operator Sendiri? #
Tulis Operator sendiri jika:
✓ Punya stateful application internal yang operasinya kompleks
✓ Ada operasi yang harus dilakukan secara reaktif terhadap perubahan state
✓ Tim harus mengelola lifecycle aplikasi ini di banyak cluster/namespace
✓ Ada kebutuhan spesifik yang tidak dipenuhi Operator yang sudah ada
Jangan tulis Operator jika:
✗ Cukup dengan Helm + CronJob + dokumentasi operasional
✗ Ada Operator yang sudah matang untuk use case kamu
✗ Tim tidak punya kapasitas untuk maintain custom controller
✗ Kebutuhan masih bisa diselesaikan dengan resource Kubernetes standar
Tools untuk menulis Operator:
Kubebuilder — Go, paling banyak digunakan, scaffolding yang lengkap
Operator SDK — Go/Ansible/Helm, dari Red Hat, punya OLM integration
kopf — Python, lebih mudah untuk yang tidak familiar Go
controller-runtime — library Go dasar yang digunakan Kubebuilder
Ringkasan #
- Operator = CRD + Controller — CRD mendefinisikan resource baru (PostgresCluster, Kafka, Certificate); Controller watch resource tersebut dan reconcile actual state ke desired state.
- Reconciliation loop harus idempotent — memanggil reconcile berkali-kali harus aman; tidak ada operasi “sekali jalan” yang tidak bisa di-ulangi.
- Operator cocok untuk stateful application — database, message broker, monitoring stack punya operasional yang kompleks (backup, failover, upgrade); Operator mengkodekan pengetahuan ini.
- Cari di OperatorHub sebelum tulis sendiri — komunitas sudah membangun Operator untuk sebagian besar use case umum (PostgreSQL, MySQL, Kafka, Redis, Prometheus, Cert-Manager).
- Cert-Manager adalah Operator yang hampir universal — provisioning dan renewal TLS certificate otomatis; hampir semua cluster production seharusnya menggunakannya.
- Kubebuilder untuk Go, kopf untuk Python — jika perlu menulis Operator sendiri, pilih SDK sesuai kemampuan tim; Kubebuilder paling populer dan punya scaffolding terlengkap.
← Sebelumnya: Local Development Tools Berikutnya: Managed Kubernetes →