comparing
kro
Solutions for Kubernetes resource orchestration
Kube Resource Orchestrator, or kro, offers a way to define and manage groups of Kubernetes resources and expose them through custom APIs using ResourceGraphDefinitions (RGDs). In this sense, an RGD functions somewhat analogously to a Helm chart, simplifying the deployment of related application components. kro is centered around creating and managing a predefined set of resources within an RGD, which can introduce limitations when needing to interact with existing cluster resources or implement more sophisticated resource orchestration. Koreo, on the other hand, is designed to provide a flexible and extensible platform engineering toolkit. It enables you to program Kubernetes controllers using powerful primitives like ResourceFunctions and ValueFunctions, offering a unified approach to structured configuration and dynamic workflow orchestration within Kubernetes.
Configuration Management
kro does not provide a dedicated configuration management solution. Instead, users might leverage an external tool such as Kustomize to manage the configuration of resources within RGDs. Koreo offers a unified configuration management system with testing as a first-class concern, allowing you to define base configurations, apply overlays, and perform targeted patches to build up resource definitions. This approach to configuration management enables the decomposition of configurations into reusable and testable components, facilitating management by specialized teams such as SRE, security, or compliance.
Workflow Orchestration
kro is centered around managing the lifecycle of the resources within an RGD. Its controller-driven model and use of CEL expressions allows you to pass the values from one RGD resource to another, and kro will properly manage the order in which resources are created. However, it lacks a built-in workflow engine for orchestrating complex processes, mapping values between resources which exist outside the scope of an RGD, or reading values from other resources. Koreo also employs a controller-based model and CEL expressions to provide programmable workflows, but it goes further by providing rich control-flow primitives such as conditionals, switch statements, and for loops. This enables you to define intricate orchestration logic and seamlessly pass data and values between any Kubernetes resources in your cluster.
Resource Materialization
An RGD defines the resources kro should materialize. It specifies static resource templates (where values may be dynamic based on CEL expressions), the dependencies between resources, conditions for resource inclusion, and resource readiness criteria. kro does not interact with or read values from resources outside of the RGD. Koreo's dynamic resource materialization allows you to combine base templates, overlays, and functions to create resources tailored to your specific needs, including reading from and modifying existing resources based on dynamic inputs and outputs from workflow steps.
Target Audience
kro is a great option for users who want a straightforward way to package and manage the lifecycle of a defined set of Kubernetes resources and are looking for an alternative to Helm. Koreo is designed for teams managing more complex Kubernetes environments and requiring robust workflow orchestration and dynamic configuration.

When to choose kro
- You need a simple way to group and manage the lifecycle of a specific set of Kubernetes resources
- Your use case doesn't require interacting with existing resources or consuming their values
- Your resource configurations are relatively simple or have a limited number of variations
- Your orchestration needs are limited to managing the resources within a defined RGD
- Your use case does not warrant the initial upfront complexity of Koreo
When to choose Koreo
- You need to orchestrate complex, multi-step processes involving arbitrary resources in your cluster
- You require a flexible workflow engine with control-flow logic to map values and dependencies between different resources
- You need to manage highly complex configurations with numerous variations
- Dynamic configuration based on various inputs is essential
- Built-in testing of your orchestration and configuration logic is important
- You are building and managing complex Kubernetes platforms with dynamic configuration needs