mrkeyoor.com_
Fri 06 Nov 16:08 UTC
Dev Toolsevaluationupdated 06 Nov 2026

controller-runtime review

Kubernetes controller-runtime is a set of Go libraries for writing controllers that keep cluster resources in a desired state. It supplies controller-building components for applications such as operators, while leaving your resource rules and reconciliation logic to you.

Verdict

Our controller-runtime build passed in 221 seconds, but the test command failed after 113 seconds with 12 failed entries in the recorded summary. It is worth evaluating for Go controller authors who accept minor-version API changes and eventually consistent observations. Pin a compatible dependency line and investigate the complete failure output before relying on this run as an adoption check.

We ran it

Lab card: what happened when we ran controller-runtimeScreenshot of controller-runtime (github.com/kubernetes-sigs/controller-runtime)
Install✓ · 28s182 packages
Build✓ · 221s
Tests✗ · 113s22 passed · 12 failed of 34 (go test)
Repo471 files~87,756 lines of source · 3.2 MB · 7 CI workflows

Answers from our run

Does controller-runtime build from source?

Dependencies installed in 28 seconds (182 packages), and the build succeeded in 221 seconds. We cloned commit 4fd0ea2 into a clean Debian container with 3 CPUs and no project-specific setup.

Do controller-runtime's tests pass?

No. The project's own test command finished in 113 seconds and reported 22 passed, 12 failed (go test).

Who should not use controller-runtime?

New operator authors who need project scaffolding first: the README directs new projects toward Kubebuilder or Operator SDK.

What are the alternatives to controller-runtime?

Kubebuilder, client-go. Our controller-runtime build passed in 221 seconds, but the test command failed after 113 seconds with 12 failed entries in the recorded summary.

SetupN/AInstallation and build completed in our sandbox, but a supported end-to-end controller deployment was not assessed.
Docs4/5Under the visible documentation rubric, the README compatibility matrix and FAQ explain version alignment, stale observations and Scheme registration in detail. We did not execute all documented paths.
CommunityN/ARecent issue and PR activity was checked; maintainer response times, support capacity and adoption were not assessed.
MaturityN/AThe build passed and the test command failed; production reliability and the cause of the failures were not assessed.

Who it’s for

Go developers adding Kubernetes controllers to an existing application.
Operator authors prepared to align controller-runtime and client-go minor versions.
Teams that can write reconciliation logic which tolerates stale reads and repeated requests.

Who it’s NOT for

New operator authors who need project scaffolding first: the README directs new projects toward Kubebuilder or Operator SDK.
Teams requiring compatible Go APIs across minor upgrades: the project explicitly allows breaking changes between minor versions.
Applications whose reconciliation design requires every observation to be current: the FAQ says information may be slightly out of date.

Setup reality

Our November 5, 2026 sandbox run at 4fd0ea2 installed 182 dependencies in 28 seconds and built successfully in 221 seconds. The test command exited 1 in 113 seconds, with 22 passed and 12 failed out of 34 recorded entries. The tail names TestSource failures in pkg/source and pkg/webhook without their underlying errors.

This is a Go library for your application, rather than a standalone service. You need access to the Kubernetes API for the controller you write and a Scheme containing the API types it uses. The README links manager and controller examples; we did not verify a deployed operator.

Match the chosen controller-runtime minor to its supported client-go line and check its minimum Go requirement. Our recorded configuration was 3 CPUs, 8 GB RAM and image golang:1.24-bookworm; the label alone establishes neither the actual runtime nor OS version. The failed test excerpt does not diagnose a toolchain or environment mismatch.

Choose controller-runtime when you own the reconciliation logic

Kubernetes controller-runtime compiled in our sandbox, then its test command failed. That split matters if you're choosing the library for a new operator: the source can build without establishing that the resulting controller behaves correctly against an API server. The more consequential commitment is accepting its reconciliation model and version policy.

The project supplies Go libraries for building Kubernetes controllers, programs that repeatedly bring cluster resources toward a desired state. Its README points new projects toward Kubebuilder or Operator SDK. Starting directly with controller-runtime makes sense when you already have a Go application and want to decide how its controller pieces fit together. Starting with scaffolding makes more sense when you need a new project's structure as well.

What happened when we ran it

Our sandbox installed controller-runtime in 28 seconds and built it in 221 seconds at commit 4fd0ea2 on November 5, 2026. The Go test command exited 1 after 113 seconds. The recorded summary reports 22 passed and 12 failed out of 34. It does not establish that those entries represent individual test cases, so read them as the run's summary rather than a complete case inventory.

The supplied tail names TestSource failures under pkg/source and pkg/webhook. It also shows successful package lines, including webhook admission, authentication and conversion. There is no underlying error explaining the failures. Missing binaries, a Go mismatch or a product defect would each require evidence absent from this excerpt. The failed command is a reason to investigate before adoption, without assigning it a cause.

The record lists 182 dependencies, 471 repository files and approximately 87,756 source lines in a 3.2 MB checkout. The sandbox configuration specified 3 CPUs, 8 GB of RAM and image golang:1.24-bookworm. That label does not establish the actual Go or operating-system version. The scan found 7 CI workflow files, no Dockerfile and no tests directory. Package-level test output plainly exists despite the directory finding. No vulnerability audit result was supplied.

Minor upgrades can change your Go APIs

The README explicitly permits breaking changes between minor versions and disallows them in patch versions. It also says each controller-runtime minor is supported with a specific client-go minor. Compatibility with other client-go minors is neither supported nor established by that policy.

Choose the library line alongside your Kubernetes Go dependencies. The current README's compatibility table pairs controller-runtime v0.25 with client-go v0.37 and a minimum Go version of 1.26. That is documentation for that line, not a claim about the toolchain used in our measured checkout. Copying a current version requirement onto an older sandbox run would confuse two different pieces of evidence.

For an existing operator, review dependency updates together and reserve time to examine breaking changes when crossing minor lines. A team requiring API stability across all minor upgrades has a concrete reason to decline this policy. A zero major version is explicit here, rather than a hidden maintenance surprise.

Reconciliation must tolerate stale observations

The FAQ says reconcile functions should be idempotent and should read the state they need before writing updates. It discourages branching business logic around whether an event was a create, update or delete. Events can be skipped or combined, so the useful unit of work is restoring the desired state for the object.

The same FAQ tells authors to assume information may be slightly out of date. Its examples include deterministic object names, which let the API server reject duplicate creation, and tracking actions when deterministic names are unavailable. If your design needs every read immediately after a write to reflect that write, this documented model needs attention before you choose the library.

Registering types is another application responsibility. The FAQ explains that a Scheme maps Go types to Kubernetes group-version-kinds, and your application should include the API groups it needs. Controller-runtime provides abstractions, but you still own the resource model and the behavior of the reconcile function.

Kubebuilder supplies a starting structure; client-go supplies direct clients

Kubebuilder is built on controller-runtime and controller-tools. Its README describes scaffolding APIs and controllers. Choose it when you want help starting a Kubernetes API project. It keeps the underlying library relationship, so it doesn't remove controller-runtime's compatibility obligations.

client-go documents a clientset, discovery and dynamic clients, authentication support, and controller cache tools. Choose it when direct Kubernetes API access is the job and you want to assemble the surrounding behavior yourself. Neither alternative was measured in this run, and neither is a demonstrated fix for our failed command.

Recent repository activity does not explain the failed suite

GitHub records the last push as November 5, 2026. The public activity feed also shows an issue and pull requests updated that day. Together they establish recent maintenance activity. The reported 68 open items include issues and PRs, and do not measure support speed or production adoption.

Documentation earns 4/5 on this review's scale: 1 means essential guidance is missing, 3 means a usable explanation with material omissions, and 5 means the instructions we need were independently checked. The README's compatibility matrix and FAQ's reconciliation advice support a 4 for detailed guidance that we haven't fully executed. Setup, community support quality and production maturity remain unassessed. Before adopting a dependency line, reproduce the failing command with complete output and check your own controller against the API behavior it will use.

Alternatives

ProjectWhat it isPick it when
KubebuilderA framework for building Kubernetes APIs that uses controller-runtime and controller-tools.Pick this instead when you need API and controller scaffolding for a new project, while retaining controller-runtime underneath.
client-goGo clients for the Kubernetes API, with discovery, dynamic access and controller cache tools.Pick this instead when direct API access is the main requirement and you want to assemble the application behavior yourself.

What people are saying

  1. [github-trending] kubernetes-sigs/controller-runtime

Sources

  1. controller-runtime README and compatibility policy
  2. controller-runtime FAQ
  3. Kubebuilder README
  4. client-go README
  5. controller-runtime repository metadata
  6. controller-runtime recent issues and pull requests

More dev tools reviews

openchoreo · terraform-provider-azurerm · figma-console-mcp · gg-framework · dsh-purge · lz4 · the whole board →