<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Object Reconciler on Component Operator Runtime</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/</link><description>Recent content in Object Reconciler on Component Operator Runtime</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/overview/</guid><description>&lt;p&gt;This page introduces the main type of package &lt;code&gt;pkg/reconciler&lt;/code&gt; and the methods used
to drive it.&lt;/p&gt;
&lt;h2 id="the-reconciler-type"&gt;The &lt;code&gt;Reconciler&lt;/code&gt; type&lt;a class="td-heading-self-link" href="#the-reconciler-type" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Reconciler&lt;/code&gt; manages a set of specified objects in a given target cluster. It is
created with the &lt;code&gt;NewReconciler&lt;/code&gt; constructor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;package&lt;/span&gt; reconciler
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// Create new reconciler.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// The passed name should be fully qualified; by default it will be used as&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// field owner and finalizer.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// The passed client&amp;#39;s scheme must recognize at least the core group (v1) and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// apiextensions.k8s.io/v1 and apiregistration.k8s.io/v1.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;func&lt;/span&gt; NewReconciler(name &lt;span style="color:#2b91af"&gt;string&lt;/span&gt;, clnt cluster.Client, options ReconcilerOptions) *Reconciler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt; should be a fully qualified, unique identifier for the operator, typically
a DNS-style name such as &lt;code&gt;mycomponent-operator.mydomain.io&lt;/code&gt;. It is used, by default,
as the field owner and finalizer, and — importantly — as the &lt;strong&gt;prefix of all
annotations and labels&lt;/strong&gt; the reconciler reads and writes. Throughout this
documentation, annotations are written as &lt;code&gt;mycomponent-operator.mydomain.io/apply-order&lt;/code&gt;
and similar; the prefix is exactly this &lt;code&gt;name&lt;/code&gt;, so it varies from operator to operator.&lt;/p&gt;</description></item><item><title>Drift Detection</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/drift-detection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/drift-detection/</guid><description>&lt;p&gt;The Object Reconciler continuously keeps managed objects in sync with their desired
manifests. It detects when an object has &lt;em&gt;drifted&lt;/em&gt; from its declared state and
reapplies it. This page explains the mechanism.&lt;/p&gt;
&lt;h2 id="object-digest"&gt;Object digest&lt;a class="td-heading-self-link" href="#object-digest" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Whenever a dependent object is about to be applied, the reconciler calculates a
&lt;strong&gt;digest&lt;/strong&gt; of the object and persists it as an annotation on the object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; annotations:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mycomponent-operator.mydomain.io/digest: &lt;span style="color:#a31515"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(The annotation prefix is the reconciler &lt;code&gt;name&lt;/code&gt;, so it varies per operator.)&lt;/p&gt;</description></item><item><title>Apply and Delete Waves</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/waves/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/waves/</guid><description>&lt;p&gt;Dependent objects are reconciled in &lt;strong&gt;waves&lt;/strong&gt;. Waves let you express dependencies
between objects so that prerequisites are fully in place before the objects that rely
on them are applied — and, on the way out, so that objects are removed in a safe order.&lt;/p&gt;
&lt;p&gt;Apply order and delete order are &lt;strong&gt;independent&lt;/strong&gt; of each other and are configured with
separate annotations. Order values are integers in the range &lt;strong&gt;-32768 to 32767&lt;/strong&gt;;
objects without an explicit order are treated as order &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Completion</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/completion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/completion/</guid><description>&lt;p&gt;Sometimes an object needs to exist only &lt;em&gt;during&lt;/em&gt; the reconciliation, not permanently —
think of a one-off migration job, a seeding task, or a certificate generator. The
Object Reconciler supports this through the &lt;strong&gt;purge order&lt;/strong&gt;, which is comparable to a
Helm hook.&lt;/p&gt;
&lt;h2 id="purge-order"&gt;Purge order&lt;a class="td-heading-self-link" href="#purge-order" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;An object that carries a purge-order annotation is applied normally, waited for until
it is ready, and then &lt;strong&gt;deleted from the cluster at the end of the specified apply
wave&lt;/strong&gt;. Its inventory record is not removed; instead it is set to the phase
&lt;code&gt;Completed&lt;/code&gt;. This distinguishes purged objects from redundant objects (which are
removed from the inventory entirely).&lt;/p&gt;</description></item><item><title>Policies</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/policies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/policies/</guid><description>&lt;p&gt;The behavior of the Object Reconciler is governed by five policies. Each has a
reconciler-wide default (set through &lt;code&gt;ReconcilerOptions&lt;/code&gt;), and most can be overridden
per object using an annotation whose prefix is the reconciler &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="adoption-policy--and-the-ownership-concept"&gt;Adoption policy — and the ownership concept&lt;a class="td-heading-self-link" href="#adoption-policy--and-the-ownership-concept" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before explaining the policy, it helps to understand &lt;strong&gt;ownership&lt;/strong&gt;. When the reconciler
manages an object, it stamps it with an &lt;em&gt;owner id&lt;/em&gt; (as a label and annotation). This is
how the reconciler tells its own objects apart from &lt;em&gt;foreign&lt;/em&gt; ones: on every apply and
delete it verifies the owner id before touching an object. Ownership is what makes it
safe for the reconciler to update and delete resources — it will not clobber objects it
does not own, unless told to.&lt;/p&gt;</description></item><item><title>Managed Types</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/managed-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/managed-types/</guid><description>&lt;p&gt;One of the defining features of component-operator-runtime is its careful handling of
&lt;strong&gt;managed types&lt;/strong&gt; — the API &lt;em&gt;extension&lt;/em&gt; types that a component may bring along.&lt;/p&gt;
&lt;h2 id="what-is-a-managed-type"&gt;What is a managed type?&lt;a class="td-heading-self-link" href="#what-is-a-managed-type" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A managed type is a Kubernetes API extension type, namely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a type defined by a &lt;strong&gt;CustomResourceDefinition&lt;/strong&gt; contained in the object set, or&lt;/li&gt;
&lt;li&gt;a type served by an &lt;strong&gt;APIService&lt;/strong&gt; (aggregated API server) contained in the object set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instances of such a type are classified as:&lt;/p&gt;</description></item><item><title>Dependent Objects</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/dependents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/dependents/</guid><description>&lt;p&gt;&lt;em&gt;Dependent objects&lt;/em&gt; are the resources managed by the reconciler — in the higher-level
model, the objects returned by a generator&amp;rsquo;s &lt;code&gt;Generate()&lt;/code&gt; method. Under normal
circumstances the framework manages their lifecycle well: it creates and deletes them
in a sensible order and avoids the obvious transient errors.&lt;/p&gt;
&lt;p&gt;For finer control, a manifest may carry any of the annotations below. In all cases the
annotation prefix is the reconciler &lt;code&gt;name&lt;/code&gt; — the value passed to &lt;code&gt;NewReconciler()&lt;/code&gt;.
Throughout this page it is written as &lt;code&gt;mycomponent-operator.mydomain.io&lt;/code&gt;, but it is a
variable; your operator will use its own prefix.&lt;/p&gt;</description></item><item><title>Enhanced Status Detection</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/status-detection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/status-detection/</guid><description>&lt;p&gt;Before proceeding to the next &lt;a href="../waves/"&gt;apply wave&lt;/a&gt; — or declaring the whole set
reconciled — the reconciler must decide whether each dependent object has reached a
&lt;strong&gt;ready&lt;/strong&gt; state. The check is performed by a &lt;code&gt;status.StatusAnalyzer&lt;/code&gt;, which
you can override via &lt;code&gt;ReconcilerOptions.StatusAnalyzer&lt;/code&gt;; when left unset, an optimized
kstatus-based analyzer is used. It is built on the
&lt;a href="https://pkg.go.dev/sigs.k8s.io/cli-utils/pkg/kstatus/status"&gt;kstatus&lt;/a&gt; library, but
with important enhancements.&lt;/p&gt;
&lt;h2 id="how-vanilla-kstatus-works"&gt;How vanilla kstatus works&lt;a class="td-heading-self-link" href="#how-vanilla-kstatus-works" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;For most resources (some built-in types have special logic), kstatus applies roughly
the following algorithm.&lt;/p&gt;</description></item><item><title>The Inventory</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/inventory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/inventory/</guid><description>&lt;p&gt;The &lt;strong&gt;inventory&lt;/strong&gt; is the reconciler&amp;rsquo;s memory. It is what makes the engine level-based:
successive &lt;code&gt;Apply()&lt;/code&gt; and &lt;code&gt;Delete()&lt;/code&gt; calls consult and update it to know what has already
been done. It is a slice of &lt;code&gt;*InventoryItem&lt;/code&gt;, one entry per managed object, and is
typically persisted in the status of a custom resource between reconciliations.&lt;/p&gt;
&lt;h2 id="inventoryitem"&gt;&lt;code&gt;InventoryItem&lt;/code&gt;&lt;a class="td-heading-self-link" href="#inventoryitem" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;package&lt;/span&gt; reconciler
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// InventoryItem represents a dependent object managed by this operator.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;type&lt;/span&gt; InventoryItem &lt;span style="color:#00f"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Type of the dependent object (Group, Version, Kind), inlined.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	TypeVersionInfo &lt;span style="color:#a31515"&gt;`json:&amp;#34;,inline&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Namespace and name of the dependent object, inlined.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NameInfo &lt;span style="color:#a31515"&gt;`json:&amp;#34;,inline&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Adoption policy.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	AdoptionPolicy AdoptionPolicy &lt;span style="color:#a31515"&gt;`json:&amp;#34;adoptionPolicy&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Reconcile policy.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	ReconcilePolicy ReconcilePolicy &lt;span style="color:#a31515"&gt;`json:&amp;#34;reconcilePolicy&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Update policy.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UpdatePolicy UpdatePolicy &lt;span style="color:#a31515"&gt;`json:&amp;#34;updatePolicy&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Delete policy.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	DeletePolicy DeletePolicy &lt;span style="color:#a31515"&gt;`json:&amp;#34;deletePolicy&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Apply order.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	ApplyOrder &lt;span style="color:#2b91af"&gt;int&lt;/span&gt; &lt;span style="color:#a31515"&gt;`json:&amp;#34;applyOrder&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Delete order.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	DeleteOrder &lt;span style="color:#2b91af"&gt;int&lt;/span&gt; &lt;span style="color:#a31515"&gt;`json:&amp;#34;deleteOrder&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Managed types (present for CRDs / APIServices).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	ManagedTypes []TypeVersionInfo &lt;span style="color:#a31515"&gt;`json:&amp;#34;managedTypes,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Digest of the descriptor of the dependent object.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Digest &lt;span style="color:#2b91af"&gt;string&lt;/span&gt; &lt;span style="color:#a31515"&gt;`json:&amp;#34;digest&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Phase of the dependent object.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Phase Phase &lt;span style="color:#a31515"&gt;`json:&amp;#34;phase,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Observed status of the dependent object.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Status status.Status &lt;span style="color:#a31515"&gt;`json:&amp;#34;status,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Timestamp when this object was last applied.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	LastAppliedAt *metav1.Time &lt;span style="color:#a31515"&gt;`json:&amp;#34;lastAppliedAt,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The two embedded structs carry the object&amp;rsquo;s identity:&lt;/p&gt;</description></item><item><title>Client and Scheme</title><link>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/client/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/component-operator-runtime/docs/concepts/reconciler/client/</guid><description>&lt;p&gt;The Object Reconciler talks to the target cluster through a &lt;code&gt;cluster.Client&lt;/code&gt;. This page
describes what that client must provide, and what its scheme must recognize.&lt;/p&gt;
&lt;h2 id="the-clusterclient-interface"&gt;The &lt;code&gt;cluster.Client&lt;/code&gt; interface&lt;a class="td-heading-self-link" href="#the-clusterclient-interface" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;package&lt;/span&gt; cluster
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// The Client interface extends the controller-runtime client by discovery and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;// event recording capabilities.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f"&gt;type&lt;/span&gt; Client &lt;span style="color:#00f"&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	client.Client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Return a discovery client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	DiscoveryClient() discovery.DiscoveryInterface
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Return an event recorder.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	EventRecorder() record.EventRecorder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Return a rest config for this client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Config() *rest.Config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#008000"&gt;// Return a http client for this client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	HttpClient() *http.Client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In other words, a &lt;code&gt;cluster.Client&lt;/code&gt; is a controller-runtime &lt;code&gt;client.Client&lt;/code&gt; augmented
with a few extras the reconciler relies on:&lt;/p&gt;</description></item></channel></rss>