<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn" -->

---
title: Why Kubernetes platforms keep rebuilding a layer they...
description: Kubernetes lacks a shared primitive for composing resources, so every platform tool rebuilds the same glue logic. The kro project, moved to Kubernetes SIG...
canonical: https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Why Kubernetes platforms keep rebuilding a layer they could share | daily.dev
og:description: Kubernetes lacks a shared primitive for composing resources, so every platform tool rebuilds the same glue logic. The kro project, moved to Kubernetes SIG...
og:url: https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn
og:image: https://api.daily.dev/og/posts/GfvAPdcXN.png
og:image:alt: Why Kubernetes platforms keep rebuilding a layer they could share
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Why Kubernetes platforms keep rebuilding a layer they could share

**[The New Stack](https://daily.dev/sources/newstack)** · 8 min read · 1 upvotes · 0 comments

## Summary

Kubernetes lacks a shared primitive for composing resources, so every platform tool rebuilds the same glue logic. The kro project, moved to Kubernetes SIG Cloud Provider in September 2025, offers a ResourceGraphDefinition that separates composition (dependency wiring via CEL expressions) from the API (a generated CRD). Order is inferred from references rather than declared, avoiding drift. kro 0.10 adds a 'Graph' primitive, a schema-free composition that reacts to existing cluster resources without requiring an instance, like auto-generating Ingress rules from labeled Services.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://thenewstack.io/kubernetes-resource-composition-layer>

## Questions this post answers

### What is kro in Kubernetes and what problem does it solve?

kro, the Kube Resource Orchestrator, is a Kubernetes primitive that lets platform teams declare how resources relate instead of writing custom glue controllers. It uses a ResourceGraphDefinition to separate composition (dependency wiring via CEL expressions) from the API (a generated CRD), inferring resource order from references rather than requiring it to be declared separately. It moved to Kubernetes SIG Cloud Provider in September 2025.

_Teams weighing custom controllers versus a shared composition layer can track Kubernetes platform engineering trends on daily.dev._

### What does the kro 0.10 Graph primitive do differently from a ResourceGraphDefinition?

A Graph is the composition logic alone, with no schema, no CRD, and no instances, unlike a ResourceGraphDefinition which wraps composition in a custom API. It's namespaced and reacts to existing cluster state, such as generating Ingress rules automatically when Services are labeled, rather than requiring someone to create an instance of a custom resource.

_Developers building reactive Kubernetes automation can follow composition tooling updates like this on daily.dev._

### How does kro avoid ordering drift between Kubernetes resources that depend on each other?

kro derives the dependency graph directly from references inside CEL expressions, so if one resource's field reads from another's status, that reference itself establishes the order, and nothing is declared twice. Because the order is inferred rather than separately specified, it cannot drift out of sync after a rename or reorder, unlike tools that rely on explicit step numbers or sync waves.

_Anyone debugging flaky resource ordering in GitOps pipelines can keep up with fixes like this via daily.dev._

## Similar posts on daily.dev

- [Building platforms using kro for composition](https://daily.dev/posts/building-platforms-using-kro-for-composition-xkgeioxnq) · CNCF · 4 upvotes · 0 comments
- [How Kubernetes Became the New Linux](https://daily.dev/posts/how-kubernetes-became-the-new-linux-5kr17mwji) · The New Stack · 6 upvotes · 0 comments
- [Building imperative operational tools on a declarative platform](https://daily.dev/posts/building-imperative-operational-tools-on-a-declarative-platform-8oc1jshpl) · ITNEXT · 0 upvotes · 1 comments

---

Tags: [#kubernetes](https://daily.dev/tags/kubernetes), [#platform-engineering](https://daily.dev/tags/platform-engineering), [#gitops](https://daily.dev/tags/gitops), [#crossplane](https://daily.dev/tags/crossplane)

[View this post on daily.dev](https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Why Kubernetes platforms keep rebuilding a layer they could share","url":"https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn"},"datePublished":"2026-10-29T13:04:29.258Z","dateModified":"2026-10-29T13:07:44.196Z","description":"Kubernetes lacks a shared primitive for composing resources, so every platform tool rebuilds the same glue logic. The kro project, moved to Kubernetes SIG...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/9cd5b449d14e383324edf33767b2779d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/9cd5b449d14e383324edf33767b2779d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"The New Stack","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"The New Stack","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/newstack","url":"https://daily.dev/sources/newstack"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"kubernetes,platform-engineering,gitops,crossplane","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"The New Stack","item":"https://daily.dev/sources/newstack"},{"@type":"ListItem","position":3,"name":"Why Kubernetes platforms keep rebuilding a layer they could share"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/why-kubernetes-platforms-keep-rebuilding-a-layer-they-could-share-gfvapdcxn#faq","mainEntity":[{"@type":"Question","name":"What is kro in Kubernetes and what problem does it solve?","acceptedAnswer":{"@type":"Answer","text":"kro, the Kube Resource Orchestrator, is a Kubernetes primitive that lets platform teams declare how resources relate instead of writing custom glue controllers. It uses a ResourceGraphDefinition to separate composition (dependency wiring via CEL expressions) from the API (a generated CRD), inferring resource order from references rather than requiring it to be declared separately. It moved to Kubernetes SIG Cloud Provider in September 2025. Teams weighing custom controllers versus a shared composition layer can track Kubernetes platform engineering trends on daily.dev."}},{"@type":"Question","name":"What does the kro 0.10 Graph primitive do differently from a ResourceGraphDefinition?","acceptedAnswer":{"@type":"Answer","text":"A Graph is the composition logic alone, with no schema, no CRD, and no instances, unlike a ResourceGraphDefinition which wraps composition in a custom API. It's namespaced and reacts to existing cluster state, such as generating Ingress rules automatically when Services are labeled, rather than requiring someone to create an instance of a custom resource. Developers building reactive Kubernetes automation can follow composition tooling updates like this on daily.dev."}},{"@type":"Question","name":"How does kro avoid ordering drift between Kubernetes resources that depend on each other?","acceptedAnswer":{"@type":"Answer","text":"kro derives the dependency graph directly from references inside CEL expressions, so if one resource's field reads from another's status, that reference itself establishes the order, and nothing is declared twice. Because the order is inferred rather than separately specified, it cannot drift out of sync after a rename or reorder, unlike tools that rely on explicit step numbers or sync waves. Anyone debugging flaky resource ordering in GitOps pipelines can keep up with fixes like this via daily.dev."}}]}
```

