<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>OpenChoreo Blog</title>
        <link>https://openchoreo.dev/blog/</link>
        <description>OpenChoreo Blog</description>
        <lastBuildDate>Fri, 05 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Platforms Don't Win. Ecosystems Do]]></title>
            <link>https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/</link>
            <guid>https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/</guid>
            <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The long-term success of an Internal Developer Platform is not determined by the technologies it embeds, but by the ecosystem it enables.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-a-vendor-neutral-developer-platform">Building a Vendor-Neutral Developer Platform<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#building-a-vendor-neutral-developer-platform" class="hash-link" aria-label="Direct link to Building a Vendor-Neutral Developer Platform" title="Direct link to Building a Vendor-Neutral Developer Platform" translate="no">​</a></h2>
<p>For years, the cloud native community has debated which technologies win.</p>
<ul>
<li class="">Which ingress controller?</li>
<li class="">Which service mesh?</li>
<li class="">Which observability stack?</li>
<li class="">Which CI/CD engine?</li>
<li class="">Which AI framework?</li>
</ul>
<p>History has shown that these debates rarely have permanent answers.</p>
<p>A decade ago, Mesos looked unstoppable. Service meshes exploded with innovation. New observability platforms emerge every year. Today, AI infrastructure is evolving even faster than Kubernetes itself.</p>
<p>Yet many Internal Developer Platforms (IDPs) are still designed around a single assumption:</p>
<p><strong>The platform team knows the right technology choices, and everyone else should use them.</strong></p>
<p>That assumption creates one of the biggest long-term risks in platform engineering: vendor lock-in.
The real job of a platform is not to force technology decisions. It is to provide a stable developer experience while allowing the underlying technology stack to evolve.</p>
<blockquote>
<p>Developers should depend on platform capabilities, not platform implementations.</p>
</blockquote>
<p>And that's why platforms alone don't win.</p>
<p><strong>Ecosystems do.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-didnt-win-because-it-included-everything">Kubernetes Didn't Win Because It Included Everything<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#kubernetes-didnt-win-because-it-included-everything" class="hash-link" aria-label="Direct link to Kubernetes Didn't Win Because It Included Everything" title="Direct link to Kubernetes Didn't Win Because It Included Everything" translate="no">​</a></h2>
<p>Kubernetes itself succeeded because it became an ecosystem, not because it solved every problem.
Kubernetes does not include a built-in CNI, ingress controller, storage engine, observability stack, or CI/CD system.
Instead, it defines stable abstractions:</p>
<ul>
<li class="">Pods</li>
<li class="">Services</li>
<li class="">Deployments</li>
<li class="">Ingress</li>
<li class="">Custom Resource Definitions (CRDs)</li>
</ul>
<p>Innovation happens behind those abstractions.</p>
<p>Organizations can replace Flannel with Cilium, NGINX with Envoy, Prometheus with another metrics backend, or ArgoCD with Flux without fundamentally changing how developers interact with Kubernetes.</p>
<p>The ecosystem evolves while the user experience remains stable.
This separation between interface and implementation is perhaps Kubernetes' greatest architectural achievement.
Developer platforms should learn from that model.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hidden-problem-with-many-internal-developer-platforms">The Hidden Problem with Many Internal Developer Platforms<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#the-hidden-problem-with-many-internal-developer-platforms" class="hash-link" aria-label="Direct link to The Hidden Problem with Many Internal Developer Platforms" title="Direct link to The Hidden Problem with Many Internal Developer Platforms" translate="no">​</a></h2>
<p>Many IDPs simplify Kubernetes by hiding its complexity.
That's valuable.
But often they replace one form of complexity with another.
Instead of exposing Kubernetes primitives, they tightly couple the platform to a specific collection of technologies:</p>
<ul>
<li class="">One ingress solution</li>
<li class="">One workflow engine</li>
<li class="">One observability vendor</li>
<li class="">One security model</li>
<li class="">One AI framework</li>
</ul>
<p>Initially, this feels simpler.
But over time, platform teams discover that changing one of these technologies requires changing the platform itself.
The platform becomes the bottleneck.
Ironically, the platform designed to accelerate innovation starts slowing it down.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-teams-need-freedom-too">Platform Teams Need Freedom Too<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#platform-teams-need-freedom-too" class="hash-link" aria-label="Direct link to Platform Teams Need Freedom Too" title="Direct link to Platform Teams Need Freedom Too" translate="no">​</a></h2>
<p>We often talk about improving the developer experience.
But platform engineers are users too.
Their requirements evolve constantly:</p>
<ul>
<li class="">Replace one networking stack with another.</li>
<li class="">Introduce a new observability backend.</li>
<li class="">Add cost management capabilities.</li>
<li class="">Integrate new security scanners.</li>
<li class="">Adopt emerging AI tooling.</li>
<li class="">Support organization-specific workflows.</li>
</ul>
<p>A platform that cannot evolve forces teams to choose between stability and innovation.
A platform built around an ecosystem allows both.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="designing-for-an-ecosystem">Designing for an Ecosystem<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#designing-for-an-ecosystem" class="hash-link" aria-label="Direct link to Designing for an Ecosystem" title="Direct link to Designing for an Ecosystem" translate="no">​</a></h2>
<p>At OpenChoreo, we started with a simple architectural principle:</p>
<blockquote>
<p><strong>Kubernetes remains the system of record.</strong></p>
</blockquote>
<p>Instead of building a monolithic platform, OpenChoreo provides higher-level abstractions for developers while allowing platform capabilities to be composed from interchangeable modules.</p>
<p>This led to several key design decisions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-plane-architecture">Multi-Plane Architecture<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#multi-plane-architecture" class="hash-link" aria-label="Direct link to Multi-Plane Architecture" title="Direct link to Multi-Plane Architecture" translate="no">​</a></h3>
<p>Rather than placing everything into a single control plane, OpenChoreo separates responsibilities across multiple planes:</p>
<ul>
<li class="">Control Plane</li>
<li class="">Data Plane</li>
<li class="">Workflow Plane</li>
<li class="">Observability Plane</li>
</ul>
<p>Each plane can evolve independently while presenting a unified experience to developers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="high-level-platform-abstractions">High-Level Platform Abstractions<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#high-level-platform-abstractions" class="hash-link" aria-label="Direct link to High-Level Platform Abstractions" title="Direct link to High-Level Platform Abstractions" translate="no">​</a></h3>
<p>Developers should think about applications, APIs, components, environments, and resources—not networking plugins or ingress controllers.
The platform translates those higher-level concepts into Kubernetes-native implementations.
As underlying technologies change, developer workflows remain unchanged.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="extensible-apis">Extensible APIs<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#extensible-apis" class="hash-link" aria-label="Direct link to Extensible APIs" title="Direct link to Extensible APIs" translate="no">​</a></h3>
<p>Every platform capability should be accessible through stable APIs.
Whether consumed by portals, CLIs, GitOps pipelines, automation systems, or AI agents, the same abstractions apply.
This avoids creating separate operational models for humans and machines.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ecosystem-modules">Ecosystem Modules<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#ecosystem-modules" class="hash-link" aria-label="Direct link to Ecosystem Modules" title="Direct link to Ecosystem Modules" translate="no">​</a></h3>
<p>Modern platforms cannot anticipate every future requirement.
Instead of embedding every capability into the core platform, OpenChoreo allows functionality to be delivered through ecosystem modules.</p>
<p>Examples include:</p>
<ul>
<li class="">Networking modules</li>
<li class="">Observability modules</li>
<li class="">Security modules</li>
<li class="">FinOps integrations</li>
<li class="">Workflow extensions</li>
<li class="">Infrastructure providers</li>
<li class="">Built-in agents</li>
<li class="">Reusable skills</li>
</ul>
<p>This allows organizations to adopt new technologies without redesigning the platform itself.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-makes-ecosystems-even-more-important">AI Makes Ecosystems Even More Important<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#ai-makes-ecosystems-even-more-important" class="hash-link" aria-label="Direct link to AI Makes Ecosystems Even More Important" title="Direct link to AI Makes Ecosystems Even More Important" translate="no">​</a></h2>
<p>The rise of AI agents introduces a new challenge.
Agents need access to platform capabilities just as human developers do.
They need to deploy applications.
They need to inspect observability data.
They need to trigger workflows.
They need to understand policies and guardrails.
If these capabilities are tightly coupled to vendor-specific implementations, every AI integration becomes custom work.
Instead, OpenChoreo treats AI as another ecosystem participant.
The same platform abstractions exposed to humans are also exposed to agents through MCP servers, reusable skills, APIs, and workflows.
The goal is not to build a separate AI platform.
The goal is to make AI a first-class consumer of the same ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-of-platform-engineering">The Future of Platform Engineering<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#the-future-of-platform-engineering" class="hash-link" aria-label="Direct link to The Future of Platform Engineering" title="Direct link to The Future of Platform Engineering" translate="no">​</a></h2>
<p>Platform engineering is often described as building products for developers.
That's true.
But products eventually become ecosystems.</p>
<p>The most successful cloud native projects didn't win because they had the best individual features.</p>
<ul>
<li class="">Linux</li>
<li class="">Kubernetes</li>
<li class="">Prometheus</li>
<li class="">Backstage</li>
</ul>
<p>They won because they created environments where innovation could happen without replacing the foundation.
Internal Developer Platforms should aim for the same outcome.
The platform should provide consistency.
The ecosystem should provide innovation.
Developers should experience stability.
Platform teams should retain freedom.
Organizations should never have to choose between adopting new technology and preserving their developer experience.</p>
<p>Because in the long run, platforms don't win.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ecosystems-do">Ecosystems do.<a href="https://openchoreo.dev/blog/platforms-dont-win-ecosystems-do/#ecosystems-do" class="hash-link" aria-label="Direct link to Ecosystems do." title="Direct link to Ecosystems do." translate="no">​</a></h3>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Self-Service Databases, Queues, Caches, and Other Resources in OpenChoreo]]></title>
            <link>https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/</link>
            <guid>https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/</guid>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How OpenChoreo 1.1 lets developers depend on databases, queues, caches, and other managed infrastructure with the same typed, declarative model that already covers application workloads.]]></description>
            <content:encoded><![CDATA[<p>OpenChoreo v1.1 <a class="" href="https://openchoreo.dev/blog/openchoreo-v1-1-release/">shipped recently</a>, and one of the headline features is <strong>resource abstractions</strong>: a way to treat managed infrastructure like databases, queues, and caches as first-class, declarative dependencies of a workload. Platform engineers publish reusable <strong>ResourceType</strong> templates. Developers self-serve a <strong>Resource</strong> from one of those templates (picking the type, filling in only the parameters they care about) and wire its outputs into their <strong>Workload</strong>, the same way they already reference other components' endpoints.</p>
<p>This post walks through the model, the new CRDs that back it, and a real example you can install: a small collaborative document editor called <strong>Doclet</strong> that depends on Postgres and NATS.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-managed-infrastructure-needs-the-same-treatment-as-workloads">Why managed infrastructure needs the same treatment as workloads<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#why-managed-infrastructure-needs-the-same-treatment-as-workloads" class="hash-link" aria-label="Direct link to Why managed infrastructure needs the same treatment as workloads" title="Direct link to Why managed infrastructure needs the same treatment as workloads" translate="no">​</a></h2>
<p>In our <a class="" href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/">last post on developer abstractions</a>, we argued that Kubernetes is a platform for building platforms, not a developer interface. OpenChoreo's answer was <strong>ComponentType</strong> and <strong>Trait</strong>: typed, declarative templates that platform engineers author and developers consume by name. A developer writes "I want a service on port 8080", and the platform translates that into the right Deployment + Service + HTTPRoute, with governance baked in.</p>
<p>That model worked well for the application workload. But every real application depends on more than just its own container. It needs a database, a message broker, a cache, an object store. And in most Kubernetes-native platforms today, that side of the picture stays raw.</p>
<p>The developer experience for managed infrastructure looks something like this:</p>
<ul>
<li class="">A wiki page that says "to get a Postgres, file a ticket with the platform team."</li>
<li class="">A <a href="https://www.crossplane.io/" target="_blank" rel="noopener noreferrer" class="">Crossplane</a> composition the dev has to know how to invoke directly.</li>
<li class="">A handful of ConfigMaps and Secrets dropped into the namespace by some out-of-band process, with names the developer has to memorize.</li>
<li class="">Connection strings stitched together by hand and pasted into env vars.</li>
</ul>
<p>Every one of these breaks the abstraction we worked so hard to give the developer on the workload side. The developer learned to think in <strong>Component</strong> and Workload, then has to context-switch into Helm values, cloud SDKs, or Terraform variables the moment their app needs a database.</p>
<p>OpenChoreo 1.1 closes that gap. Managed infrastructure now has the same shape developers already know: a typed, named, declarative dependency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-two-sided-abstraction">The two-sided abstraction<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#the-two-sided-abstraction" class="hash-link" aria-label="Direct link to The two-sided abstraction" title="Direct link to The two-sided abstraction" translate="no">​</a></h2>
<p>Like ComponentType, the resource model has a clean PE/dev split.</p>
<ul>
<li class=""><strong>Platform engineers</strong> author a ResourceType (namespace-scoped) or <strong>ClusterResourceType</strong> (cluster-wide). It defines the parameters developers can set, the outputs the resource exposes, and the actual Kubernetes manifests that get emitted on the data plane.</li>
<li class=""><strong>Developers</strong> create a <strong>Resource</strong> that references that type by name and supplies any parameters. They consume the outputs from their Workload's <code>dependencies.resources[]</code> block, much like they consume endpoints from other components today.</li>
</ul>
<p>The developer never sees the data-plane manifests. The platform engineer never has to ship a new abstraction every time a developer wants a different database name. The contract between them is a typed schema.</p>
<p>OpenChoreo 1.1 ships three default ClusterResourceTypes out of the box (<code>postgres</code>, <code>valkey</code>, and <code>nats</code>), covering relational, KV/cache, and pub-sub. These are plain in-cluster StatefulSets and Deployments backed by <code>emptyDir</code> storage, intended for demonstration purposes only.</p>
<p>Platform engineers ship their own ResourceTypes for production, pointing the <code>resources:</code> template surface at whatever provisioner the org already uses: cloud-operator CRs, Crossplane claims, vendor-managed service CRDs, or in-house operators. A developer who consumes a Crossplane-backed <code>postgres</code> ResourceType writes the same Resource and the same <code>dependencies.resources[]</code> block as one consuming the in-cluster sample. The developer-facing contract stays the same regardless of what's underneath.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-example-doclet">The example: Doclet<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#the-example-doclet" class="hash-link" aria-label="Direct link to The example: Doclet" title="Direct link to The example: Doclet" translate="no">​</a></h2>
<p>Doclet is a small collaborative document editor shipped as a sample. It has three components:</p>
<ul>
<li class=""><code>doclet-frontend</code>: a React app served by nginx</li>
<li class=""><code>doclet-document</code>: a Go HTTP service that persists documents in Postgres</li>
<li class=""><code>doclet-collab</code>: a Go WebSocket service that pushes presence updates over NATS</li>
</ul>
<p>And two resources:</p>
<ul>
<li class=""><code>doclet-postgres</code>: an instance of the <code>postgres</code> ClusterResourceType</li>
<li class=""><code>doclet-nats</code>: an instance of the <code>nats</code> ClusterResourceType</li>
</ul>
<p>Here's the whole picture as it appears in the OpenChoreo portal once everything is deployed:</p>
<img src="https://openchoreo.dev/assets/images/doclet-project-diagram-6385c14453cf2016e0cae8f1591be67f.png" alt="Doclet project diagram showing three components, two resources, and the dependsOn edges">
<p>Three components, two resources, edges from the project to each part, and dependency edges from the consuming services to their resources. The developer browsing this page doesn't need to know anything about StatefulSets, ConfigMaps, or Secrets to read it.</p>
<p>The Cell Diagram view renders the same project from OpenChoreo's cell architecture perspective: each project is a cell, with its components and resource dependencies both living inside the boundary.</p>
<img src="https://openchoreo.dev/assets/images/doclet-cell-diagram-3c015eb1244efad2b52b581fb5348e72.png" alt="The Doclet Cell Diagram showing doclet-frontend, doclet-document, and doclet-collab inside the cell boundary, with doclet-postgres and doclet-nats showing as resource dependencies">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-pe-side-a-typed-postgres-template">The PE side: a typed Postgres template<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#the-pe-side-a-typed-postgres-template" class="hash-link" aria-label="Direct link to The PE side: a typed Postgres template" title="Direct link to The PE side: a typed Postgres template" translate="no">​</a></h3>
<p>The <code>postgres</code> ClusterResourceType ships with OpenChoreo's getting-started samples. Stripped of its CEL templates and bootstrap scripts, the contract it exposes is small:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterResourceType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">openAPIV3Schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">database</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> appdb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environmentConfigs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">openAPIV3Schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">adminEnabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boolean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">retainPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Delete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">outputs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${metadata.name}.${metadata.namespace}.svc.cluster.local"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"5432"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">configMapKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${metadata.name}-config"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> username</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">configMapKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${metadata.name}-config"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> username </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">secretKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${metadata.name}-creds"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> password </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> url</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">secretKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${metadata.name}-creds"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> url </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># (plus adminURL and adminPassword, omitted here)</span><br></span></code></pre></div></div>
<p>Three things to notice:</p>
<ol>
<li class=""><strong>Parameters and environmentConfigs are JSON Schemas.</strong> Developers writing <code>parameters.database: doclet</code> get validated against the schema at admission time. Environment configs (memory, adminEnabled) are layered on a per-environment binding, not on the developer-facing Resource.</li>
<li class=""><strong>Outputs are typed by source kind.</strong> Some outputs are plain <code>value</code> strings (host, port). Some are <code>configMapKeyRef</code>. Some are <code>secretKeyRef</code>. The PE explicitly decides which outputs are sensitive, and that decision flows end-to-end.</li>
<li class=""><strong>The actual manifests live below</strong> in a <code>resources:</code> block (omitted above): a StatefulSet, a Service, ConfigMaps for configuration and bootstrap scripts, <a href="https://external-secrets.io/latest/" target="_blank" rel="noopener noreferrer" class="">External Secrets Operator</a> (ESO) resources for credential generation, and an HTTPRoute for the admin UI. CEL expressions like <code>${metadata.name}</code> and <code>${parameters.database}</code> give the PE a typed templating model with metadata, parameters, environment configs, and the surrounding dataplane and gateway context in scope.</li>
</ol>
<p>The OpenChoreo Portal view of the same type makes the contract immediately legible:</p>
<img src="https://openchoreo.dev/assets/images/postgres-clusterresourcetype-4dc96ec7752c8b29125c7ed4f960b2cb.png" alt="The postgres ClusterResourceType page in the OpenChoreo portal, showing one parameter and eight outputs with their source kinds">
<p>One parameter (<code>database</code>), eight outputs with their source kinds rendered next to each name, retain policy, the description from the YAML, and the catalog graph showing six Resource instances currently using this type.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-dev-side-consuming-the-type">The dev side: consuming the type<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#the-dev-side-consuming-the-type" class="hash-link" aria-label="Direct link to The dev side: consuming the type" title="Direct link to The dev side: consuming the type" translate="no">​</a></h3>
<p>A developer who wants a Postgres for their project writes this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resource</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterResourceType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">database</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><br></span></code></pre></div></div>
<p>That's the entire Resource. No StatefulSet, no Service, no Secret. The developer chose a type, named the database, and tied it to a project via <code>owner.projectName</code>. Any component in that project can now consume it. The platform handles the rest.</p>
<p>Wiring that resource into a workload looks like this. Doclet's document service declares both dependencies inline:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Workload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">document</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">dependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ref</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">envBindings</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DB_HOST</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DB_PORT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DB_USER</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DB_PASSWORD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">database</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DB_NAME</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ref</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">envBindings</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DOCLET_NATS_URL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">container</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ghcr.io/openchoreo/samples/doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">document</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span></code></pre></div></div>
<p><code>envBindings</code> is a map from output name (left, defined by the ResourceType) to env-var name (right, chosen by the developer). At runtime the container sees five env vars from Postgres and one from NATS. The two <code>secretKeyRef</code>-backed outputs (Postgres's <code>password</code> and the composite NATS <code>url</code>) become <code>DB_PASSWORD</code> and <code>DOCLET_NATS_URL</code> respectively, both resolved by kubelet from data-plane Secrets, so the bytes never travel back to the control plane.</p>
<p>The shape mirrors <code>dependencies.endpoints[].envBindings</code>, which already exists for cross-component HTTP wiring. Resources slot into the same place developers already look for "things this workload depends on".</p>
<p>There's also <code>fileBindings</code>, which mounts an output as a file rather than projecting it into an env var. Useful when an SDK insists on reading credentials from disk.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="per-environment-overrides">Per-environment overrides<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#per-environment-overrides" class="hash-link" aria-label="Direct link to Per-environment overrides" title="Direct link to Per-environment overrides" translate="no">​</a></h2>
<p>A Resource is environment-agnostic: one <code>doclet-postgres</code> Resource is the single source of truth for development, staging, and production. Each save of the Resource (or of its ResourceType) cuts an immutable <strong>ResourceRelease</strong> snapshot. Each environment then gets its own <strong>ResourceReleaseBinding</strong> that pins a <code>ResourceRelease</code> to that environment:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ResourceReleaseBinding</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">development</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resourceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doclet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">retainPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Delete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceTypeEnvironmentConfigs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">adminEnabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Demo only — exposes Adminer at the gateway</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># resourceRelease: doclet-postgres-6d67ff9695   # set when the binding is promoted</span><br></span></code></pre></div></div>
<p>The binding is where you set per-env knobs without forking the developer-facing Resource. <code>resourceTypeEnvironmentConfigs</code> is type-checked against the <code>environmentConfigs</code> schema on the ResourceType (where <code>adminEnabled</code> is declared as a boolean). <code>retainPolicy</code> lets each environment decide whether deleting the binding tears down the underlying state or holds onto it.</p>
<p>Bindings are typically PE/GitOps-authored: the platform team ships them as YAML alongside the project, or generates them from a pipeline. Promotion (pinning the binding to a newer <code>ResourceRelease</code>) is a one-call client-side flow: read <code>Resource.status.latestRelease.name</code>, <code>PUT</code> the binding with <code>spec.resourceRelease</code> set. The Doclet README uses a <code>kubectl patch</code> loop; <code>occ resource promote --env &lt;env&gt; &lt;resource&gt;</code> is the same flow with the API call wrapped, and the portal's Deploy tab exposes both promote and deploy as one-click actions on each environment lane.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-looks-like-to-the-developer">What this looks like to the developer<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#what-this-looks-like-to-the-developer" class="hash-link" aria-label="Direct link to What this looks like to the developer" title="Direct link to What this looks like to the developer" translate="no">​</a></h2>
<p>The YAML above is what gets written; the portal is what developers actually use. Here's how Doclet's Postgres surfaces to a developer browsing the catalog:</p>
<img src="https://openchoreo.dev/assets/images/doclet-postgres-overview-b511c50c1a66d163c2b31b42d9ff35b2.png" alt="The doclet-postgres Resource Overview tab showing the database parameter, an environments list with development active, a list of consuming components, and a catalog graph anchoring the resource to the Doclet project and the postgres ClusterResourceType">
<p>The Overview tab tells the developer everything they need to know without leaving the page: the one parameter they set, which environments this resource is deployed in, which components in the same project consume it. The graph on the right anchors the resource in its project and ties it back to the type it instances from.</p>
<p>Clicking through to the Deploy tab shows the per-environment view, the same lane-based layout already used for component releases:</p>
<img src="https://openchoreo.dev/assets/images/doclet-postgres-deploy-1195381e54d020e19d76903a9c5b2d2d.png" alt="The doclet-postgres Deploy tab showing development active, staging and production not deployed, with a release pin and an outputs link">
<p>Development is active; staging and production are not. The "Promote" buttons on each environment lane advance the release through the project's deployment pipeline. Eight outputs are available behind the "View All" link:</p>
<img src="https://openchoreo.dev/assets/images/doclet-postgres-outputs-bc611dfaec9da0c669f2329aaf5fe249.png" alt="The outputs panel showing host and port as plain values, database and username as ConfigMap-backed, password and url as Secret-backed">
<p>The panel reflects each output's declared source kind. <code>host</code> and <code>port</code> are plain values, safe to show. <code>database</code> and <code>username</code> are <code>configMapKeyRef</code>. The panel shows the reference, not the value, but a "Show reference" toggle reveals the underlying ConfigMap name and key for anyone who wants to dig in. The application's <code>password</code> and <code>url</code> are <code>secretKeyRef</code>-backed and ESO-generated on the data plane; the portal shows the reference but never the secret bytes. The <code>adminURL</code> is a plain value because it's intended to be opened in a browser. <code>adminPassword</code> shows <code>demo</code> here only because this binding sets <code>adminEnabled: true</code>, which toggles a separate demo-only superuser for the Adminer login; with the admin UI disabled the same output renders as <code>disabled</code>. The application user's credential is unaffected either way.</p>
<p>That trust model is enforced end-to-end, not just in the UI. Secret-backed outputs are resolved on the data plane by kubelet at pod start. The control plane only ever sees the reference (the <code>{name, key}</code> pair), so a leaked control-plane log file never contains a credential. The same constraint applies to the CLI and any other client reading bindings: every layer reads the same <code>ResourceReleaseBinding.status.outputs[]</code> list, and Secret-backed entries simply don't carry a value field.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="trying-it">Trying it<a href="https://openchoreo.dev/blog/self-service-databases-queues-caches-and-other-resources/#trying-it" class="hash-link" aria-label="Direct link to Trying it" title="Direct link to Trying it" translate="no">​</a></h2>
<p>The Doclet sample is in the OpenChoreo repo under <code>samples/from-image/doclet/</code>. The README walks through the three-step install: enable WebSocket upgrades at the gateway, apply the project + components + resources + bindings, then promote each resource to the development environment. The whole thing comes up on a fresh <code>k3d-openchoreo</code> cluster in a few minutes.</p>
<p>If you'd rather start smaller, the three default ClusterResourceTypes ship with the getting-started samples and each one is independently usable. <code>samples/getting-started/cluster-resource-types/{postgres,valkey,nats}.yaml</code> are the source of truth for what these templates look like.</p>
<p>For the deeper material:</p>
<ul>
<li class=""><a class="" href="https://openchoreo.dev/docs/platform-engineer-guide/resource-types/">Authoring ResourceTypes</a>: the PE-side guide, including the full CEL surface and <code>outputs</code> source-kind rules.</li>
<li class=""><a class="" href="https://openchoreo.dev/docs/developer-guide/dependencies/resources/">Resource Dependencies</a>: the dev-side guide on <code>dependencies.resources[]</code>, env bindings, and file bindings.</li>
<li class="">CRD references: <a class="" href="https://openchoreo.dev/docs/reference/api/application/resource/">Resource</a>, <a class="" href="https://openchoreo.dev/docs/reference/api/platform/resourcetype/">ResourceType</a>, <a class="" href="https://openchoreo.dev/docs/reference/api/platform/clusterresourcetype/">ClusterResourceType</a>, <a class="" href="https://openchoreo.dev/docs/reference/api/platform/resourcereleasebinding/">ResourceReleaseBinding</a>, <a class="" href="https://openchoreo.dev/docs/reference/api/runtime/resourcerelease/">ResourceRelease</a>.</li>
</ul>
<p>Components covered the application workload. Resources cover everything the workload depends on. Try it, file issues, or join us in the OpenChoreo Slack. We'd love to hear what you build on top of this.</p>
<ul>
<li class=""><a class="" href="https://openchoreo.dev/docs/getting-started/quick-start-guide/">Get started</a></li>
<li class=""><a href="https://github.com/openchoreo/openchoreo" target="_blank" rel="noopener noreferrer" class="">Star us on GitHub</a></li>
<li class=""><a href="https://cloud-native.slack.com/archives/C0ABYRG1MND" target="_blank" rel="noopener noreferrer" class="">Join our Slack</a></li>
</ul>]]></content:encoded>
            <category>OpenChoreo</category>
            <category>Release</category>
            <category>2026</category>
        </item>
        <item>
            <title><![CDATA[Announcing OpenChoreo v1.1]]></title>
            <link>https://openchoreo.dev/blog/openchoreo-v1-1-release/</link>
            <guid>https://openchoreo.dev/blog/openchoreo-v1-1-release/</guid>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Read about the new features, improvements, and AI capabilities in OpenChoreo v1.1, our latest release since joining the CNCF Sandbox.]]></description>
            <content:encoded><![CDATA[<p>We’re thrilled to announce the OpenChoreo v1.1 release. This marks our first minor release since the v1.0 GA announcement and the project’s acceptance into the CNCF Sandbox in March 2026.</p>
<p>This release brings new features, user experience improvements and AI capabilities to the developer platform, addressing much of the feedback we have received following the v1.0 release.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-openchoreo-v11">What’s new in OpenChoreo v1.1<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#whats-new-in-openchoreo-v11" class="hash-link" aria-label="Direct link to What’s new in OpenChoreo v1.1" title="Direct link to What’s new in OpenChoreo v1.1" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources-and-resource-types-developer-self-service-for-infrastructure-resource-provisioning">Resources and Resource Types: Developer self-service for infrastructure resource provisioning<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#resources-and-resource-types-developer-self-service-for-infrastructure-resource-provisioning" class="hash-link" aria-label="Direct link to Resources and Resource Types: Developer self-service for infrastructure resource provisioning" title="Direct link to Resources and Resource Types: Developer self-service for infrastructure resource provisioning" translate="no">​</a></h3>
<p>This feature provides a much-needed mechanism for platform teams to define reusable templates for infrastructure and platform services such as <em>databases, caches, queues, object storages, cloud services, and more</em> as <strong>Resource Types</strong> that application teams can discover and provision.</p>
<p>These resource templates use the same CEL-based, environment-aware templating model already used by OpenChoreo Component Types and Traits, and support Kubernetes-native provisioners, such as <a href="https://www.crossplane.io/" target="_blank" rel="noopener noreferrer" class="">Crossplane</a>.</p>
<p>This builds on the same foundations as Components and Component Types, allowing platform teams to retain full control over what gets provisioned while exposing simpler, developer-focused self-service abstractions.</p>
<div class="container_ynPm gutterBottom_hArI wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 wrapToImageButton_Si1a" aria-label="Open Introduction to Resources and Resource Types in OpenChoreo in full screen"><img src="https://openchoreo.dev/assets/images/introduction-to-resources-7b45331d122dd5f2b53fbcc11826c996.png" alt="Introduction to Resources and Resource Types in OpenChoreo" class="image_FHab wrapToImage_oVyc"><span class="expandHint_NsXi" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<p><a href="https://openchoreo.dev/docs/platform-engineer-guide/resource-types/" target="_blank" rel="noopener noreferrer" class="">Learn more about resource types in OpenChoreo →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ebpf-powered-data-plane-networking-observability-and-security-with-the-cilium-module">eBPF-powered data plane networking, observability and security with the Cilium module<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#ebpf-powered-data-plane-networking-observability-and-security-with-the-cilium-module" class="hash-link" aria-label="Direct link to eBPF-powered data plane networking, observability and security with the Cilium module" title="Direct link to eBPF-powered data plane networking, observability and security with the Cilium module" translate="no">​</a></h3>
<p>OpenChoreo now natively integrates with <a href="https://cilium.io/" target="_blank" rel="noopener noreferrer" class="">Cilium</a>, a CNCF project that provides eBPF-based networking, observability, and security in data planes.</p>
<p>Once installed and configured, the optional Cilium ecosystem module enables several new platform capabilities:</p>
<ol>
<li class="">
<p>Enhanced Cell diagrams with runtime traffic, static dependencies, and architecture drift detection</p>
<div class="container_ynPm gutterBottom_hArI fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open Cilium-enhanced Cell diagram with runtime traffic and architecture drift detection in full screen"><img src="https://openchoreo.dev/assets/images/cilium-enhanced-cell-diagram-485130e0b06d246128c36644da803f27.png" alt="Cilium-enhanced Cell diagram with runtime traffic and architecture drift detection" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
</li>
<li class="">
<p>Component-level metrics for network throughput and latency</p>
<div class="container_ynPm fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open Component-level network throughput and latency metrics with Cilium in full screen"><img src="https://openchoreo.dev/assets/images/cilium-network-metrics-fba2cf06b448f35cf6af818640082728.png" alt="Component-level network throughput and latency metrics with Cilium" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
</li>
<li class="">
<p>OpenChoreo controllers will switch to Cilium Network Policies for logical project isolation across environments and namespaces created in data planes configured with Cilium</p>
</li>
</ol>
<p><a href="https://openchoreo.dev/ecosystem/item/?id=networking-cilium" target="_blank" rel="noopener noreferrer" class="">Install the Cilium module from the ecosystem →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentic-skills-for-platform-engineers-and-developers-with-mcp-toolset-improvements">Agentic skills for platform engineers and developers with MCP toolset improvements<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#agentic-skills-for-platform-engineers-and-developers-with-mcp-toolset-improvements" class="hash-link" aria-label="Direct link to Agentic skills for platform engineers and developers with MCP toolset improvements" title="Direct link to Agentic skills for platform engineers and developers with MCP toolset improvements" translate="no">​</a></h3>
<p>OpenChoreo’s MCP (<a href="https://modelcontextprotocol.io/docs/getting-started/intro" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a>) servers cover the entire surface of its platform and developer APIs, enabling AI agents to assist with or drive actions within the developer platform based on the user or agent permissions. While the MCP toolset is self-instructional, we found that combining MCP tools with skills significantly improves the accuracy and efficiency of one-shot prompts.</p>
<p>This release includes four new Skills in the OpenChoreo ecosystem, supporting both imperative workflows through the UI and CLI and declarative GitOps-based workflows.</p>
<p>We’ve also expanded the MCP tool surface to cover API operations that were not included in v1.0, along with optimizations to reduce the total number of exposed tools and lower token overhead, especially for clients that do not support dynamic MCP tool loading.</p>
<p><a href="https://openchoreo.dev/ecosystem/?group=skill" target="_blank" rel="noopener noreferrer" class="">Install the skills from the ecosystem →</a><br>
<a href="https://openchoreo.dev/docs/ai/mcp-servers/" target="_blank" rel="noopener noreferrer" class="">Connect to OpenChoreo’s MCP servers →</a></p>
<h2></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dark-mode-faster-event-based-syncing-revamped-deploy-view-in-the-backstage-based-developer-portal">Dark mode, faster event-based syncing, revamped deploy view in the Backstage-based developer portal<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#dark-mode-faster-event-based-syncing-revamped-deploy-view-in-the-backstage-based-developer-portal" class="hash-link" aria-label="Direct link to Dark mode, faster event-based syncing, revamped deploy view in the Backstage-based developer portal" title="Direct link to Dark mode, faster event-based syncing, revamped deploy view in the Backstage-based developer portal" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="light-dark-and-auto-modes">Light, dark and auto modes<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#light-dark-and-auto-modes" class="hash-link" aria-label="Direct link to Light, dark and auto modes" title="Direct link to Light, dark and auto modes" translate="no">​</a></h4>
<p>One of the most requested UI features is now available in OpenChoreo’s developer portal, with native support for light mode, dark mode, and automatic theme switching based on your OS preference.</p>
<div class="container_ynPm fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open Dark mode in the OpenChoreo developer portal in full screen"><img src="https://openchoreo.dev/assets/images/dark-mode-9009efb8dfd7df4c526efc8172514dfd.png" alt="Dark mode in the OpenChoreo developer portal" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="view-cli-and-git-driven-changes-immediately-with-event-based-syncing">View CLI and Git-driven changes immediately with event-based syncing<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#view-cli-and-git-driven-changes-immediately-with-event-based-syncing" class="hash-link" aria-label="Direct link to View CLI and Git-driven changes immediately with event-based syncing" title="Direct link to View CLI and Git-driven changes immediately with event-based syncing" translate="no">​</a></h4>
<p>Previously, changes made outside the UI through the API, CLI, or MCP servers could take time to appear in the Backstage-based developer portal due to Backstage’s default long-polling synchronization model.</p>
<p>With OpenChoreo v1.1.x, the portal now uses an event-based synchronization model, allowing changes made through the API server to appear immediately in the UI without polling delays. This delivers a faster and more responsive developer experience regardless of what interaction mode you use.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="revamped-deploy-view-with-support-for-dag-based-deployment-pipelines">Revamped deploy view with support for DAG-based deployment pipelines<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#revamped-deploy-view-with-support-for-dag-based-deployment-pipelines" class="hash-link" aria-label="Direct link to Revamped deploy view with support for DAG-based deployment pipelines" title="Direct link to Revamped deploy view with support for DAG-based deployment pipelines" translate="no">​</a></h4>
<p>We’ve significantly improved the deployment experience to make creating releases, deploying, and promoting across environments more intuitive for application teams.</p>
<p>Deployment pipelines are now rendered as a visual canvas with support for DAG-based (Directed Acyclic Graph) deployment pipelines.</p>
<div class="container_ynPm fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open Revamped component deploy view with DAG deployment pipeline support in full screen"><img src="https://openchoreo.dev/assets/images/revamped-deploy-view-d0f39f934addd632b896e089da9bf86a.png" alt="Revamped component deploy view with DAG deployment pipeline support" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-openchoreo-backstage-ui-plugins-in-existing-backstage-portals">Install OpenChoreo Backstage UI plugins in existing Backstage portals<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#install-openchoreo-backstage-ui-plugins-in-existing-backstage-portals" class="hash-link" aria-label="Direct link to Install OpenChoreo Backstage UI plugins in existing Backstage portals" title="Direct link to Install OpenChoreo Backstage UI plugins in existing Backstage portals" translate="no">​</a></h4>
<p>While OpenChoreo ships with a <a href="https://github.com/openchoreo/backstage-plugins" target="_blank" rel="noopener noreferrer" class="">preconfigured Backstage</a> distribution optimized for a complete developer platform experience, we recognize that this is not ideal for teams that already operate customized <a href="https://backstage.io/" target="_blank" rel="noopener noreferrer" class="">Backstage</a> portals.</p>
<p>With v1.1, you can now import and install OpenChoreo’s Backstage UI plugins into existing Backstage deployments.</p>
<p><a href="https://openchoreo.dev/docs/platform-engineer-guide/backstage-plugins/overview/" target="_blank" rel="noopener noreferrer" class="">Read the guide →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="extending-openchoreos-rbac-with-abac-attribute-based-access-control">Extending OpenChoreo’s RBAC with ABAC (Attribute-Based Access Control)<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#extending-openchoreos-rbac-with-abac-attribute-based-access-control" class="hash-link" aria-label="Direct link to Extending OpenChoreo’s RBAC with ABAC (Attribute-Based Access Control)" title="Direct link to Extending OpenChoreo’s RBAC with ABAC (Attribute-Based Access Control)" translate="no">​</a></h3>
<p>OpenChoreo v1.1 extends its declarative RBAC (Role-Based Access Control) model with attribute-based access control (ABAC), enabling administrators to define access policies based not only on <em>who</em> and <em>what and where</em>, but also under <em>what circumstances.</em></p>
<p>This allows teams to implement more flexible access control policies, such as restricting deployments to production environments while still allowing the same role binding to view logs and other telemetry within those environments.</p>
<p>OpenChoreo v1.1 supports attribute-based conditions for environments, with more attributes planned for future releases.</p>
<p><a href="https://openchoreo.dev/docs/platform-engineer-guide/authorization/conditions/" target="_blank" rel="noopener noreferrer" class="">Learn more about access control conditions →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-the-openchoreo-finops-agent">Introducing the OpenChoreo FinOps agent<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#introducing-the-openchoreo-finops-agent" class="hash-link" aria-label="Direct link to Introducing the OpenChoreo FinOps agent" title="Direct link to Introducing the OpenChoreo FinOps agent" translate="no">​</a></h3>
<p>We’re excited to introduce the OpenChoreo FinOps Agent, expanding the catalog of built-in platform agents designed to assist with operational workflows.</p>
<p>Once installed, teams can define budget thresholds for components. When actual costs exceed those thresholds, the FinOps Agent automatically analyzes historical cost and runtime telemetry to identify and recommend cost optimizations.</p>
<div class="container_ynPm gutterBottom_hArI fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open FinOps agent cost optimization recommendations in OpenChoreo in full screen"><img src="https://openchoreo.dev/assets/images/finops-agent-recommendation-bbac877ef3c242cc38ba943e2579220d.png" alt="FinOps agent cost optimization recommendations in OpenChoreo" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<p>This agent is based on the existing <a href="https://openchoreo.dev/ecosystem/item/?id=metrics-prometheus" target="_blank" rel="noopener noreferrer" class="">Prometheus metrics module</a> and <a href="https://opencost.io/" target="_blank" rel="noopener noreferrer" class="">OpenCost</a>, an open-source project for real-time cloud infrastructure and container cost measurement.</p>
<p>This release sets the foundation for agentic FinOps in OpenChoreo, and future releases will bring more ease-of-life improvements, such as component- and project-level cost dashboards and analytics to the developer portal.</p>
<p><a href="https://openchoreo.dev/ecosystem/item/?id=finops-opencost" target="_blank" rel="noopener noreferrer" class="">Install the FinOps agent from the ecosystem →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manage-secrets-in-external-secret-stores-directly-via-the-openchoreo-ui-and-cli">Manage secrets in external secret stores directly via the OpenChoreo UI and CLI<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#manage-secrets-in-external-secret-stores-directly-via-the-openchoreo-ui-and-cli" class="hash-link" aria-label="Direct link to Manage secrets in external secret stores directly via the OpenChoreo UI and CLI" title="Direct link to Manage secrets in external secret stores directly via the OpenChoreo UI and CLI" translate="no">​</a></h3>
<p>OpenChoreo integrates with any secret store (such as HashiCorp Vault, OpenBao, AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, etc.) that is supported by the <a href="https://github.com/external-secrets/external-secrets" target="_blank" rel="noopener noreferrer" class="">ESO (External Secrets Operator) project</a>. Prior to this release, platform teams needed to manage secrets directly in the external secret store and manually provide SecretReferences to application teams.</p>
<p>This release introduces an optional feature that allows teams to create, update, and delete secrets directly via the OpenChoreo UI, CLI, and APIs while continuing to support existing external secret management workflows.</p>
<p>This capability is explicitly opt-in and supports both centralized and self-service secret management models.</p>
<div class="container_ynPm gutterBottom_hArI fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open Managing secrets via OpenChoreo's UI and CLI in full screen"><img src="https://openchoreo.dev/assets/images/secret-management-features-249580930de37af2aaf6726d81cd0881.png" alt="Managing secrets via OpenChoreo's UI and CLI" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<p><a href="https://openchoreo.dev/docs/platform-engineer-guide/secret-management/#managing-secrets-through-the-ui-and-cli" target="_blank" rel="noopener noreferrer" class="">Enable the built-in secret management features →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-the-ai-portal-assistant">Introducing the AI portal assistant<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#introducing-the-ai-portal-assistant" class="hash-link" aria-label="Direct link to Introducing the AI portal assistant" title="Direct link to Introducing the AI portal assistant" translate="no">​</a></h3>
<p>OpenChoreo v1.1 introduces the foundation for an AI-powered assistant integrated directly into the developer portal UI. Like all AI capabilities in OpenChoreo, the assistant is fully opt-in and can be configured to use your preferred AI model provider.</p>
<p>Once enabled, the assistant becomes available while debugging builds and runtime telemetry, prompting you to interact with it through chat. While all of these capabilities are possible through your own agents using the MCP servers and skills, the AI portal assistant provides a more convenient experience directly within the UI.</p>
<p>Future releases will continue to expand the portal assistant’s capabilities within the developer portal.</p>
<div class="container_ynPm gutterBottom_hArI fillContainer_B4U0 wrapToImageContainer_ecDX"><button type="button" class="imageButton_iId0 fillButton__PT9 wrapToImageButton_Si1a" aria-label="Open AI assistant in the OpenChoreo developer portal in full screen"><img src="https://openchoreo.dev/assets/images/portal-assistant-42c5947f29cd27ff2052f860ac189e75.png" alt="AI assistant in the OpenChoreo developer portal" class="image_FHab fillImage_rz2u fullBleedImage_fLIg wrapToImage_oVyc"><span class="expandHint_NsXi fillExpandHint_mOzV" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line></svg></span></button></div>
<p><a href="https://openchoreo.dev/docs/ai/portal-assistant/" target="_blank" rel="noopener noreferrer" class="">Configure the AI portal assistant →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentgateway-as-an-ai-gateway-module">AgentGateway as an AI gateway module<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#agentgateway-as-an-ai-gateway-module" class="hash-link" aria-label="Direct link to AgentGateway as an AI gateway module" title="Direct link to AgentGateway as an AI gateway module" translate="no">​</a></h3>
<p>OpenChoreo now includes an ecosystem module for integrating with the agentgateway project within OpenChoreo data planes.</p>
<p>This module provides reusable component Traits that enable:</p>
<ul>
<li class="">Unified LLM routing across multiple providers</li>
<li class="">MCP federation for AI agent communication</li>
<li class="">Standardized AI gateway integration patterns</li>
</ul>
<p><a href="https://openchoreo.dev/ecosystem/item/?id=agentgateway" target="_blank" rel="noopener noreferrer" class="">Install the agentgateway module from the ecosystem →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-sandbox-integration">Agent-Sandbox integration<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#agent-sandbox-integration" class="hash-link" aria-label="Direct link to Agent-Sandbox integration" title="Direct link to Agent-Sandbox integration" translate="no">​</a></h3>
<p>This ecosystem integration with the <a href="https://agent-sandbox.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">kubernetes-sigs/agent-sandbox</a> project introduces Component Types for deploying AI agent runtimes using the same developer abstractions and workflows already available in OpenChoreo.</p>
<p>Supported capabilities include:</p>
<ul>
<li class="">Sandbox environments for agents with persistent storage and other capabilities inherited from the upstream project</li>
<li class="">Kernel-level sandbox isolation using Kata Containers or gVisor (if your hardware supports it)</li>
<li class="">Pre-warmed sandbox pools for faster agent startup times</li>
</ul>
<p><a href="https://openchoreo.dev/ecosystem/item/?id=agent-sandbox" target="_blank" rel="noopener noreferrer" class="">Set up agent sandboxing from the ecosystem →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-observability-modules">AWS observability modules<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#aws-observability-modules" class="hash-link" aria-label="Direct link to AWS observability modules" title="Direct link to AWS observability modules" translate="no">​</a></h3>
<p>OpenChoreo can now integrate natively with the AWS observability stack for logs, metrics, and traces.</p>
<ul>
<li class="">Distributed logs and metrics through AWS CloudWatch</li>
<li class="">Distributed tracing through AWS X-Ray</li>
</ul>
<p>These integrations allow teams already invested in the AWS ecosystem to continue using OpenChoreo’s self-service workflows through the UI, CLI, APIs, and MCP servers without adopting the default self-hosted observability stack.</p>
<p>Support for additional cloud observability providers, including Azure and Google Cloud Platform, is planned for future releases.</p>
<p><a href="https://openchoreo.dev/ecosystem/?q=aws&amp;group=module&amp;category=Observability" target="_blank" rel="noopener noreferrer" class="">Discover the AWS observability modules from the ecosystem →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-forward">Looking forward<a href="https://openchoreo.dev/blog/openchoreo-v1-1-release/#looking-forward" class="hash-link" aria-label="Direct link to Looking forward" title="Direct link to Looking forward" translate="no">​</a></h2>
<p>OpenChoreo v1.1 is another step towards making internal developer platforms more open, modular and agent-ready on Kubernetes.</p>
<p>We’d like to thank the community, contributors and early adopters who continue to shape the project with feedback, ideas and contributions. We’re excited for what’s ahead, and we look forward to building OpenChoreo together with the broader platform engineering community.</p>
<ul>
<li class=""><a href="https://github.com/openchoreo/openchoreo" target="_blank" rel="noopener noreferrer" class="">Star the project on GitHub</a></li>
<li class=""><a href="https://openchoreo.dev/docs/getting-started/quick-start-guide/" target="_blank" rel="noopener noreferrer" class="">Get started</a></li>
<li class=""><a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Join the community on CNCF Slack (#openchoreo)</a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Sri Lankan Stilt Fishing Inspired the OpenChoreo Logo]]></title>
            <link>https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/</link>
            <guid>https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/</guid>
            <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How Sri Lankan Stilt Fishing Inspired the OpenChoreo Logo]]></description>
            <content:encoded><![CDATA[<div style="text-align:center"><img src="https://openchoreo.dev/assets/images/openchoreo-logo-evolution-triptych-ca87bb59d837d11f044594bbf8f8f6f4.png" alt="Figure 01: From the southern coast of Sri Lanka, to a sketch on an iPad, to the OpenChoreo logo."><figcaption style="margin-top:-5px;font-size:0.75rem;color:gray;font-style:italic"><p>From the southern coast of Sri Lanka, to a sketch on an iPad, to the OpenChoreo logo</p></figcaption></div>
<p>If you've come across OpenChoreo, you've probably seen our <a href="https://github.com/cncf/artwork/blob/main/examples/sandbox_l-r.md#openchoreo-logos" target="_blank" rel="noopener noreferrer" class="">logo</a>. It is a small stilt structure standing above two wavy blue lines. It looks simple. Maybe a bit weird at first. That's kind of the point.</p>
<p>People sometimes ask what it means, so I figured it was time to write the story down...</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-from-kubernetes">Starting from Kubernetes<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#starting-from-kubernetes" class="hash-link" aria-label="Direct link to Starting from Kubernetes" title="Direct link to Starting from Kubernetes" translate="no">​</a></h2>
<p>OpenChoreo is a developer platform for <a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a>, so when we started thinking about a logo, the obvious place to look was the Kubernetes family of projects.</p>
<p>The word "Kubernetes" comes from the Greek for helmsman or pilot. The logo is a stylized ship's wheel with seven spokes. It is a nautical metaphor for steering containers through the complex seas of distributed systems. Helm picked up the same theme. So have a few other projects in the ecosystem.</p>
<p>I liked that, and I wanted OpenChoreo to belong to the same family. Even metaphors that seem random at first can become iconic when paired with the right story and the nautical thread running through Kubernetes, Helm, and other CNCF projects already had that kind of pull.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-wanted">What we wanted<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#what-we-wanted" class="hash-link" aria-label="Direct link to What we wanted" title="Direct link to What we wanted" translate="no">​</a></h2>
<p>When I started sketching ideas, I had a few principles in mind:</p>
<ul>
<li class="">Not corporate looking. Not too serious.</li>
<li class="">Something that reflects developer culture, platform engineering, and open source.</li>
<li class="">Not afraid to be a little weird.</li>
<li class="">Unique and memorable enough to work on swag.</li>
<li class="">No mascot.</li>
</ul>
<p>I also wanted the logo to mean something, not just look nice, but actually map to what OpenChoreo does.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-sketch">The sketch<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#the-sketch" class="hash-link" aria-label="Direct link to The sketch" title="Direct link to The sketch" translate="no">​</a></h2>
<p>Here's what I drew on my iPad:</p>
<div style="text-align:center"><a href="https://openchoreo.dev/assets/images/openchoreo_hand_sketch_logo_on_ipad-e525ba66b8f4fc77d0902ebbb2b53474.png" target="_blank" rel="noopener noreferrer"><img src="https://openchoreo.dev/assets/images/openchoreo_hand_sketch_logo_on_ipad-e525ba66b8f4fc77d0902ebbb2b53474.png" alt="Figure 02: Hand-drawn iPad sketch of the OpenChoreo logo." style="width:400px"></a><figcaption style="margin-top:-5px;font-size:0.75rem;color:gray;font-style:italic"><p>Hand-drawn iPad sketch of the OpenChoreo logo</p></figcaption></div>
<p>Your first reaction is probably: this is a random shape sitting on some waves. Fair enough. Let me explain.</p>
<p style="font-style:italic;font-size:0.85rem"></p><p>One more small detail: the "OpenChoreo" wordmark under the stilt uses the same font as the official Kubernetes logo. It's a tiny thing, and most people won't notice consciously. But these little details matter. They make the project feel familiar to people who already live in the cloud-native world. A logo isn't just a shape; it's a set of signals.</p><p></p>
<p>This design is inspired by the <strong>handcrafted stilts used in traditional Sri Lankan fishing</strong>. If you haven't seen it before, it's worth a quick image search. It's been done for generations along the southern coast of Sri Lanka. I grew up around this imagery.</p>
<div style="text-align:center"><a href="https://openchoreo.dev/assets/images/handcrafted_stilts_sri_lankan_fishing-266ec5332119fb2118982c5bab32dbc6.jpg" target="_blank" rel="noopener noreferrer"><img src="https://openchoreo.dev/assets/images/handcrafted_stilts_sri_lankan_fishing-266ec5332119fb2118982c5bab32dbc6.jpg" alt="Figure 03: handcrafted stilts used in traditional Sri Lankan fishing." style="width:300px"></a><figcaption style="margin-top:-5px;font-size:0.75rem;color:gray;font-style:italic"><p>handcrafted stilts used in traditional Sri Lankan fishing</p></figcaption></div>
<p>The parallel was hard to miss once I saw it, a person standing calmly above the water, focused on their work while everything moves below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-waves">The waves<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#the-waves" class="hash-link" aria-label="Direct link to The waves" title="Direct link to The waves" translate="no">​</a></h2>
<p>The waves are everything going on under the hood such as Kubernetes, Cilium, GitOps pipelines, observability, networking, all of it. Dynamic, powerful, sometimes messy.</p>
<p>With OpenChoreo, you don't have to ride the waves. You just need to know they're there, doing their job, while you stay focused on yours.</p>
<p>The runtime environment isn't hidden either. It's visible, accessible, observable. Developers don't have to operate Kubernetes directly, but it's not abstracted away into a black box either.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-stilt-structure">The stilt structure<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#the-stilt-structure" class="hash-link" aria-label="Direct link to The stilt structure" title="Direct link to The stilt structure" translate="no">​</a></h2>
<p>Think of it as a simple platform that is just enough for a developer to sit on, do their thing, and stay above the chaos. It's not hiding what's happening below, but it keeps you steady while everything flows underneath.</p>
<p>That's what OpenChoreo is, really. A platform that gives developers space to focus, with the calm and confidence to build.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-voting-process">The voting process<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#the-voting-process" class="hash-link" aria-label="Direct link to The voting process" title="Direct link to The voting process" translate="no">​</a></h2>
<p>I wasn't the only one with ideas. A few other colleagues at WSO2 also pitched designs, and we ran an internal vote with all of them collected into a single deck. Each design came with a short write-up explaining the concept.</p>
<p>Here's the slide I submitted:</p>
<div style="text-align:center"><a href="https://openchoreo.dev/assets/images/option-9-slide-from-the-voting-deck-4fbe8125c72785a7efefc70eba5dac66.png" target="_blank" rel="noopener noreferrer"><img src="https://openchoreo.dev/assets/images/option-9-slide-from-the-voting-deck-4fbe8125c72785a7efefc70eba5dac66.png" alt="Figure 04: Screenshot of the 'Option 9' slide from the voting deck. The iPad sketch on the left and the write-up about waves and stilt structure in the middle.."></a><figcaption style="margin-top:-5px;font-size:0.75rem;color:gray;font-style:italic"><p>Screenshot of the "Option 9" slide from the voting deck. The iPad sketch on the left and the write-up about waves and stilt structure in the middle</p></figcaption></div>
<p><a href="https://www.linkedin.com/in/sanjivaweerawarana" target="_blank" rel="noopener noreferrer" class="">Sanjiva's</a> reasoning sealed it. OpenChoreo sits on top of Kubernetes, so it belongs in the same nautical family and the stilt-and-waves design fit that thread naturally.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-sketch-to-final-logo">From sketch to final logo<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#from-sketch-to-final-logo" class="hash-link" aria-label="Direct link to From sketch to final logo" title="Direct link to From sketch to final logo" translate="no">​</a></h2>
<p>I designed the OpenChoreo logo - the concept, the metaphor, and the original hand-drawn version. From there, <a href="https://www.linkedin.com/in/surani-bandara-6668a835" target="_blank" rel="noopener noreferrer" class="">Surani Bandara</a> from WSO2 marketing team took my sketch and produced the polished digital version that's now on the website.</p>
<div style="text-align:center"><img src="https://openchoreo.dev/assets/images/hand_sketch_to_official_logo-a0ad3047781cb6d2d52a76df769d158a.png" alt="Figure 05: From the southern coast of Sri Lanka, to a sketch on an iPad, to the OpenChoreo logo." style="width:500px"><figcaption style="margin-top:-5px;font-size:0.75rem;color:gray;font-style:italic"><p>From the sketch on an iPad to the official OpenChoreo logo</p></figcaption></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-im-sharing-this">Why I'm sharing this<a href="https://openchoreo.dev/blog/how-sri-lankan-stilt-fishing-inspired-the-openchoreo-logo/#why-im-sharing-this" class="hash-link" aria-label="Direct link to Why I'm sharing this" title="Direct link to Why I'm sharing this" translate="no">​</a></h2>
<p>Here is why:</p>
<p><strong>One</strong>: I think more open source projects should tell the stories behind their visual identity. The Kubernetes helmsman story is part of why people remember the project. The little nautical thread that runs through CNCF, Helm, the wheel, the wave, is part of the culture. We're adding something to that thread, and I'd rather explain it than have it stay opaque.</p>
<p><strong>Two</strong>: I wanted to put the cultural reference on record. Sri Lankan stilt fishing is a genuinely beautiful piece of heritage, and it felt right to bring a piece of that into a project I've put a lot of myself into.</p>
<p><strong>Three</strong>: if you're working on an open source project and you're staring at a blank canvas trying to figure out a logo, don't be afraid to be weird. Don't be afraid to start with a sketch. A metaphor that lands is worth more than a polished mark with nothing behind it.</p>
<p>That's the story. Next time you see the stilt above the waves, you'll know what it's about.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenChoreo Joins the CNCF Sandbox and Ships 1.0]]></title>
            <link>https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/</link>
            <guid>https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/</guid>
            <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenChoreo Joins the CNCF Sandbox and Ships 1.0]]></description>
            <content:encoded><![CDATA[<p>We're very excited to announce that OpenChoreo has been accepted into the Cloud Native Computing Foundation (<a href="https://www.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF</a>) Sandbox.</p>
<p>Before anything else, we want to give a huge shoutout to everyone who has been part of this journey. To our contributors, early adopters, and community members who filed issues, asked hard questions, and pushed the project forward. This milestone belongs to you. A sincere thank you to the CNCF team for their guidance and for giving us the space to present and discuss OpenChoreo with the broader community.</p>
<p>But we didn't want to stop there. Alongside the <a href="https://www.cncf.io/projects/openchoreo/" target="_blank" rel="noopener noreferrer" class="">CNCF acceptance</a>, we're also shipping OpenChoreo 1.0, our first production-ready release.</p>
<p>Two milestones, one moment, and a community that made both possible.</p>
<!-- -->
<p>Check our CNCF <a href="https://github.com/cncf/sandbox/issues/442" target="_blank" rel="noopener noreferrer" class="">submission</a> and <a href="https://github.com/cncf/sandbox/issues/449" target="_blank" rel="noopener noreferrer" class="">onboarding</a> issues for full details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-openchoreo">What is OpenChoreo?<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#what-is-openchoreo" class="hash-link" aria-label="Direct link to What is OpenChoreo?" title="Direct link to What is OpenChoreo?" translate="no">​</a></h2>
<p>For those who haven't heard of OpenChoreo, here's the one-paragraph version.</p>
<p>OpenChoreo is a complete developer platform for Kubernetes that brings together the abstractions platform and application teams actually need, development and architecture guardrails, a Backstage-powered developer portal, application CI/CD, GitOps, and observability, in a single, cohesive platform. Rather than stitching together a dozen tools yourself, OpenChoreo gives your team a production-ready foundation to build on.</p>
<img src="https://openchoreo.dev/assets/images/developer_platforms-0f5a5955b4c5042f02f80586814ef7d1.png" alt="Figure 01: Developer Platforms">
<p>OpenChoreo is the open-source evolution of <a href="https://wso2.com/choreo" target="_blank" rel="noopener noreferrer" class="">Choreo</a>, <a href="http://wso2.com/" target="_blank" rel="noopener noreferrer" class="">WSO2</a>'s SaaS developer platform. With OpenChoreo, we bring battle-tested ideas and years of platform engineering experience to the broader community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-openchoreo-works">How OpenChoreo works<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#how-openchoreo-works" class="hash-link" aria-label="Direct link to How OpenChoreo works" title="Direct link to How OpenChoreo works" translate="no">​</a></h2>
<p>OpenChoreo is built on a multi-plane architecture that separates concerns rather than just stacking tools.</p>
<p>The <strong>Experience Plane</strong> is where developers, platform engineers, and SREs interact with the platform via a Backstage-powered OpenChoreo Portal, CLI, GitOps, or AI agents.</p>
<p>The <strong>Control Plane</strong> sits at the center of OpenChoreo, translating high-level development and platform abstractions such as components, APIs, environments, pipelines, and namespaces into Kubernetes and other manifests. It is also programmable, allowing platform engineers to define and extend those abstractions, through component types and traits, to fit their organization's needs, without forking the platform or writing low-level Kubernetes controllers. And it doesn't stop at deployment. OpenChoreo continuously reconciles runtime state and observability data back into those same abstractions, so developers always see a complete, high-level picture of their applications with deployment status, API health, and environment state, without ever needing to think in Kubernetes primitives.</p>
<p>The <strong>Data Plane</strong> is where your workloads run. It is where OpenChoreo enforces and guarantees the semantics of those high-level abstractions, such as isolation between projects, traffic policies, and security boundaries. These aren't just configurations; they're guaranteed by the platform.</p>
<p>The <strong>Observability Plane</strong> feeds the loop with metrics, logs, and tracing, all surfaced through the abstractions your developers already understand.</p>
<p>The optional <strong>CI Plane</strong> handles builds using cloud native Buildpacks and Argo Workflows by default.</p>
<img src="https://openchoreo.dev/assets/images/multi_plane_architecture-164849df67e6768fca521edfdc072d9a.png" alt="Figure 01: OpenChoreo's multi-plane architecture">
<p>Developers and platform engineers get a unified view of how every component, pipeline, and environment connect across planes, making it easy to reason about the platform as a whole rather than just individual pieces.</p>
<img src="https://openchoreo.dev/assets/images/portal_platform_view-cabc88c08e948a57d9173794f22d8860.png" alt="Figure 01: Platform portal view">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-for-the-agentic-era">Built for the agentic era<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#built-for-the-agentic-era" class="hash-link" aria-label="Direct link to Built for the agentic era" title="Direct link to Built for the agentic era" translate="no">​</a></h2>
<p>AI agents are becoming a core part of how developers and platform teams work. OpenChoreo is designed from the ground up with this in mind.</p>
<p>On one hand, OpenChoreo is purpose-built for agent-driven development. OpenChoreo exposes MCP servers and skills that enable your AI agents and copilots to interact with the platform as first-class participants, allowing them to create and deploy components, manage platform configurations, and reason about the platform's state.</p>
<p>On the other hand, OpenChoreo ships its own built-in agents to help your teams day to day. The SRE agents analyze logs, metrics, and traces to surface likely root causes of issues using LLMs (root cause analysis). The upcoming FinOps agent helps teams understand and optimize their resource costs. The Architect agent assists with system design decisions.</p>
<img src="https://openchoreo.dev/assets/images/external_internal_agents_openchoreo-11a87690413096e60a0791cb0769fe3c.png" alt="Figure 01: Platform portal view">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modular-by-design">Modular by design<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#modular-by-design" class="hash-link" aria-label="Direct link to Modular by design" title="Direct link to Modular by design" translate="no">​</a></h2>
<p>OpenChoreo is built around the idea that you should build a platform that fits your organization, rather than inherit a fixed stack. Just as Backstage has plugins, OpenChoreo has modules that plug into the platform's planes. Today, this includes API gateway options such as Kong, Envoy, Kgateway, and Traefik.</p>
<p>The goal is simple: choose what makes sense for your organization and leave out what doesn't. And if the module you need doesn't exist yet, we'd love your help building it.</p>
<img src="https://openchoreo.dev/assets/images/modules-6d5bcc0271a93e91145a1ba5662a0528.png" alt="Figure 01: Platform portal view">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-in-10">What’s in 1.0<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#whats-in-10" class="hash-link" aria-label="Direct link to What’s in 1.0" title="Direct link to What’s in 1.0" translate="no">​</a></h2>
<p>Here is a highlight of what's shipping in OpenChoreo 1.0.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="development-and-platform-abstractions">Development and platform abstractions<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#development-and-platform-abstractions" class="hash-link" aria-label="Direct link to Development and platform abstractions" title="Direct link to Development and platform abstractions" translate="no">​</a></h4>
<p>OpenChoreo 1.0 ships with a rich set of abstractions for developers and platform engineers, including components, APIs, environments, pipelines, and namespaces. These abstractions offer every team a clean, high-level vocabulary to work with, regardless of what's running beneath the surface.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="programmable-control-plane">Programmable control plane<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#programmable-control-plane" class="hash-link" aria-label="Direct link to Programmable control plane" title="Direct link to Programmable control plane" translate="no">​</a></h4>
<p>Platform engineers can define and extend the platform's abstractions through component types and traits, encoding your organization's preferred ways of running workloads without writing low-level Kubernetes controllers. Developers get a simple, clean interface. Platform teams get full control.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-native-platform">AI-native platform<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#ai-native-platform" class="hash-link" aria-label="Direct link to AI-native platform" title="Direct link to AI-native platform" translate="no">​</a></h4>
<p>OpenChoreo is being built to treat AI agents as first-class participants. In 1.0, agents can interact with the platform via MCP to generate and edit component configurations, reason about releases and environments, and more. The built-in SRE Agent is a first example of this. It analyzes logs, metrics, and traces from your deployments and uses LLMs to surface likely root causes and actionable insights.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="observability">Observability<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#observability" class="hash-link" aria-label="Direct link to Observability" title="Direct link to Observability" translate="no">​</a></h4>
<p>Built-in distributed logs, metrics, and tracing are integrated with your abstractions out of the box. This allows developers to see the health of their components and APIs without leaving the platform or manually piecing together dashboards.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops">GitOps<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#gitops" class="hash-link" aria-label="Direct link to GitOps" title="Direct link to GitOps" translate="no">​</a></h4>
<p>Built-in GitOps is a first-class interaction model in OpenChoreo. Platform and application configurations are managed declaratively through Git, with FluxCD handling reconciliation under the hood.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-workflows-and-generic-workflows">Component workflows and generic workflows<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#component-workflows-and-generic-workflows" class="hash-link" aria-label="Direct link to Component workflows and generic workflows" title="Direct link to Component workflows and generic workflows" translate="no">​</a></h4>
<p>OpenChoreo now includes a built-in workflow engine powered by the optional CI Plane. Run any workflow as a standalone automation, or associate workflows directly with components to build, test, and deploy them natively in OpenChoreo.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="openchoreo-console">OpenChoreo console<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#openchoreo-console" class="hash-link" aria-label="Direct link to OpenChoreo console" title="Direct link to OpenChoreo console" translate="no">​</a></h4>
<p>The OpenChoreo console is built directly on top of Backstage, giving you a unified portal to explore components, view logs, inspect releases, and manage environments. If your organization already has a Backstage-based developer portal, you can simply install the OpenChoreo plugins without replacing your existing UI or workflows.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli">CLI<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#cli" class="hash-link" aria-label="Direct link to CLI" title="Direct link to CLI" translate="no">​</a></h4>
<p>A first-class CLI for developers and platform engineers who prefer terminal-based workflows or want to integrate OpenChoreo into their existing automation.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="flexible-deployment-topologies">Flexible deployment topologies<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#flexible-deployment-topologies" class="hash-link" aria-label="Direct link to Flexible deployment topologies" title="Direct link to Flexible deployment topologies" translate="no">​</a></h4>
<p>OpenChoreo supports a range of deployment patterns. From a single cluster with namespace isolation for development and testing, to fully separated multi-cluster production setups for scalability and fault tolerance. Hybrid topologies are also supported, allowing teams to colocate planes like Control and CI for cost or operational efficiency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://openchoreo.dev/blog/openchoreo-joins-cncf-and-ships-1-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>As we look ahead, we're excited about the impact we can make in the community. OpenChoreo's abstractions-first approach to platform engineering positions us to contribute to ongoing discussions about what developer platforms for Kubernetes should look like.</p>
<p>We're eager to explore questions like: What is the right level of abstraction for platform and application teams? How do we make Kubernetes truly accessible without hiding its power? How can a programmable control plane evolve alongside an organization's needs?</p>
<p>We're particularly excited about the potential to integrate and collaborate with other projects within the CNCF landscape. OpenChoreo is designed to compose with the tools your teams already use, not replace them.</p>
<p>OpenChoreo is just getting started, and there's a lot to build. If developer platforms for Kubernetes are a problem space you care about, we'd love to have you with us. Try OpenChoreo, explore the getting started guide, or dive straight into the code. We welcome contributors from organizations and individuals alike.</p>
<ul>
<li class=""><a href="https://openchoreo.dev/docs/getting-started/quick-start-guide/" target="_blank" rel="noopener noreferrer" class="">Get started</a></li>
<li class=""><a href="https://github.com/openchoreo/openchoreo" target="_blank" rel="noopener noreferrer" class="">Star us on GitHub</a></li>
<li class=""><a href="https://cloud-native.slack.com/archives/C0ABYRG1MND" target="_blank" rel="noopener noreferrer" class="">Join our Slack</a></li>
</ul>
<p>The best developer platforms are built by the communities that use them. We're glad you're here. ❤️</p>]]></content:encoded>
            <category>OpenChoreo</category>
            <category>CNCF</category>
        </item>
        <item>
            <title><![CDATA[OpenChoreo at KubeCon EU 2026]]></title>
            <link>https://openchoreo.dev/blog/openchoreo-at-kubecon-eu-2026/</link>
            <guid>https://openchoreo.dev/blog/openchoreo-at-kubecon-eu-2026/</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenChoreo at KubeCon EU 2026]]></description>
            <content:encoded><![CDATA[<img src="https://cdn.sched.co/kccnceu2026/img/logo.png" alt="KubeCon EU 2026 logo">
<p></p>
<p>Hello everyone. I wanted to share a quick update on OpenChoreo at KubeCon EU 2026, which is just two weeks away. I'm thrilled to tell you that OpenChoreo will be there for the first time as a CNCF Sandbox project. If you're heading to Amsterdam, we'd love to meet you.</p>
<p>Here are some opportunities for you to connect with us in Amsterdam.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cncf-maintainer-summit">CNCF Maintainer Summit<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-eu-2026/#cncf-maintainer-summit" class="hash-link" aria-label="Direct link to CNCF Maintainer Summit" title="Direct link to CNCF Maintainer Summit" translate="no">​</a></h2>
<p><strong>Sunday March 22nd, 2026</strong></p>
<p>I'll be joining the <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/features-add-ons/maintainer-summit/#about" target="_blank" rel="noopener noreferrer" class="">CNCF Maintainer Summit</a> for the first time, representing the OpenChoreo project. The Maintainer Summit brings together the people behind CNCF projects to collaborate, share best practices, and explore how projects across the ecosystem can work together. I'm particularly looking forward to connecting with fellow maintainers and exploring how OpenChoreo can integrate with other projects in the cloud-native landscape.</p>
<img src="https://events.linuxfoundation.org/wp-content/uploads/2026/01/Maintainer-Summit-EU-2026_400x245-Logo-Color.jpg" alt="Maintainer Summit 2026 logo" width="40%">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-pavilion-kiosk-p-2a">Project Pavilion: Kiosk P-2A<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-eu-2026/#project-pavilion-kiosk-p-2a" class="hash-link" aria-label="Direct link to Project Pavilion: Kiosk P-2A" title="Direct link to Project Pavilion: Kiosk P-2A" translate="no">​</a></h2>
<p><strong>Thursday March 26th, 2026 - 10am-12pm</strong></p>
<p>Come visit us at kiosk P-2A in the <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/features-add-ons/project-engagement/#project-pavilion" target="_blank" rel="noopener noreferrer" class="">Project Pavilion</a> on Thursday. Whether you're a platform engineer exploring developer platform options for Kubernetes, an architect thinking about the right level of abstraction for your teams, or just curious about what OpenChoreo does, stop by and say hi.</p>
<p>We'll be showing how OpenChoreo brings together development abstractions, a programmable control plane, GitOps, observability, and AI-native capabilities into a single, cohesive platform on Kubernetes.</p>
<img src="https://events.linuxfoundation.org/wp-content/uploads/2026/03/KCEU26-Project-Pavilion-Map.png" alt="KubeCon EU 2026 - Project Pavilion Map" width="75%">
<p></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="come-say-hi">Come say hi<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-eu-2026/#come-say-hi" class="hash-link" aria-label="Direct link to Come say hi" title="Direct link to Come say hi" translate="no">​</a></h2>
<p>This is our first KubeCon as a project, and we're looking forward to meeting the community face-to-face. If developer platforms for Kubernetes are a problem space you care about, find me at the conference or come by the booth. We'd love to hear what you're building.</p>
<p>Stay tuned for some exciting news about OpenChoreo during KubeCon week.</p>
<p>See you in Amsterdam!</p>]]></content:encoded>
            <category>OpenChoreo</category>
            <category>2026</category>
            <category>Community</category>
            <category>CNCF</category>
            <category>KubeCon</category>
        </item>
        <item>
            <title><![CDATA[Creating Developer Abstractions for Kubernetes with OpenChoreo]]></title>
            <link>https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/</link>
            <guid>https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/</guid>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>This blog post introduces OpenChoreo’s approach to creating declarative, strongly typed, developer-friendly abstractions for Kubernetes using CEL-based <strong>ComponentTypes</strong> and <strong>Traits</strong>, with first-class <strong>Environments</strong> and <strong>release concepts</strong> that enable declarative multi-environment, multi-cluster deployments.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation--why-do-you-need-abstractions-with-kubernetes">Motivation – Why Do You Need Abstractions with Kubernetes?<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#motivation--why-do-you-need-abstractions-with-kubernetes" class="hash-link" aria-label="Direct link to Motivation – Why Do You Need Abstractions with Kubernetes?" title="Direct link to Motivation – Why Do You Need Abstractions with Kubernetes?" translate="no">​</a></h2>
<p>All modern software is built on many layers of abstraction, and in most cases we’re blissfully unaware of just how deep they go. When you build a simple REST API application, the framework (and the programming language) lets you think in terms of <strong>routes, handlers, and responses</strong>—not raw socket buffers, TCP handshakes, or parsing packets of data.</p>
<p>You describe <strong>what</strong> you want, and the abstractions take care of <strong>how</strong> it happens.</p>
<p>Kubernetes works the same way: it provides an <strong>higher-level API</strong> that lets you describe the desired state of your infrastructure and applications, and it takes care of the underlying mechanics to match that desired state.</p>
<p>While Kubernetes is a massive leap over managing raw infrastructure, it is still fundamentally a <strong>platform for building platforms</strong>, not a developer interface.
Its many concepts are powerful for cluster administrators and platform engineers that work directly with it, but are overwhelming for application developers.</p>
<blockquote>
<p>The developer intent <em>(“deploy my app with port 8080”)</em> usually gets buried under mechanics <em>(“which of the ten different YAMLs should I write?”)</em> resulting in what we call <strong>cognitive overload.</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-abstractions-fail-sometimes">Why Abstractions Fail (Sometimes)<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#why-abstractions-fail-sometimes" class="hash-link" aria-label="Direct link to Why Abstractions Fail (Sometimes)" title="Direct link to Why Abstractions Fail (Sometimes)" translate="no">​</a></h3>
<p>Many developer platforms attempt to solve this problem by <strong>hiding Kubernetes</strong> configuration behind layers of “magic”. This often results in <strong>leaky abstractions</strong>, where teams are forced to break out of the platform the moment they need something slightly outside the happy path. On the other end of the spectrum, <strong>thin abstractions</strong> over Kubernetes still expose too much of its surface area, yielding little-to-no cognitive relief for development teams.</p>
<p>With OpenChoreo, we take a different approach.</p>
<p>OpenChoreo enables platform teams to build declarative, strongly-typed, developer-friendly abstractions that <strong>only augment Kubernetes rather than obscure it</strong>.
Developers work with clear, intent-based interfaces, while platform teams retain full visibility and authority over the underlying Kubernetes resources/configurations that result from those abstractions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lets-start-with-an-example">Let’s Start With an Example<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#lets-start-with-an-example" class="hash-link" aria-label="Direct link to Let’s Start With an Example" title="Direct link to Let’s Start With an Example" translate="no">​</a></h2>
<p>Take a <em>run-of-the-mill</em> REST API server as an example. If you were to deploy this application on Kubernetes, you would need to compose several different resources. And while this list is by no means exhaustive, it might include the following:</p>
<ul>
<li class="">A <strong>Deployment</strong> to run your container</li>
<li class="">A <strong>Service</strong> to expose the ports of the container to the cluster network</li>
<li class="">An <strong>HTTPRoute</strong> (or Ingress) to expose L7 traffic to the outside world</li>
<li class="">One or more <strong>ConfigMaps</strong> and <strong>Secrets</strong> to provide environment variables or configuration files</li>
<li class="">Optional resources such as:<!-- -->
<ul>
<li class="">a <strong>PersistentVolumeClaim</strong> for attaching storage (from a StorageClass in the cluster)</li>
<li class="">a <strong>HorizontalPodAutoscaler</strong> (HPA) for scaling up</li>
<li class="">a <strong>PodDisruptionBudget</strong> for improving resiliency during node failures or maintenance</li>
</ul>
</li>
</ul>
<img src="https://openchoreo.dev/assets/images/01-k8s-app-29b23f21518f7a0140ae8842a1c47363.png" alt="Figure 01: Kubernetes resources needed to deploy a simple REST API application">
<p>Let’s now look at how we can build a simple developer-facing abstraction using the building blocks OpenChoreo gives us, from a platform engineer’s point of view.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>A quick recap on OpenChoreo concepts</div><div class="admonitionContent_BuS1"><ul>
<li class="">
<p>A <a href="https://openchoreo.dev/docs/reference/api/platform/componenttype/" target="_blank" rel="noopener noreferrer" class=""><strong>ComponentType</strong></a> is, simply put, a <em>template</em> that defines which Kubernetes resources are emitted when an instance of it (a <a href="https://openchoreo.dev/docs/reference/api/application/component/" target="_blank" rel="noopener noreferrer" class=""><strong>Component</strong></a>) is created. ComponentTypes let platform engineers expose a typed set of configurable parameters to developers, surfacing only the fields they need while abstracting away the underlying Kubernetes specifics.</p>
</li>
<li class="">
<p>A <a href="https://openchoreo.dev/docs/reference/api/application/workload/" target="_blank" rel="noopener noreferrer" class=""><strong>Workload</strong></a> defines the runtime details: image, environment variables and (config) files and endpoints. It provides an opinionated, developer-friendly input model that ComponentTypes can reference within their templates. If the Component defines an “application”, think of the Workload as “things in the application that change with each commit” – in fact, developers can commit the <strong>Workflow</strong> to their application’s source repository so it’s always bound to a specific revision of the source code.</p>
</li>
<li class="">
<p><a href="https://openchoreo.dev/docs/reference/api/platform/trait/" target="_blank" rel="noopener noreferrer" class=""><strong>Traits</strong></a> represent cross-cutting capabilities that can be attached to a Component without baking them into ComponentTypes. For example, adding a persistent volume mount or an HPA to a component can be considered traits (because they can be used in many different component types).</p>
</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-new-component-type">Creating a New Component Type<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#creating-a-new-component-type" class="hash-link" aria-label="Direct link to Creating a New Component Type" title="Direct link to Creating a New Component Type" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Install OpenChoreo</div><div class="admonitionContent_BuS1"><p>To follow along, you’ll need a running OpenChoreo installation. Follow the <a href="https://openchoreo.dev/docs/next/getting-started/quick-start-guide/" target="_blank" rel="noopener noreferrer" class="">quick start guide</a> or any of the other installation methods in our documentation.</p></div></div>
<p>Every component type must have a <strong>workload type</strong> that represents its primary K8s resource (i.e. a Deployment, Statefulset, Cronjob or Job). This enables a MIME-like representation of the component type using the format <code>{workloadType}/{componentTypeName}</code>.</p>
<p>We will now create a new <strong><code>deployment/simple-http-service</code></strong> component type that will represent a K8s Deployment (which is the workloadType), Service, HTTPRoute and also a PDB (Pod Disruption Budget).</p>
<p>We want to expose only the port, image, default replica count and the default resource requests and limits from our developers, so those will be exposed via the resulting Component and Workload to our developers.</p>
<img src="https://openchoreo.dev/assets/images/02-componenttype-ae98b7e43b08d389ade71170bcb550a7.png" alt="Figure 02: Starting with a simple-http-service ComponentType">
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ComponentType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> simple</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">types</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=100m"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=256Mi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=80"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">envOverrides</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resources</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resources</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minAvailable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># The namespace is provided by OpenChoreo based on the Project</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.labels</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.replicas</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.podSelectors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.podSelectors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">workload.containers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"main"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.image</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.port</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.resources.requests.cpu</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.resources.requests.memory</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.resources.limits.cpu</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.resources.limits.memory</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.labels</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.podSelectors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.port</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> httproute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.labels</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">parentRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">external</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">plane</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">hostnames</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.environmentName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">.$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">dataplane.publicVirtualHost</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PathPrefix</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">method</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GET</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">filters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> URLRewrite</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">urlRewrite</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ReplacePrefixMatch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token key atrule" style="color:#00a4db">replacePrefixMatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">backendRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pdb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> policy/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PodDisruptionBudget</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.labels</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">minAvailable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.minAvailable</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.podSelectors</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>There are certain fields here that we (as platform engineers) want to override based on the target environment that it’s deployed to (like development, staging or production), so note the <strong>envOverrides</strong> which we will get to later (OpenChoreo is environment-aware).</p>
<p>The above ComponentType (<code>deployment/simple-http-service</code>) can now be used by developers to create actual instances using a Component + Workload.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Component</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">autoDeploy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">componentType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deployment/simple</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service </span><span class="token comment" style="color:#999988;font-style:italic"># Specifying the component type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># These are the inputs exposed from the component type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">9090</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"200m"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"512Mi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1000m"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1Gi"</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Workload </span><span class="token comment" style="color:#999988;font-style:italic"># This would generally be colocated with the source code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">workload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">componentName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">main</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/openchoreo/samples/reading-list-server:latest"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-traits">Creating Traits<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#creating-traits" class="hash-link" aria-label="Direct link to Creating Traits" title="Direct link to Creating Traits" translate="no">​</a></h2>
<p>Next, we want to model a volume mount (via a PVC referencing a StorageClass available in the cluster) and a HPA as Traits so they can be used by other component types as well.</p>
<blockquote>
<p>Note: The Pod Disruption Budget (PDBs) could also be modelled as a Trait, but we’ve decided to incorporate it into the Component Type to avoid exposing those details to our developers–but this is a subjective design choice; you can decide otherwise.</p>
</blockquote>
<img src="https://openchoreo.dev/assets/images/03-traits-5bc55498ba306f1fffaa4b3e1ca9c6a4.png" alt="Figure 03: Adding Traits for persistent volume and horizontal pod autoscaling">
<p>Similar to ComponentTypes, Traits can also expose a typed set of inputs for the developers, so they can compose them into their applications as needed.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Trait</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> persistent</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default='/var/data'"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=main"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">envOverrides</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=1Gi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">storageClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string | default=local-path"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">creates</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PersistentVolumeClaim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">trait.instanceName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">accessModes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ReadWriteOnce</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">storageClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.storageClass</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.size</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">patches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">op</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /spec/template/spec/containers/</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">(@.name=='$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.containerName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">')</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">/volumeMounts/</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.volumeName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.mountPath</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">op</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> add</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /spec/template/spec/volumes/</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.volumeName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">persistentVolumeClaim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">claimName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">trait.instanceName</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Trait</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> horizontal</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">autoscaling</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=5"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetCpuUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer | default=70"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">creates</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> autoscaling/v2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HorizontalPodAutoscaler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">trait.instanceName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">scaleTargetRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">metadata.name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.minReplicas</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.maxReplicas</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resource</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cpu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Utilization</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">averageUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">parameters.targetCpuUtilization</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>And with that, our developers can now use these Traits in their Components.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Component</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">autoDeploy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">componentType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deployment/simple</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">9090</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"200m"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"512Mi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1000m"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1Gi"</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">traits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> persistent</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">instanceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">volumeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> data</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /app/data</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> horizontal</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">autoscaling</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">instanceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hpa</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">targetCpuUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="environments">Environments<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#environments" class="hash-link" aria-label="Direct link to Environments" title="Direct link to Environments" translate="no">​</a></h2>
<p>OpenChoreo provides a first-class representation for Environments. An <a href="https://openchoreo.dev/docs/reference/api/platform/environment/" target="_blank" rel="noopener noreferrer" class="">Environment</a> represents a runtime context (e.g., dev, test, staging, production) where workloads are deployed and executed.</p>
<p>OpenChoreo enables a <strong>'build once and promote’ delivery model</strong>, where you can promote a workload from one environment to the next while changing environment-specific parameters (synonymous to <a href="https://12factor.net/config" target="_blank" rel="noopener noreferrer" class="">“storing configuration in the environment” in the 12-factor app methodology</a>).</p>
<p>You’ll remember that we exposed certain fields in the ComponentType and in Traits as <strong>‘envOverrides’.</strong>
This is where OpenChoreo’s <strong>ReleaseBinding</strong> comes into play.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Release Concepts</div><div class="admonitionContent_BuS1"><ul>
<li class="">
<p>A <a href="https://openchoreo.dev/docs/reference/api/runtime/componentrelease/" target="_blank" rel="noopener noreferrer" class=""><strong>ComponentRelease</strong></a> is an immutable snapshot of a component at a specific point in time. When you create a release, OpenChoreo takes the Component, its Workload configuration, the selected ComponentType, and any attached Traits, and inlines all of them into a single CR. Think of this as a lock file (like your package-lock.json or go.mod file).</p>
</li>
<li class="">
<p>A <a href="https://openchoreo.dev/docs/reference/api/platform/releasebinding/" target="_blank" rel="noopener noreferrer" class=""><strong>ReleaseBinding</strong></a> represents an environment-specific deployment of a Component. It binds a specific ComponentRelease to an environment and allows platform engineers to override component parameters, trait configurations, and workload settings for specific environments like development, staging, or production.</p>
</li>
</ul></div></div>
<p><img decoding="async" loading="lazy" alt="Figure 04: Environments and Release Bindings in OpenChoreo" src="https://openchoreo.dev/assets/images/04-environments-b2663e61e77da4392d6bbf9e7e4fc443.png" width="3455" height="3151" class="img_ev3q"></p>
<p>If we were to deploy this to the default development environment (which is already installed with the OpenChoreo Data Plane: run <code>kubectl get environments</code> to explore), we, as platform engineers, can override those environment-specific fields in the ReleaseBinding like so:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openchoreo.dev/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ReleaseBinding</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">development</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">owner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">componentName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> foo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development </span><span class="token comment" style="color:#999988;font-style:italic"># Bind to the target environment</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">componentTypeEnvOverrides</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Override the env-specific fields exposed in the component type</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50m"</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"128Mi"</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"200m"</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"256Mi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">traitOverrides</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Override the env-specific fields exposed in the traits</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">data-storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Instance name of the "persistent-volume" trait</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10Gi</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">storageClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> local</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">path</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="putting-it-all-together">Putting It All Together<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#putting-it-all-together" class="hash-link" aria-label="Direct link to Putting It All Together" title="Direct link to Putting It All Together" translate="no">​</a></h2>
<ul>
<li class="">Apply all of the above resources in your OpenChoreo control plane cluster:</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply --server-side </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> https://gist.githubusercontent.com/binura-g/1ce4d2bfd2ecf903f5755f6900084e31/raw/ce945e4da0045e2adc377c5afad5ce007a88f2c5/openchoreo-ct-blog-v0.7.yaml</span><br></span></code></pre></div></div>
<ul>
<li class="">Check the status of the releasebinding which creates the actual K8s resources in the target environment in the data plane cluster:</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get releasebinding foo-api-development </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> yaml </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-iA</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"status:"</span><br></span></code></pre></div></div>
<ul>
<li class="">Find the namespace created for the target environment in the data plane cluster:</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token assign-left variable" style="color:#36acaa">NS</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">kubectl get ns </span><span class="token variable parameter variable" style="color:#36acaa">-l</span><span class="token variable" style="color:#36acaa"> openchoreo.dev/environment</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">development </span><span class="token variable parameter variable" style="color:#36acaa">-o</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable assign-left variable" style="color:#36acaa">jsonpath</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable string" style="color:#e3116c">'{.items[0].metadata.name}'</span><span class="token variable" style="color:#36acaa">)</span><br></span></code></pre></div></div>
<ul>
<li class="">Observe that all the resources have been created successfully in the target environment:</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$NS</span><span class="token plain"> get all,httproute,pvc</span><br></span></code></pre></div></div>
<p>Sample output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                       READY   STATUS    RESTARTS   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pod/foo-api-development-ed312ff3-669778f595-8ktcc          1/1     Running   0          3h37m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pod/foo-api-development-ed312ff3-669778f595-x62rp          1/1     Running   0          3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">service/foo-api-development-ed312ff3   ClusterIP   10.43.97.66    &lt;none&gt;        80/TCP    3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                   READY   UP-TO-DATE   AVAILABLE   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deployment.apps/foo-api-development-ed312ff3           2/2     2            2           3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                             DESIRED   CURRENT   READY   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">replicaset.apps/foo-api-development-ed312ff3-669778f595          2         2         2       3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                                   REFERENCE                                 TARGETS       MINPODS   MAXPODS   REPLICAS   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">horizontalpodautoscaler.autoscaling/foo-api-development-ed312ff3-hpa   Deployment/foo-api-development-ed312ff3   cpu: 2%/65%   2         10        2          3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                                       HOSTNAMES                                                               AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">httproute.gateway.networking.k8s.io/foo-api-development-ed312ff3           ["foo-api-development-ed312ff3-development.openchoreoapis.localhost"]   3h38m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">persistentvolumeclaim/foo-api-development-ed312ff3-data-storage   Bound    pvc-1b4dbf63-25a2-4212-850d-85db573f3f35   10Gi       RWO            local-path     &lt;unset&gt;                 3h38m</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps-adding-config-and-secret-support">Next steps: Adding Config and Secret Support<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#next-steps-adding-config-and-secret-support" class="hash-link" aria-label="Direct link to Next steps: Adding Config and Secret Support" title="Direct link to Next steps: Adding Config and Secret Support" translate="no">​</a></h2>
<p>For brevity, we will omit this part in this article but you can find a reference implementation here that incorporates environment-specific configmaps and secrets from an external secret store: <a href="https://github.com/openchoreo/openchoreo/tree/release-v0.7/samples/component-types/component-with-configs" target="_blank" rel="noopener noreferrer" class="">https://github.com/openchoreo/openchoreo/tree/release-v0.7/samples/component-types/component-with-configs</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="explore-built-in-componenttypes">Explore Built-in ComponentTypes<a href="https://openchoreo.dev/blog/creating-developer-abstractions-for-k8s/#explore-built-in-componenttypes" class="hash-link" aria-label="Direct link to Explore Built-in ComponentTypes" title="Direct link to Explore Built-in ComponentTypes" translate="no">​</a></h2>
<p>OpenChoreo ships with a set of default ComponentTypes that will cover a majority of common use cases.
But these are also fully extensible, so you can customize them or create your own from scratch as we did above.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get ct </span><span class="token comment" style="color:#999988;font-style:italic"># or kubectl get componenttypes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME              WORKLOADTYPE   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">scheduled-task    cronjob        86m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">service</span><span class="token plain">           deployment     86m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">web-application   deployment     86m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get ct </span><span class="token function" style="color:#d73a49">service</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> yaml</span><br></span></code></pre></div></div>
<hr>
<p>OpenChoreo is still under heavy development and we're shaping it with real-world feedback. If you have any questions, suggestions, or want to contribute, please join us on <a href="https://github.com/openchoreo/openchoreo/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a> or <a href="https://discord.com/invite/asqDFC8suT" target="_blank" rel="noopener noreferrer" class="">Discord</a>.</p>
<p>Happy building!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Where OpenChoreo Is Heading (Late 2025 Update)]]></title>
            <link>https://openchoreo.dev/blog/where-openchoreo-is-heading/</link>
            <guid>https://openchoreo.dev/blog/where-openchoreo-is-heading/</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Where OpenChoreo Is Heading (Late 2025 Update)]]></description>
            <content:encoded><![CDATA[<p>Hey everyone. It’s been a while since our first blog post, so I wanted to share a quick update on where OpenChoreo is going, what we’ve been improving recently, and what you can expect next.</p>
<p>We’ve been actively developing OpenChoreo over the last few months, and we’re aiming for a 1.0 release in Q1 2026. Until then, the project is evolving fast, and we don’t recommend running it in production just yet. But if you’re curious, this is a great time to try it out, see how the model feels, and help us shape it with your feedback.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-and-coming-soon">What’s New (and Coming Soon)<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#whats-new-and-coming-soon" class="hash-link" aria-label="Direct link to What’s New (and Coming Soon)" title="Direct link to What’s New (and Coming Soon)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="modular-architecture">Modular Architecture<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#modular-architecture" class="hash-link" aria-label="Direct link to Modular Architecture" title="Direct link to Modular Architecture" translate="no">​</a></h4>
<p>OpenChoreo has always been built around the idea of separate planes, control plane, data plane, CI plane, and so on. But we’re now taking that modularity a step further.</p>
<p>In the current 0.3.x releases, some data plane components, such as the internal and external API gateways, are built in by default. Going forward, we’re working toward making these capabilities installable and replaceable as modules. This allows you to choose the components that actually make sense for your organization instead of inheriting a fixed stack.</p>
<p>Even the requirement to run Cilium in the data plane will become optional. The goal is to let you compose OpenChoreo rather than adopt a monolithic platform.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="componenttypes-and-traits">ComponentTypes and Traits<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#componenttypes-and-traits" class="hash-link" aria-label="Direct link to ComponentTypes and Traits" title="Direct link to ComponentTypes and Traits" translate="no">​</a></h4>
<p>We’ve refined how Components work internally. ComponentTypes define the kind of software being deployed, for example, a backend API, a web application, or a scheduled task, and describe how it should be deployed in a consistent and reusable manner. Traits then layer operational behaviors and policies on top of that base definition. This includes things like scaling rules, traffic configurations, sidecar injection, or observability settings.</p>
<p>The result is a model where platform operators can encode the organization’s preferred ways of running workloads, while developers work with a simple, clean abstraction and never need to deal with the complexity of Kubernetes directly.</p>
<p>There are more details in this discussion: <a href="https://github.com/openchoreo/openchoreo/discussions/816" target="_blank" rel="noopener noreferrer" class="">https://github.com/openchoreo/openchoreo/discussions/816</a></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-friendly-deployment-and-promotion-flow">GitOps-Friendly Deployment and Promotion Flow<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#gitops-friendly-deployment-and-promotion-flow" class="hash-link" aria-label="Direct link to GitOps-Friendly Deployment and Promotion Flow" title="Direct link to GitOps-Friendly Deployment and Promotion Flow" translate="no">​</a></h4>
<p>With the introduction of ComponentReleases and ReleaseBindings, OpenChoreo is becoming significantly more GitOps-friendly. A ComponentRelease is an immutable snapshot of a component at a specific point in time, capturing the component definition, workload configuration, component type, and traits. A ReleaseBinding then describes where and how that release runs in a particular environment.</p>
<p>This provides a clean, predictable workflow where a release can be created once, tested, and then promoted across environments without configuration drift or unexpected side effects.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="openchoreo-console-backstage-based">OpenChoreo Console (Backstage-Based)<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#openchoreo-console-backstage-based" class="hash-link" aria-label="Direct link to OpenChoreo Console (Backstage-Based)" title="Direct link to OpenChoreo Console (Backstage-Based)" translate="no">​</a></h4>
<p>The current version already includes several Backstage plugins, but we are now building the full OpenChoreo console directly on top of Backstage. This will provide a unified portal to explore components, view logs, inspect releases, and manage environments.</p>
<p>Since it is based on Backstage, you can continue using your existing plugins and integrations. If your organization already has a Backstage-based internal developer portal, you will be able to simply install the OpenChoreo plugins without replacing your UI or workflow.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-native-platform">AI-Native Platform<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#ai-native-platform" class="hash-link" aria-label="Direct link to AI-Native Platform" title="Direct link to AI-Native Platform" translate="no">​</a></h4>
<p>We are also working on making OpenChoreo AI-native. In practice, this means your AI agents will be able to interact with the platform as a first-class participant, generating and editing component configurations, reasoning about releases and environments, and even managing parts of the platform itself.</p>
<p>OpenChoreo will include built-in agents to help guide developers and simplify day-to-day workflows.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="and-more">And More<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#and-more" class="hash-link" aria-label="Direct link to And More" title="Direct link to And More" translate="no">​</a></h4>
<p>There are many more improvements underway. The best way to follow along is to watch the GitHub discussions, where we share design proposals and ongoing development work in the open.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-explore-it-tell-us-what-you-think">Try It, Explore It, Tell Us What You Think<a href="https://openchoreo.dev/blog/where-openchoreo-is-heading/#try-it-explore-it-tell-us-what-you-think" class="hash-link" aria-label="Direct link to Try It, Explore It, Tell Us What You Think" title="Direct link to Try It, Explore It, Tell Us What You Think" translate="no">​</a></h3>
<p>OpenChoreo is still under heavy development, we’re shaping it with real-world feedback.</p>
<p>If you’re experimenting with platform engineering, building your own IDP, or evaluating how to simplify Kubernetes developer experience, we’d love your input.</p>
<ul>
<li class="">Try the sample projects</li>
<li class="">Browse the CRDs &amp; console</li>
<li class="">File issues</li>
<li class="">Join discussions</li>
<li class="">Or just tell us what feels intuitive vs. awkward</li>
</ul>
<p>More updates soon. Until then, happy building.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Welcome to OpenChoreo Blog]]></title>
            <link>https://openchoreo.dev/blog/welcome-to-openchoreo-blog/</link>
            <guid>https://openchoreo.dev/blog/welcome-to-openchoreo-blog/</guid>
            <pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We’re excited to launch the OpenChoreo Blog!]]></description>
            <content:encoded><![CDATA[<p>Welcome to the OpenChoreo Blog, your new home for updates, ideas, and stories from the OpenChoreo open-source community! We’re just getting started, and we’re thrilled to share this journey with you.</p>
<p>On this blog, we plan to post release updates, upcoming features, community adoption stories, and the occasional off-topic stuff (you’ve been warned).</p>
<!-- -->
<img src="https://openchoreo.dev/assets/images/openchoreo-logo-dd312f6e8f6ef78e90f4d13afb6e696e.png" alt="OpenChoreo Logo" style="width:300px">
<p>In the meantime, we’d love to hear your thoughts on the OpenChoreo logo. What comes to your mind when you see it? Feel free to share your impressions, interpretations, or wild guesses in whatever way you can. We’ll write more about the logo soon.</p>
<p>To wrap things up, here’s a roundup of recent posts, talks, and videos that dive deeper into OpenChoreo or explore related ideas in the platform engineering space:</p>
<ul>
<li class=""><a href="https://github.com/openchoreo/openchoreo" target="_blank" rel="noopener noreferrer" class="">OpenChoreo GitHub repo</a></li>
<li class=""><a href="https://openchoreo.dev/docs/next/overview/architecture/" target="_blank" rel="noopener noreferrer" class="">OpenChoreo Architecture</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=K0ZQ2NmFRMo" target="_blank" rel="noopener noreferrer" class="">Why Companies Fail at Building Internal Developer Platforms (IDPs)</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=9A-CIye50HY" target="_blank" rel="noopener noreferrer" class="">OpenChoreo: An Open Source Blueprint for Internal Developer Platforms</a></li>
<li class=""><a href="https://itnext.io/platformless-how-choreo-built-a-secure-kubernetes-platform-with-gitops-b7bca909b9f3" target="_blank" rel="noopener noreferrer" class="">Platformless: How Choreo Built a Secure Kubernetes Platform with GitOps</a></li>
</ul>
<p>We’re always looking for guest posts, community contributions, and feedback. If you’re building with OpenChoreo or thinking about it, don’t hesitate to reach out.</p>
<p>Until next time — happy hacking, and welcome aboard.</p>]]></content:encoded>
        </item>
    </channel>
</rss>