March 1, 2024·4 min read·engineeringkubernetescontrollersarchitecture

Cloud provider extraction changes who owns Kubernetes integration

SIG Cloud Provider's March progress report explains why provider code is leaving Kubernetes core. The shared controller framework preserves integration while changing maintenance responsibilities.

Kubernetes needs to understand infrastructure events without carrying every infrastructure provider's implementation in its main source tree. That tension is the subject of the March 1 SIG Cloud Provider spotlight. Arujjwal Negi's interview with co-chair Michael McCune describes an extraction project approaching its final stages. The integration remains necessary even as the location and ownership of its code change.

The interview is careful about the state of that work. McCune describes progress from alpha to beta for the defining enhancement and anticipates final removal within the next few releases. This is a progress report, not an announcement that every built-in integration has already disappeared. Operators reading it need to distinguish the intended architecture from the transition still underway.

I find this direction consistent with the part of Kubernetes I value most. The API and controller machinery allow specialized controllers to converge external state without requiring their entire implementation to become part of the core project. Infrastructure integration benefits from that separation, provided the interface and the controller responsibilities remain clear.

Infrastructure knowledge still belongs somewhere

McCune gives cloud load balancing for Service objects as one reason Kubernetes needs provider integration. He also explains that the original integrations were necessary for awareness of infrastructure events such as instance termination. These are operational relationships between a cluster and the environment hosting it. Removing provider code from the main repository does not remove those relationships.

The proposed arrangement uses cloud controllers maintained outside the core source tree. Providers can build them with the SIG's framework or implement the documented interfaces. This gives the integration a common Kubernetes-facing contract while allowing the implementation to remain specific to a provider. The architecture does not pretend that different cloud APIs have identical behavior.

The distinction is visible in the cloud-provider framework README at v0.29.0. The repository defines an interface and a mechanism for initializing a provider implementation. Its purpose is to supply a shared dependency for processes that need provider-specific functionality. The README expressly prohibits adding provider-specific code to the framework repository itself.

That prohibition is a maintenance rule with architectural consequences. A shared interface can remain a common dependency while implementations evolve elsewhere. If implementation-specific behavior returns to the common library, the extraction has only moved the original coupling into another repository. Keeping the shared package focused is part of preserving the intended separation.

Extraction leaves a shared dependency

An external controller is not independent of Kubernetes's integration contracts. The framework README expects providers to keep their implementations aligned with the framework's development branch. It also requires discussion with SIG Cloud Provider before interface changes. Those requirements acknowledge that extracting code changes coordination rather than eliminating it.

The framework's own development path is equally revealing. The README says its code is synchronized from Kubernetes's staging directory. Changes go into that staging location before synchronization to the separate repository. A distinct importable package therefore does not imply a wholly separate upstream development process. Maintainers still need a controlled way to evolve the shared contract.

For an operator, the practical implication is a more explicit dependency between the installed controller and the cluster. The provider implementation has its own identity in the system, while the interface remains a Kubernetes concern. Responsibility becomes easier to locate, but someone still has to establish that the chosen implementation matches the intended cluster behavior. Extraction makes that relationship visible in deployment and maintenance decisions.

I prefer an explicit provider dependency to hidden implementation code inside a general-purpose control-plane binary. It gives the component a place where its provider-specific behavior can be discussed and maintained. The benefit depends on preserving the common contract, because an external controller with unclear expectations would merely replace one form of coupling with another.

Node lifecycle is a separate responsibility

The spotlight also draws a useful limit around the SIG's work. McCune says that SIG Cloud Provider does not own node lifecycle and points readers toward SIG Cluster Lifecycle and Cluster API for those topics. A controller that integrates Kubernetes with cloud services should not automatically be understood as the component responsible for creating or replacing the machines themselves.

This boundary helps explain why the phrase cloud integration can be misleadingly broad. Cloud-aware control-plane behavior and machine lifecycle involve related infrastructure, but they have different responsibilities and maintainers. Diagnosing a missing load-balancer integration by examining only machine provisioning would begin at the wrong component. The interview provides a more precise map of ownership.

Testing is another unresolved part of the transition. McCune reports that the SIG lacks a generic common set of tests that every provider can run to confirm controller-manager behavior. He identifies work on such tests as a future contribution opportunity. The report therefore pairs architectural progress with a specific maintenance need, a shared contract should have shared behavioral checks across its implementations.

That testing discussion is the most useful part of the progress report for judging the extraction. Moving implementation code out of the tree establishes a boundary. Common tests can make the expected behavior at that boundary more concrete. As of this report, the SIG is still planning that work while completing the migration of the existing integrations.