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.