What Kubernetes Is Missing Is Not Another Platform, But Composition Primitives
Adam Crowder, an AWS EKS engineer and contributor to the kro project, argues that Kubernetes platform teams repeatedly build the same resource-composition logic. The kro project treats composition itself as a shared primitive: dependency order is derived from references in Common Expression Language (CEL) rather than declared separately, thereby eliminating drift between declarations and references.
Ask a platform team what they built last year, and the answer is likely a Kubernetes controller: it creates several objects in sequence, copies fields between them, contains no business logic, only wiring. A Deployment, preceded by a Service, plus a ConfigMap where the only interesting value is the hostname reported in the Service's status. Kubebuilder turns building the first controller into a pleasant afternoon; the tenth brings its own reconciliation bugs, upgrade path, and on-call rotation. It is the same controller, slightly different each time, existing in thousands of organizations.
In this CNCF-sponsored technical essay, Adam Crowder, an AWS engineer and contributor to the kro project, presents an architectural judgment: Kubernetes has all the ingredients—CRDs define new types, controllers give behavior, server-side apply tracks field ownership, CEL evaluates expressions, OpenAPI types every field—but provides no 'recipe.' Nothing says that several resources form one thing, or that a value in one comes from the status of another and must wait for it.
This missing piece is not hypothetical. Helm does composition at render time; Helm 4 added server-side apply and waiting for resource status. Argo CD has sync waves, hooks, and health checks because manifests themselves cannot say what order they need or when they are done. Crossplane has compositions and functions, with v2 composing native Kubernetes resources directly. Operators do it by hand in Go. Strip these tools down and the kernel is the same: a set of objects, dependencies between them, values flowing along edges, and something that keeps re-checking whether the cluster still matches. Each recent addition reaches for a part the tool originally lacked: order, readiness, per-field ownership, evaluation inside the cluster.