kubectl or call a client SDK, you’re interacting with the Kubernetes API. Because the API is extensible, you can add new resource types and behavior to that API surface.
Built-in API groups expose core resources such as:
apps/v1(e.g.,Deployment)networking.k8s.io(e.g.,Ingress)
- Write a controller (reconciler) that implements the desired lifecycle and automation for resources (it can manage built-in or custom resources).
- Define a Custom Resource Definition (CRD) that adds a new API resource type.

Custom Resource Definitions (CRDs)
A CRD is defined using theapiextensions.k8s.io/v1 API. Conceptually, a CRD is “an API for creating APIs”: it tells the API server about a new resource type you want exposed under /apis/<group>/<version>.
Below is a minimal CRD example for a crontabs.stable.example.com resource:
groupandversionsdetermine the API endpoint (e.g.,/apis/stable.example.com/v1).openAPIV3Schemais used for server-side validation andkubectl explainoutput.- A CRD alone only defines the resource shape and API surface — behavior is implemented by a controller.
Controllers (Reconcilers)
Controllers are programs that watch resources and take actions to reconcile actual cluster state toward a desired state declared in an object (the spec). A reconciler typically:- Watches relevant object kinds (built-in or custom).
- Reads the object’s desired state (
spec) and current state in the cluster. - Creates, updates, or deletes Kubernetes objects to reach the desired state.
- Updates the object’s
statussubresource to reflect observed state.
api/v1— API type definitionscontrollers— controller/reconciler logic
MikesAPI custom resource:
controller-runtime to implement the reconciler:
CRDs and controllers are an advanced topic. If you only take away the high-level idea — “CRDs add API types; controllers implement behavior” — you will already have a useful mental model. It’s OK to revisit this topic multiple times while learning.
When to install an existing Operator
You don’t have to write your own CRD/controller if a maintained Operator already exists. OpenShift (and Kubernetes distributions) provide Operator registries such as OperatorHub where many Operators are packaged and ready to install for monitoring, backup, security, cloud integrations, and more. Installing an Operator via the OpenShift web console is usually simpler than building one from scratch. For example, to install the Datadog Operator:- Open OperatorHub in the OpenShift console
- Select the Datadog Operator
- Choose an installed namespace (for example,
openshift-operators) - Configure update approval and click Install


Quick comparison
Summary
- Kubernetes is an extensible API server; Operators extend that API with new types and behavior.
- CRDs define new resource types and their schema; controllers implement the automation to manage those resources.
- KubeBuilder is a common framework to scaffold CRDs and controllers in Go.
- When a maintained Operator exists (for example in OperatorHub), prefer installing it rather than writing your own, unless you need custom behavior.
Links and references
- Kubernetes Custom Resource Definitions (CRD) documentation
- KubeBuilder documentation
- Controller Runtime (sigs.k8s.io/controller-runtime)
- OperatorHub