Skip to content
_CORE
AI & Agentic Systems Core Information Systems Cloud & Platform Engineering Data Platform & Integration Security & Compliance QA, Testing & Observability IoT, Automation & Robotics Mobile & Digital Banking & Finance Insurance Public Administration Defense & Security Healthcare Energy & Utilities Telco & Media Manufacturing Logistics & E-commerce Retail & Loyalty
References Technologies Blog Know-how Tools
About Collaboration Careers
CS EN DE
Let's talk

Kubernetes Operators — Writing a Custom Operator

25. 12. 2022 Updated: 24. 03. 2026 1 min read intermediate
This article was published in 2022. Some information may be outdated.

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.

Free Consultation

Share:

CORE SYSTEMS team

We build core systems and AI agents that keep operations running. 15 years of experience with enterprise IT.