Skip to content

Reconciler

Controller logic is implemented in terms of Reconcilers (pkg/reconcile). A Reconciler implements a function which takes a reconcile Request containing the name and namespace of the object to reconcile, reconciles the object, and returns a Response or an error indicating whether to requeue for a second round of processing.

As you can see in the diagram above, a Reconciler is part of a Controller. A Controller has a function to watch changes of the target resources, put change events into the queue, and call Reconcile function with an queue item, and requeue the item if necessary.

Types

Reconciler Interface

type Reconciler interface {
    // Reconcile performs a full reconciliation for the object referred to by the Request.
    // The Controller will requeue the Request to be processed again if an error is non-nil or
    // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
    Reconcile(context.Context, Request) (Result, error)
}

Request

type Request struct {
    // NamespacedName is the name and namespace of the object to reconcile.
    types.NamespacedName
}

Result

type Result struct {
    // Requeue tells the Controller to requeue the reconcile key.  Defaults to false.
    Requeue bool

    // RequeueAfter if greater than 0, tells the Controller to requeue the reconcile key after the Duration.
    // Implies that Requeue is true, there is no need to set Requeue to true at the same time as RequeueAfter.
    RequeueAfter time.Duration
}

Implement

You can use either implementation of the Reconciler interface: 1. a reconciler struct with Reconcile function. 1. a reconcile.Func, which implements Reconciler interface:

type Func func(context.Context, Request) (Result, error)

(Controller also implements Reconciler interface. The reconciler passed to builder is used inside the controller's Reconcile function.)

How reconciler is used

Reconciler is passed to Controller builder when initializing controller (you can also check it in Manager):

ctrl.NewControllerManagedBy(mgr). // returns controller Builder
    For(&corev1.Pod{}). // defines the type of Object being reconciled
    Complete(podReconciler) // Complete builds the Application controller, and return error