<?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>Thu, 23 Jul 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[OpenChoreo at KubeCon Japan 2026]]></title>
            <link>https://openchoreo.dev/blog/openchoreo-at-kubecon-japan-2026/</link>
            <guid>https://openchoreo.dev/blog/openchoreo-at-kubecon-japan-2026/</guid>
            <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenChoreo is heading to KubeCon + CloudNativeCon Japan 2026 — come find us in Yokohama.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="OpenChoreo at KubeCon Japan 2026" src="https://openchoreo.dev/assets/images/openchoreo-at-kubecon-japan-2026-preview-fdb7efa7a54c1821fd5eac8ef6e12de0.png" width="2752" height="1536" class="img_ev3q"></p>
<p></p>
<p>こんにちは (Konnichiwa)! I wanted to share a quick update on <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_kubeconjapan_072326" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> at KubeCon + CloudNativeCon Japan 2026, which is just next week. Fresh off our first KubeCon in Amsterdam, we're excited to bring OpenChoreo to the community in Japan as a CNCF Sandbox project. If you're heading to Japan, we'd love to meet you.</p>
<p>Here are some opportunities for you to connect with us in Japan.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="find-us-at-the-project-pavilion">Find us at the Project Pavilion<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-japan-2026/#find-us-at-the-project-pavilion" class="hash-link" aria-label="Direct link to Find us at the Project Pavilion" title="Direct link to Find us at the Project Pavilion" translate="no">​</a></h2>
<p><strong>Wed, July 29, 2026 — 10:45–14:45 · Table T-3</strong></p>
<p>Come visit us at Table T-3 in the <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/features-add-ons/project-engagement/" target="_blank" rel="noopener noreferrer" class="">Project Pavilion</a>. 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 (or お立ち寄りください!).</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>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-well-be-showing">What we'll be showing<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-japan-2026/#what-well-be-showing" class="hash-link" aria-label="Direct link to What we'll be showing" title="Direct link to What we'll be showing" translate="no">​</a></h3>
<p>This trip we're demoing the latest in OpenChoreo v1.2.0, including our already loved typed <strong>ComponentType</strong> and <strong>Trait</strong> developer abstractions and the self-service <strong>Resource</strong> model that lets developers depend on databases, queues, and caches declaratively.</p>
<p>The headline for v1.2.0 is the new <strong>Project Release Lifecycle</strong>: shared, project-scoped infrastructure — namespaces, NetworkPolicies, ResourceQuotas, and RBAC — is now captured as versioned, immutable snapshots you can promote across environments, bringing the same GitOps discipline you already get for components to the platform layer underneath them.</p>
<p>We'll also be showing off the developer experience improvements landing alongside it — an interactive <strong>shell into running components</strong> and AI-assisted <strong>debugging</strong> from the Backstage portal, a redesigned flow to <strong>browse and compare releases</strong>, and <strong>API Try Out</strong> for OpenAPI and GraphQL endpoints. If you've been following along, we'd love to hear how these map to the problems you're solving on your own platforms.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="come-say-hi">Come say hi<a href="https://openchoreo.dev/blog/openchoreo-at-kubecon-japan-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 in Japan, 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>Yokohama でお会いしましょう — see you in Yokohama! 🇯🇵</p>]]></content:encoded>
            <category>OpenChoreo</category>
            <category>2026</category>
            <category>Community</category>
            <category>CNCF</category>
            <category>KubeCon</category>
        </item>
        <item>
            <title><![CDATA[[Video Podcast] K8s Maxxing with AI-Native Platform Engineering Stack with OpenChoreo]]></title>
            <link>https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/</link>
            <guid>https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/</guid>
            <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenChoreo brings AI agents and a unified abstraction layer to Kubernetes, enabling developers and SREs to build, deploy, and operate workloads through MCP-powered tools with built-in guardrails.]]></description>
            <content:encoded><![CDATA[<p><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> is a developer platform for Kubernetes that lets developers and AI agents build, deploy, and operate apps, resources, and agentic workloads. It provides development and platform abstractions, a Backstage-powered developer portal, CI/CD, GitOps, and observability.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways">Key Takeaways<a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#key-takeaways" class="hash-link" aria-label="Direct link to Key Takeaways" title="Direct link to Key Takeaways" translate="no">​</a></h2>
<ul>
<li class=""><strong><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> is not a Kubernetes distribution</strong>; it installs on top of any existing Kubernetes cluster and provides a unified control plane that orchestrates CNCF tooling across data, observability, and workflow planes.</li>
<li class=""><strong>Agents are first-class citizens.</strong> Two MCP servers (control plane and observability) expose roughly 100 tools, with the same permission model and guardrails applied identically to human users and AI agents.</li>
<li class=""><strong>The abstraction layer solves the agent context problem</strong> by hiding raw Kubernetes internals behind higher-level OpenChoreo concepts; agents get the right context in fewer tokens.</li>
<li class=""><strong>Pre-built SRE, FinOps, and Architect agents</strong> ship out of the box. The SRE agent ingests logs, metrics, and config changes, generates root-cause reports, and can be authorized to apply fixes autonomously.</li>
<li class=""><strong>The permission model supports incremental agent trust</strong> that is read-only by default. Write permissions can be granted per agent identity, enabling a walk-before-you-run adoption path.</li>
</ul>
<blockquote>
<p>You can view the podcast <a href="https://youtu.be/AqGWjxEfj2g?si=Ro_0fn8AYNVcmv4M" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transcript">Transcript<a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#transcript" class="hash-link" aria-label="Direct link to Transcript" title="Direct link to Transcript" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-000">Introduction <a href="https://youtu.be/AqGWjxEfj2g?si=qmBzh29rFU9xIOB9" target="_blank" rel="noopener noreferrer" class="">0:00</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#introduction-000" class="hash-link" aria-label="Direct link to introduction-000" title="Direct link to introduction-000" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> Welcome to DevOps and Docker Talk. On here, we talk about all cloud-native things, and another Kubernetes project has begun and showed up as a CNCF sandbox project this year, and that is OpenChoreo. This project is all about adding AI agents and essentially a new abstraction on Kubernetes itself, that interfaces between what we're all now using as our primary interface to everything software, which is agent harnesses, and what the Kubernetes API and other APIs provide that are typically on Kubernetes, like your monitoring, your observability, or whatever else you might need. This project is adding a new abstraction layer. I'm calling it an abstraction layer because it provides API, MCP, CLI, and web UI to front-end everything else you typically deal with, whether that's your GitOps tools like Argo, your orchestration, your storage, your observability, Kubernetes itself, your authentication, all that stuff.</p>
<p><strong>Bret Fisher:</strong> We are now in a world where we're all playing around with agent SDKs and trying to figure out what we can automate in our infrastructure safely with reliable LLM prompts. These are all things we're probably thinking about. If you're not doing it, you're thinking about it, or you're waiting for someone to tell you how to get it done. OpenChoreo is a new project that came out of WSO2, and they were running it on their own SaaS infrastructure and realized it might be useful to others, which was also how the Docker project got started, by a cloud company realizing that their infrastructure tooling was maybe the most useful part of their product, and released it for free. So OpenChoreo came out of a business hosting a legitimate tool for Kubernetes users and felt like it needed to be open source. Now they're going to be running that on their own platform for customers eventually, but for now they're just focused on getting it open source. Now that it's officially a CNCF sandbox project, that means they've met the minimum level of maturity to explore whether this could succeed in the marketplace, whether those of us building or running open source tools on top of Kubernetes would be interested in an agent platform on top of Kubernetes.</p>
<p><strong>Bret Fisher:</strong> Specifically, this is about us administrating and managing these environments with agent harnesses through the OpenChoreo abstraction (their MCP, API, and CLI). This is not about running inference or building custom models. This isn't about being an AI ops or MLOps person. And this isn't about running custom agents that we built in pods inside of a cluster, although that's certainly possible. The main focus is on exactly what I talk about on this show as well as my other podcast, Agentic DevOps. This one I'm trying to keep focused on CNCF projects, Kubernetes and Docker projects. The Agentic DevOps podcast is really about the patterns, behaviors, and tools for just being a DevOps or platform engineer or SRE who's using AI to get their job done.</p>
<p><strong>Bret Fisher:</strong> On the show this time I have Lakmal and Sameera from the project team over at WSO2, talking about this, getting into the details of what it does and doesn't do, and also explaining to me how it's not what I actually thought it was when we first started talking about it. In the show notes, there are links to the actual <a href="https://www.youtube.com/live/XZ-ya4rqRKA?si=NAsYD2cneYqY2i7c&amp;t=2716" target="_blank" rel="noopener noreferrer" class="">demos</a> — we tend to cut those out of the podcast version, but you can see how the product works and how you can use agents to interface with Kubernetes. We could use agents before, but we didn't necessarily have all of that infrastructure in place besides just a raw API. This helps solve a lot of that with a new level of abstraction. Let's get into it. Lakmal, tell us about yourself. Who are you? Why are you here?</p>
<p><strong>Lakmal Warusawithana:</strong> I am working as a VP and Distinguished Engineer at WSO2, and also GM of the Choreo BU. I started my career as a systems engineer in 2001 and for the last 25 years I've been engaging with building many platforms. Here we are today.</p>
<p><strong>Bret Fisher:</strong> Sameera, how about you?</p>
<p><strong>Sameera Jayasoma:</strong> I'm Sameera Jayasoma, one of the co-maintainers of <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a>. I started my career in programming language design, compiler engineering, and platform architecture. You'll hear more about abstractions and compilation throughout this talk — that's me.</p>
<p><strong>Bret Fisher:</strong> We'll get a gist by the end of what you're really into. So you all reached out. This is a new project. I'm always excited about new CNCF projects because once they've been accepted into the sandbox process we get an idea, it's like reading the tea leaves a little bit. Not everything is a winner, not every project makes it to graduation. But it's an interesting way to separate the hobby projects from things that teams are taking seriously, because you don't really go for sandbox status unless you're taking things seriously. That's where I wake up and start paying attention to new projects. I'm excited to talk about this today because I'm obsessed with AI agents, how we manage infrastructure with agents involved, how we put MCP in our clusters safely, how we sit on our harness as our primary mechanism for interacting with 20 to 40 years of complexity that we've all built up. The number of abstractions we all have to deal with today is insane, and it's amazing that anyone can go to a conference and have a common conversation because there are a thousand tools we're all using. How did the project get started?</p>
<p><strong>Lakmal Warusawithana:</strong> We started this software offering called Choreo SaaS five years back. It started as an iPaaS — an integration platform as a service, then it evolved into something where you could run all other services within the platform itself, so it evolved into an internal developer platform a couple of years later. The name comes from "choreography", we shortened it to "Choreo." It's like choreographing your microservices in a certain way, where Kubernetes does the orchestration and we do the choreography for all your microservices. We were offering this to enterprise customers, fully managed by WSO2. We were running Choreo version 2, and two years back we started the Choreo version 3 project — the next version of our current offering, and eventually it became OpenChoreo. At WSO2 all our software is open source, so we thought: why not open source the software we're running ourselves? That's how OpenChoreo started. This January we donated it to the CNCF foundation and now we are a sandbox project.</p>
<p><strong>Bret Fisher:</strong> That's a similar path to how Docker was invented, because it was a platform company saying "this piece of our platform is pretty interesting, but it's maybe a utility at this point — let's just give it away." So it's not a bad idea to do this.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-makes-openchoreo-different-829">What Makes OpenChoreo Different <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=509s" target="_blank" rel="noopener noreferrer" class="">8:29</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#what-makes-openchoreo-different-829" class="hash-link" aria-label="Direct link to what-makes-openchoreo-different-829" title="Direct link to what-makes-openchoreo-different-829" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> What was the unique problem you were trying to solve? How does the team look at it from the perspective of "this is a unique thing" in a world where we've got dozens of Kubernetes distros? First off, do you even think of this as a distribution of Kubernetes? Do you see it as vanilla Kubernetes with some things bolted on, or how is this different from something like Rancher?</p>
<p><strong>Sameera Jayasoma:</strong> <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> is something we have built on top of Kubernetes. You can use any Kubernetes distro — Rancher, EKS, AKS, any Kubernetes and then just install OpenChoreo on top of it. The idea is that you have Kubernetes and all the other tools, and you have a developer platform. What we've seen in the industry is that you can build this developer platform with Kubernetes and Argo and all the things glued on, and then you expose that layer to developers and build a developer experience around it — portals, MCPs. But we've figured out that that way you expose the platform complexity to your developers. They have to learn Kubernetes, they have to learn all the tools. What's unique here is that we build a middle abstraction layer on top of Kubernetes and other tools. Through six years we've figured out that abstraction layer, and it helps us build a developer experience layer where developers are abstracted away from Kubernetes. They can still see what's going on, but they may not need to learn a lot of things about Kubernetes and other tools. That's one of the unique layers in the platform.</p>
<p><strong>Bret Fisher:</strong> So when we talk specifically about OpenChoreo, is it installing all the parts? For the audio audience, we're looking at a visualization. I love diagrams because they help me understand the conceptualness of something. To me it looks like a full-fledged, fully built-out Kubernetes cluster with all the extras — all the necessary things that an enterprise cluster would have. There are components like KEDA for scaling, Cilium for networking, API gateways, Argo Workflows, Buildpacks, observability layers with Prometheus and all the OpenTelemetry stuff. And then over to the side there's OpenChoreo as this control plane. It's almost like the control plane on top of the control plane. Is this really just focused on the OpenChoreo control plane components on the left and showing how it interacts with the rest, or is this actually helping us implement all of this?</p>
<p><strong>Lakmal Warusawithana:</strong> The main idea behind having a unified control plane is that platform engineers, developers, or even our AI agents can interact with the control plane via different protocols, and then the control plane does all the orchestration across all those other planes — the data plane with Cilium network policy, scale-to-zero with KEDA, all these things can be orchestrated using a control plane with governance enforced through the control plane. That's the main idea. What I've seen as a problem is that even when we expose all these services to the end user, whether it's a platform engineer or a developer, you can't enforce governance. But having this single control layer, we can have guardrails, policy enforcement, and a single pane of glass. That helps to orchestrate across the different planes. Those planes are built using modular architecture in OpenChoreo. For example, if you take an API gateway, it can come from the WSO2 API gateway, kgateway, Kong gateway — it isn't tied to a single vendor. It's building an entire ecosystem around it. Users can pick and choose what they want to use in their data plane, and the abstraction layer helps orchestrate all those different tooling choices.</p>
<p><strong>Bret Fisher:</strong> So if I'm a platform engineer listening to the show, that probably means I have platforms today, I've already got Kubernetes in production, I've already got a lot of these components. Is the idea that this project is for implementing the OpenChoreo control plane components and then including the system components that link or integrate with the APIs of those other things? Is that where you're drawing the boundary of where your project ends?</p>
<p><strong>Sameera Jayasoma:</strong> Yes, that's a good way to put it. Our main component is the control plane, and at the same time there are certain system components running in all the other planes as well — data planes, observability plane, workflow planes. If you're already running these projects, it's just a matter of installing our system components and organizing your platform architecture in this way. And what Lakmal said about abstractions is that when you think about this developer platform, the primary users are platform engineers and the primary consumers are developers. They will use the experience plane — UI, MCP server, and things like that. They will say "I want a project, I want a component, I want this component deployed on a dev environment," and the control plane understands that and executes and compiles that into Kubernetes and other projects in a way that those projects understand. That's the idea behind all those arrows in the diagram.</p>
<p><strong>Bret Fisher:</strong> When I look at the diagram, from a platform team perspective, I recognize all the names, it's a lot of terminology from different CNCF projects. Are you thinking of AI as the main interaction point? I see there's a web console, but do you think AI is going to be increasingly the way we interact with Kubernetes? When I look at this diagram, all the arrows from how things interact with the Kubernetes cluster seem to go through the OpenChoreo control plane. You've got the Backstage UI, presumably for humans, but then you've got MCP, CLI, and API as other interaction endpoints. When I see this diagram, I think: this allows me to put another abstraction layer for my AI to work through, so I'm not running my AI directly against the Kubernetes native API. I've got this enhanced layer with additional functionality. I see you have authorization and access control, which is a big thing for me lately — how do we minimize the blast radius of giving agents access to different tokens and not giving them root "god" rights to the cluster every day, which I see a lot of people doing by just giving them kubectl admin abilities? Is that the goal of where you see agents being responsible for clusters?</p>
<p><strong>Lakmal Warusawithana:</strong> Yes, exactly, that's described correctly. What we want is: when the developer platform gives the golden path, the guardrails, the policies to our human developer. The same way we want to expose this same golden path to the AI agents that interact within the platform.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agents-as-first-class-citizens-1641">Agents as First-Class Citizens <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=1001s" target="_blank" rel="noopener noreferrer" class="">16:41</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#agents-as-first-class-citizens-1641" class="hash-link" aria-label="Direct link to agents-as-first-class-citizens-1641" title="Direct link to agents-as-first-class-citizens-1641" translate="no">​</a></h3>
<p><strong>Lakmal Warusawithana:</strong> In OpenChoreo, agents are first-class citizens. In the current release, we're exposing two MCP servers: the OpenChoreo control plane MCP server and the OpenChoreo observability MCP server. External agents can interact with these MCPs as well as internal built-in agents. When they interact with the MCP servers, the permissions and all the guardrails apply the same as for a developer user in the platform. It's a unified experience whether it's a human developer, a human SRE, or an agent working as a developer or SRE.</p>
<p><strong>Bret Fisher:</strong> So this shows up as a bunch of MCP tools I could plug into locally. If I've got Claude Code running, I plug in the MCP endpoints. What's the estimated tool count? Are we dealing with 100 tools, 20 tools?</p>
<p><strong>Lakmal Warusawithana:</strong> It depends on the user persona interacting with MCP. We have a developer persona and an SRE persona — they get different tooling based on their role, and based on that, they can do different activities.</p>
<p><strong>Sameera Jayasoma:</strong> Roughly, I would say roughly 100 tools altogether.</p>
<p><strong>Bret Fisher:</strong> Not an insignificant amount of tools. So what you're saying is based on who I'm authing as, which role I'm authing as, I get a scoped set of MCP tools based on my permissions.</p>
<p><strong>Lakmal Warusawithana:</strong> Yes, exactly.</p>
<p><strong>Bret Fisher:</strong> So these agents are coming. You're listing AI agent modules — you've got SRE, FinOps, and Architect. What does that agent mean to me? If I'm on my local harness, are those long-running agents sitting in the cluster? How do I interact with them?</p>
<p><strong>Sameera Jayasoma:</strong> We have internal agents and external agents. They both use the same experience plane, MCP servers, and tools. Claude Code is an external agent. The FinOps, SRE, and Architect agents are platform agents running in the cluster, and they are reacting to certain events. For example, if there's an alert — a lot of 500 errors are going on, the SRE agent will react and give you a report on what's going on and why. You can configure the agent with certain alert types: if you are consuming high memory above a certain limit, the SRE agent will also react. The FinOps agent is similar in that way.</p>
<p><strong>Bret Fisher:</strong> So each of those agents comes predefined with a scope, and presumably through the control plane, I'm plugging those into my messaging apps, into Slack or whatever, and those are how the agents reach out to me. Do they go through a middle layer like an alerting system the way Prometheus does for alerts?</p>
<p><strong>Lakmal Warusawithana:</strong> Yes, at the moment it's going through a middle layer, the alerting system. We have log-based alerting with OpenSearch and the Prometheus layer for metrics. Agents interact with the same layer. The alerting system can be configured with PagerDuty, Slack channel, or other channels — that's how the architecture currently works.</p>
<p><strong>Bret Fisher:</strong> This feels like it's designed to be batteries-included. A lot of the conversations I have, I'm lucky to be in the Agentic DevOps guild I run, and we meet weekly, are around what teams are trying to do right now with agents related to infrastructure. People are in that middle mode right now. The local agent harness has become common knowledge; we've all experimented with GUIs, TUIs, multi-agent management, sessions, and skills. But the minute I have to start running what I call "server agents", these long-running, always-looping agents that are sitting there checking something, continually polling for something, or waiting for a webhook if they're event-driven — these things are probably going to be everywhere, and you're providing a few out of the box defined to do specific things. So I don't have to go find an agent SDK and make up what an agent might do in my cluster, because that's kind of what a lot of us are doing right now — we're writing little agents everywhere, making it up as we go, because we don't really know which parts to automate or which parts they'd be good at. But it feels like this system helps with the context problem, because that's always a really hard problem: what context do I need to give my agent to make it useful and not hallucinate, and how do I get at that stuff at the time it needs it?</p>
<p><strong>Lakmal Warusawithana:</strong> Exactly. The main idea is that we have this ecosystem, and within the ecosystem, we have the agents. The community or even OpenChoreo maintainers will release agents, and then our users can pick and choose which agents to run in their OpenChoreo system. For the SRE agent, the intention is: when something happens, the SRE agent can trigger, and we feed all the logs, metrics, config changes, and code changes to the SRE agent within that window. It can then generate a post-incident report, root cause analysis report, and alert the human SRE. When they come into the system, they already have the root cause report. And we're not stopping there, the agent can also provide remediation actions: "This is a quick fix if you want to fix this issue." At the moment, it's human-in-the-loop, so the human SRE can apply those fixes. But we have the permission model where we can give certain agents the ability to automatically apply fixes themselves rather than waiting for a human. We can say: "If this is only a config change, I will allow my SRE agent to apply that change and fix the issue." So eventually it can take on more activity, but it always has human control built in by design. We know what context we need to feed into this agent to provide better results; that's how the built-in agents are acting.</p>
<p><strong>Sameera Jayasoma:</strong> And these agents are also a good starting point for you to come up with your own agents, because the context problem is largely solved within the platform. These agents work against the OpenChoreo abstraction layer rather than exposing raw Kubernetes details, and that's what we've figured out — those abstraction fields help us give the right context.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-of-agentic-devops-2450">The Future of Agentic DevOps <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=1490s" target="_blank" rel="noopener noreferrer" class="">24:50</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#the-future-of-agentic-devops-2450" class="hash-link" aria-label="Direct link to the-future-of-agentic-devops-2450" title="Direct link to the-future-of-agentic-devops-2450" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> I was writing an article over the last week around what an AI Kubernetes platform even means. What I had to define in this newsletter is what I'm calling "type three AI on Kubernetes." If you've been going to KubeCons since the invention of ChatGPT, for most of the history of what we now call Gen AI, we are not talking about AIOps and MLOps. For those of us that go to KubeCon, I've been ranting for a couple of years now that there's been a weird disconnect, when a lot of people in the industry talk about Kubernetes and AI, they're actually talking about running AI, making AI, building models, reinforcement learning, and running inference. That's not my world. To me that's a specialty, and while it might get easier, I feel like there's still a significant majority of us that won't be doing that. Our new job is to build out these agents and understand where the features and the edges of models can be implemented so we can automate and build more.</p>
<p><strong>Bret Fisher:</strong> I see this whole thing as just like VMs, the cloud, the invention of the PC. Over my 30-year career, we've had major pivoting points in technology that allowed us to scale ourselves as humans. We went from managing 10 servers in the 90s to 100 servers with VMs to a thousand servers with the cloud. Maybe containers allowed us to run 10,000 pods per admin. And now this is the next level. What you all are building is exactly that layer of abstraction; the agents and their context management and permission management, which is this new level of abstraction that will hide some of the complexity. We don't have to know every kubectl command in the world anymore. In fact, I don't even know how we all get Kubernetes certified, because if we're not going to be running kubectl and knowing every option, what is a Kubernetes admin test other than just understanding architecture?</p>
<p><strong>Bret Fisher:</strong> This post took me a week to write because I was trying to theorize: we're really talking about agentic operations. That's the reason I have the new podcast; that's the reason this project is exciting; this is that new layer, the abstraction we're all searching for. I think we've understood the local harness now after having those for a little over a year. But this new nebulous layer sitting in front of our infrastructure is still not fully realized. You all are pretty early in the game in terms of saying, "We can help, we have this defined component." I'm trying to draw a diagram of a maturity path: we started with the agent harness locally, and the end goal is we've maximized the agent assistance — the dozen agents, two dozen agents, maximizing all the functions and features of what models can do for us as DevOps engineers, platform engineers, SREs. We're all managing this infrastructure. There are a dozen tools and a thousand features we now need to learn. We're learning skills and agent files and MCPs that can go awry. But eventually the idea is we're improving productivity, improving management, making things more secure, and reducing outages. A year ago we were all nervous about whether our jobs were going away. But to me, this is the job. This is the new job. Where do the agents help, where do they not help, where do we still need the human in the loop? Does any of that resonate?</p>
<p><strong>Lakmal Warusawithana:</strong> I think you're correct. It's evolved in the last one year, within one year we can run agents in production, helping different personas engage within the platform. I believe the generating code problem is almost solved now with Claude Code, Cursor, or Codex. People can generate code and write applications within minutes. We call it "vibe coding", but the moment they hit deployment, the vibe is ending, because the coded application has to be promoted into production, but the platform doesn't support it. They have to go away from the agent, either create a ticket or go to the self-service portal to deploy the application. What we've seen with our skills and the MCP server is that they can use the same agent they're using to develop their code and say, "I want to deploy my application into the development environment, you figure out how to do it." So now we call it "vibe deployment." OpenChoreo tries to fill the gap on the deployment part, the operational side of it. You can write your code using an agent and now use the same agent to deploy your application into production, with the support of OpenChoreo's abstraction as well as the tools supported in the MCP servers. That's where we want to play in this platform engineering side of it.</p>
<p><strong>Sameera Jayasoma:</strong> And abstractions help agents, the way I think about that is: more abstractions, fewer tokens. They don't have to learn deep Kubernetes YAMLs and kubectl. The same applies to programming languages — writing assembly versus writing in Java or C# or Go, right? Fewer tokens in that way. They have more context with less token budget. That's what I'm working on these days, whether we can establish that.</p>
<p><strong>Bret Fisher:</strong> We're very quickly understanding that tokens are finite, just like early in our Kubernetes journey, we realized how much infrastructure we actually need to just run the apps. When you build out a full-scale Kubernetes cluster, there is a non-insignificant amount of infrastructure to manage the infrastructure, and I don't think we all really understood the eventuality of dozens of different controllers and dedicated nodes in the control plane. I feel like now the same thing is happening with tokens. We got all excited and we're going to put agents everywhere, and we're going to very quickly end up in a world where we've got budgets and we have to optimize our agents. One of the conversations we're having in the Agentic DevOps guild is around evals — how can we use evals to figure out which model to use? If my agents are really just behaving with a bunch of skills and context management stuff, how can I programmatically determine that maybe I could use Gemma or Minimax or Qwen or some openweight model that's super cheap for my very specific niche agent, whereas maybe it doesn't need Opus? None of us want to put these in production and then find out a month later that it's too expensive to run and have to shut it down.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-with-agents-live-demo-3255">Deploying with Agents: Live Demo <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=1975s" target="_blank" rel="noopener noreferrer" class="">32:55</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#deploying-with-agents-live-demo-3255" class="hash-link" aria-label="Direct link to deploying-with-agents-live-demo-3255" title="Direct link to deploying-with-agents-live-demo-3255" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> We've had Innerhive on the show and Mindrol on the show, both AI startups building agents to help with infrastructure CI/CD and fault remediation. The approach I've been seeing everybody take is the normal pattern of engineering: walk before you run, run before you sprint. On day one, you might be read-only. Agents can't do things, they can just look things up, they're a little helper assistant with no control over anything, just here to help you find information in this sea of infinite information about your infrastructure. Then, like with Mindrol, they're now to the point where for very specific use cases they're letting the agent have a tiny bit of control, because it's predictable. They can test to make sure it works, that it's as declarative as possible, and they start to let that happen. Is that something we can do with OpenChoreo? Does it have a default stance of read-only? How do the permissions work?</p>
<p><strong>Lakmal Warusawithana:</strong> It's not read-only, you can control it. We have the permission model where you can give different tools to different agents. It can be read-only tools, it can be write/operational tools as well. Based on what you want to do, you can allow these permissions, because agents have their own identity, and within that identity, they have permissions. Based on the permissions, they can use different tools. If you are confident enough that your agent is performing well, you can give it write permissions to do some level of activity — for example, if there is a configuration issue, the agent can go and fix the configuration itself. You can fine-tune how your agent can interact with your platform.</p>
<p><strong>Bret Fisher:</strong> I've been wondering about how permissions are going to work — so much of our permission models today feel like they're not designed for an agentic world. And how are we going to track the actions of these things? Every little step they take, hopefully will be put into some sort of observability platform. I'm trying to envision how to correlate this to the things we know today; GitOps repos with Argo CD definition files that get pulled in because Argo or Flux is watching a different repo and looking for YAML changes. Does this change that workflow? I see GitOps on the diagram. How does this correlate to the GitOps loop that so many teams have adopted?</p>
<p><strong>Sameera Jayasoma:</strong> The CRDs — you can put all of these in your GitHub repo and then configure Argo CD or Flux, and the normal workflow will work as it is. So there are two modes here. I think we are using more of a click-ops approach in the demo, but you can configure the same thing with your GitOps.</p>
<p><strong>Bret Fisher:</strong> For audio listeners, we're looking at a dashboard. We're vibe-opsing, not click-ops, because we're not clicking on the dashboard; we're using the agent. But just to be clear: the agent is causing OpenChoreo to create new resources inside the cluster for deploying the Google microservices demo. That is an alternative to having an agent make a new PR in YAML and push that to GitHub and then have Argo or Flux pick it up later. I could give the agents skills so that they know that's my workflow and I'm using it as a read-only partner. Just like we're not supposed to go into the AWS console and click-ops away, I don't necessarily want OpenChoreo changing my infrastructure outside of my GitOps loop. Do you think the GitOps approach is less important if we have this sort of agent chain of events, or do you see enterprise teams possibly shifting to more of this vibe approach? Or do you think GitOps is here to stay as the more mature, safe approach?</p>
<p><strong>Lakmal Warusawithana:</strong> When you come to lower environments, agents directly creating custom resources will play a big role. But maybe in production, when you promote to production, people will use GitOps or a declarative way of defining things. Eventually, if the human is confident enough with their agents and trusts them, I would say agents can directly call the MCPs and create custom resources directly within the cluster itself. Not this year, but maybe in the future.</p>
<p><strong>Sameera Jayasoma:</strong> One advantage of GitOps is that you have the tracing — you know exactly what happened over the years. For dev environments, you probably don't need GitOps; you can give developers full capability to do whatever they want. But for other environments, my view is you would still use GitOps to control the workflow.</p>
<p><strong>Bret Fisher:</strong> I started to wonder if agents will eventually change this. Everyone's already writing YAML with agents; teams using Claude Code are not handwriting Kubernetes YAML anymore. And there is a mode in Argo where you can do things retroactively, make changes but document them after you're done. I wonder if agents create a future where GitOps is more of a system of record done after the fact, and agents push us into a faster evolution of this.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sandboxing--sre-auto-remediation-3926">Sandboxing &amp; SRE Auto-Remediation <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=2366s" target="_blank" rel="noopener noreferrer" class="">39:26</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#sandboxing--sre-auto-remediation-3926" class="hash-link" aria-label="Direct link to sandboxing--sre-auto-remediation-3926" title="Direct link to sandboxing--sre-auto-remediation-3926" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> A constant conversation we're having is around sandboxing. Specifically with local agents: every AI I open up by default, even with Claude Code's built-in sandboxing, chances are it has access to my AWS, Docker CLI, kubectl, Terraform, and those keys are all already set up and it could just deploy to things. One of the things I'm trying to work on with some friends is where to draw a boundary around sandboxes. This almost feels like a perfect scenario — these MCP tools and skills, are maybe all in a Docker sandbox, which is more like a VM with a harness running inside it. I only use that particular harness because it has these particular permissions, and I only spin it up when I want to. It's almost like a per-environment configuration and each Docker sandbox has its own isolated configuration, including all your keys. So I'd have my prod harness, my staging harness, and I can interact with those environments and keep them safe away from my normal day-to-day harness. A lot of small teams have too many keys on their local machines — if you're a team of three, chances are you've got the production Terraform key on your machine. Now that we have agents, people are starting to get more concerned: what if it accidentally picks the wrong environment? Can OpenChoreo manage multiple clusters in one instance, or is it per cluster?</p>
<p><strong>Lakmal Warusawithana:</strong> You can manage multiple clusters within one OpenChoreo.</p>
<p><strong>Bret Fisher:</strong> So I almost treat it like an environmental gateway for my agents. I call this "production" and I have this Docker sandbox where the keys to production are only accessible from that sandbox. And maybe I'll also have some GitHub keys in there so my agents in that sandbox can write to the GitOps repo and make PRs for me. I'm now realizing how these things are coming together: I can have one local agent that can see the infrastructure through OpenChoreo, but can also implement GitOps changes based on the information it's getting out of that infrastructure. If the pods are in a pull-backoff loop, the agent can determine that, write the GitOps diff, push that to a PR, and that's how I'm going to be iterating on my cluster now. Or maybe I'm doing it in Slack while I'm at lunch through a Slack bot. Can we use a private LLM to interact with OpenChoreo instead of Claude Code?</p>
<p><strong>Lakmal Warusawithana:</strong> Yes. It's not only Claude Code, it's your model, your choice. You can use any Codex or any other agent. It's just MCP servers you're interacting with. You can use any LLM in your local agent, and in the built-in agents you can also configure your LLM, OpenAI or whatever model you want to configure. It's a configuration for us.</p>
<p><strong>Bret Fisher:</strong> Picking the model for the agents is a good thing because I've got a feeling we're going to need cheaper models for the cluster for the always-on activities. Does the agent have visibility into inter-cell dependency traffic, or is it completely blinded to anything outside its assigned project?</p>
<p><strong>Lakmal Warusawithana:</strong> It depends on the different agent and what context it's interacting with. For example, the SRE agent, when troubleshooting, can go beyond one project, because some components interact with other components in other projects. If there are interactions, the agent can look at what's happening in those other components in other projects. Based on the context the agent is interacting with, it can go beyond a single project to multiple projects.</p>
<p><strong>Bret Fisher:</strong> Just to be clear on the scope — it doesn't appear you're trying to boil the ocean and make OpenChoreo the single control plane for AWS, GCP, and all the other things we manage. It's trying to remain Kubernetes-focused, right? The lowest layer is Kubernetes, and I don't see clouds listed here.</p>
<p><strong>Lakmal Warusawithana:</strong> We are running on top of Kubernetes. We are not even managing Kubernetes with OpenChoreo, we build on top of it. You can run OpenChoreo on EKS or AKS, but we are not managing EKS or AKS. That's how we architect it. But OpenChoreo has a resource abstraction where you can manage cloud resources within OpenChoreo. We have integrated with Crossplane, so the OpenChoreo control plane can talk with the Crossplane integration, and via Crossplane, it can create an S3 bucket in AWS and do the lifecycle management of that bucket. It provides a single unified control plane to manage it, but it's up to users if they want to use it that way.</p>
<p><strong>Sameera Jayasoma:</strong> Just to add to that, there are multiple planes: control plane, data plane, observability plane. You can run each plane in its own Kubernetes cluster, or all planes in one cluster. You can run your control plane locally and your data plane in AWS. You can configure it the way you want. If the data plane is in AWS and the control plane is somewhere else, you don't have to expose the Kubernetes API server to the Internet, there's a certain agent running in the data plane that creates an outbound connection to the control plane. That's sort of the standard these days.</p>
<p><strong>Bret Fisher:</strong> Basically, if you're going to use this to help manage something, it needs to be something running in Kubernetes, probably around the CNCF ecosystem of tooling. This isn't trying to replace Terraform or control CloudFormation or run other infrastructure. That gives me a nice boundary. When we talk about the future of what it means to be an SRE, a DevOps platform engineer, where do the edges of these tools exist? Sure, I could manage everything from Claude Code in theory, but I probably need very scoped things to keep it in line. Having this thing well defined as running on top of Kubernetes means things you can do in Kubernetes it can help with, but maybe it's not the right tool to do everything all in one place. There's a ton of context outside of Kubernetes it would need. At the end of the day we're going to have dozens of agents, and we're going to have an agent management plane where we're all just staring at agent configs and skill files; that's our new job. More markdown.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started--wrap-up-4704">Getting Started &amp; Wrap-Up <a href="https://www.youtube.com/watch?v=AqGWjxEfj2g&amp;list=PLVdG6-clU9GbLu7nxOklqQ-u0mtcTgcw5&amp;index=1&amp;t=2823s" target="_blank" rel="noopener noreferrer" class="">47:04</a><a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#getting-started--wrap-up-4704" class="hash-link" aria-label="Direct link to getting-started--wrap-up-4704" title="Direct link to getting-started--wrap-up-4704" translate="no">​</a></h3>
<p><strong>Bret Fisher:</strong> How can people get started? Is this a Helm chart?</p>
<p><strong>Sameera Jayasoma:</strong> Step one: you've got to have Kubernetes running somewhere. If you go to the openchoreo.dev <a href="https://openchoreo.dev/docs/" target="_blank" rel="noopener noreferrer" class="">documentation page</a>, there are a couple of ways to get started. First, if you want to just try out OpenChoreo, we have a quickstart guide, you just need Docker. There's one command that will install Kubernetes in Docker and then install OpenChoreo on top. Once it's done you get a UI, you get MCP access, all that — it's just 10 minutes, it won't pollute your local environment, and you can just destroy it when you're done. The second option is to have a Kubernetes cluster on your local machine and install OpenChoreo there. The third option is to install OpenChoreo in cloud environments. That's how we've structured the getting started experience.</p>
<p><strong>Bret Fisher:</strong> Does it have databases as part of its deployment — a Redis, or what does the persistence layer look like for those of us deploying this on our clusters?</p>
<p><strong>Sameera Jayasoma:</strong> For the whole OpenChoreo control plane, the main persistent layer is etcd, whatever Kubernetes uses. For Backstage, you can configure Postgres or any other database that Backstage recommends. Apart from that, there's no other persistence.</p>
<p><strong>Lakmal Warusawithana:</strong> For the SRE agent, you can configure it to save incident history and provide context in future incidents, you can configure Postgres or any other database for that.</p>
<p><strong>Bret Fisher:</strong> These agents are doing things and we probably want a history of that. Is it logging through Kubernetes to my existing monitoring and logging platform? If I want to see what my agent did in the last 24 hours, do I just look at my normal monitoring and logging platform?</p>
<p><strong>Lakmal Warusawithana:</strong> Yes, it does all the audit logging itself. Depending on the log module it can be OpenSearch with different indices for logs, what the agent did, what the human did, everything is tracked within the logs.</p>
<p><strong>Bret Fisher:</strong> Are agents pulling infrastructure data in real time, or is there a caching layer you have to deal with to optimize in the OpenChoreo layer?</p>
<p><strong>Lakmal Warusawithana:</strong> At the moment, it's real-time. We are not using any vector DB or caching. We give the agent a time interval context, "Within this time interval you have to pull the logs and metrics," and it will just look in that interval and get all the data to troubleshoot.</p>
<p><strong>Bret Fisher:</strong> So once it sees an event, it already knows exactly when that event happened and can limit itself so that you're not burning a bunch of tokens by boiling the ocean and scanning every log to infinity. Does it need to look at Grafana graphs, or is it just doing Prometheus queries and getting data in real time?</p>
<p><strong>Lakmal Warusawithana:</strong> It goes to the observability MCP server, it's querying through the MCP servers.</p>
<p><strong>Sameera Jayasoma:</strong> This is directly from the observability MCP server talking to OpenSearch and getting the data.</p>
<p><strong>Bret Fisher:</strong> So it's a little bit simpler than having to constantly store everything as a cache, which in theory would make the agent faster, but also has a lot of complexity and resource utilization. That gets back to the point that at some point everybody has that infrastructure where they realize they have a cluster with more resources used for the infrastructure than for the actual apps — you know, the app only costs $100 a month to run but the infrastructure costs $10,000 a day.</p>
<p><strong>Bret Fisher:</strong> This has been very cool. I could talk to you for another hour about this because I'm really interested in the patterns and architecture design that you've learned. These are things we're going to have to do the same thing for our cloud infrastructure, our line of business apps, we're going to have to figure out how to give agents a deeper understanding of that infrastructure so we can depend on them more and rely less on the human tribal knowledge we all have about how these systems are put together. My friends call it "the sins of the data center" and this thing is going to have to know all that. Viktor Farcic, who runs the DevOps Toolkit channel, talks about how Claude Code is the center of the universe for him and that anybody creating a project that isn't expected to be local-harness-first is creating an outdated project. This feels like it's doing exactly what he was predicting over the last year, the harness is your gateway to all this infrastructure, and everything else needs to be there to support that. All right, people get started at <a href="https://openchoreo.dev/" target="_blank" rel="noopener noreferrer" class="">openchoreo.dev</a> and you're on LinkedIn, X, and CNCF Slack?</p>
<p><strong>Lakmal Warusawithana:</strong> We have <a href="https://x.com/openchoreo" target="_blank" rel="noopener noreferrer" class="">X</a> and <a href="https://www.linkedin.com/company/openchoreo" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a> pages, and also the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> channel. We actively engage there. And we use <a href="https://github.com/openchoreo/openchoreo/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a> a lot.</p>
<p><strong>Bret Fisher:</strong> I love GitHub Discussions. I wish they were used more rather than issues, a lot of things just need to start in discussions before they go to issues. Thank you both so much for being here. Last quick thing, what's next? What big PRs are coming down the pike?</p>
<p><strong>Lakmal Warusawithana:</strong> More agents.</p>
<p><strong>Sameera Jayasoma:</strong> More agents.</p>
<p><strong>Bret Fisher:</strong> Could have guessed it. More AI overlords. Thank you so much for being here. Thanks everybody in chat for being with us and we'll see you in the next one.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started-with-openchoreo">Get Started with OpenChoreo<a href="https://openchoreo.dev/blog/k8s-maxxing-with-ai-native-platform-engineering-stack-with-openchoreo/#get-started-with-openchoreo" class="hash-link" aria-label="Direct link to Get Started with OpenChoreo" title="Direct link to Get Started with OpenChoreo" translate="no">​</a></h2>
<p>OpenChoreo is open source and free to use. The best next step is to try it yourself.</p>
<ul>
<li class="">Check out the <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">website</a></li>
<li class="">Try out the <a href="https://openchoreo.dev/docs/getting-started/quick-start-guide/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_k8smaxingtranscript_062526" target="_blank" rel="noopener noreferrer" class="">quickstart guide</a></li>
<li class="">Star the <a href="https://github.com/openchoreo/openchoreo" target="_blank" rel="noopener noreferrer" class="">repository</a></li>
<li class="">Join #openchoreo on <a href="https://cloud-native.slack.com/channels/openchoreo" target="_blank" rel="noopener noreferrer" class="">Slack</a></li>
</ul>]]></content:encoded>
        </item>
        <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 <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_platformsdontwin_060526" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a>, 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><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_selfservicedatabases_051926" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_selfservicedatabases_051926">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 <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_v1.1releaseblog_051926" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_v1.1releaseblog_051926" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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/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/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/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/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/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/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_v1.1releaseblog_051926" 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 <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_openchoreologo_051026" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a>, 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 <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_joinscncf_032326" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_joinscncf_032326" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_joinscncf_032326" 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 <a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_kubeconeu_031426" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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><a href="https://openchoreo.dev/?utm_source=mp&amp;utm_medium=link&amp;utm_campaign=blog_link_global_openchoreo_developerabstractions_121525" target="_blank" rel="noopener noreferrer" class="">OpenChoreo</a> 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>