Přeskočit na obsah
_CORE
AI & Agentic Systems Core Informační Systémy Cloud & Platform Engineering Data Platforma & Integrace Security & Compliance QA, Testing & Observability IoT, Automatizace & Robotika Mobile & Digital Banky & Finance Pojišťovnictví Veřejná správa Obrana & Bezpečnost Zdravotnictví Energetika & Utility Telco & Média Průmysl & Výroba Logistika & E-commerce Retail & Loyalty
Reference Technologie Blog Knowledge Base O nás Spolupráce Kariéra
Pojďme to probrat

Kubernetes Operators — Vývoj Vlastního Operátoru

01. 01. 2024 1 min čtení intermediate

Cloud Expert

Kubernetes Operators — Vývoj Vlastního Operátoru

KubernetesOperatorsGoController 6 min čtení

Vývoj Kubernetes operátoru s Operator SDK. Reconciliation loop, finalizers a status management.

Operator Pattern

Operator = CRD + Controller. Kodifikuje operační znalosti do softwaru.

  • CRD — definuje desired state
  • Controller — reconciluje actual na 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
}

Shrnutí

Kubernetes operátory kodifikují operační znalosti do kódu. Reconciliation loop, finalizers a status management jsou základní stavební kameny.

Potřebujete pomoct s implementací?

Náš tým má zkušenosti s návrhem a implementací moderních architektur. Rádi vám pomůžeme.

Nezávazná konzultace