Cloud Expert
Kubernetes Operators — Writing a Custom Operator¶
KubernetesOperatorsGoController 6 min read
Developing a Kubernetes operator with the Operator SDK. Reconciliation loop, finalizers and status management.
Operator Pattern¶
Operator = CRD + Controller. Codifies operational knowledge into software.
- CRD — defines desired state
- Controller — reconciles actual to desired state
- Reconciliation loop — observe → diff → act
Scaffolding¶
operator-sdk init --domain example.com --repo github.com/org/db-operator
operator-sdk create api --group database --version v1 --kind Database --resource --controller
# Struktura
├── api/v1/
│ └── database_types.go
├── controllers/
│ └── database_controller.go
├── config/
│ ├── crd/
│ ├── rbac/
│ └── manager/
└── main.go
Reconciliation Loop¶
func (r *DatabaseReconciler) Reconcile(ctx context.Context,
req ctrl.Request) (ctrl.Result, error) {
db := &databasev1.Database{}
if err := r.Get(ctx, req.NamespacedName, db); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// Create StatefulSet if not exists
sts := &appsv1.StatefulSet{}
err := r.Get(ctx, types.NamespacedName{
Name: db.Name, Namespace: db.Namespace,
}, sts)
if errors.IsNotFound(err) {
sts = r.constructStatefulSet(db)
if err := r.Create(ctx, sts); err != nil {
return ctrl.Result{}, err
}
}
// Update status
db.Status.Ready = sts.Status.ReadyReplicas == *sts.Spec.Replicas
r.Status().Update(ctx, db)
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
}
Finalizers¶
const dbFinalizer = "database.example.com/finalizer"
if !db.DeletionTimestamp.IsZero() {
if controllerutil.ContainsFinalizer(db, dbFinalizer) {
// Cleanup
r.dropDatabase(ctx, db)
controllerutil.RemoveFinalizer(db, dbFinalizer)
r.Update(ctx, db)
}
return ctrl.Result{}, nil
}
Summary¶
Kubernetes operators codify operational knowledge into code. Reconciliation loop, finalizers and status management are the fundamental building blocks.
Need Help with Implementation?¶
Our team has experience designing and implementing modern architectures. We’re happy to help.