<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Crossplane on Dev &amp; Platform Engineering Hub</title><link>https://rhidayat.work/topics/crossplane/</link><description>Recent content in Crossplane on Dev &amp; Platform Engineering Hub</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Rachmat Hidayat</copyright><lastBuildDate>Sun, 09 Aug 2026 20:30:00 +0000</lastBuildDate><atom:link href="https://rhidayat.work/topics/crossplane/index.xml" rel="self" type="application/rss+xml"/><item><title>Kratix Ep 3: Kratix GitOps vs Crossplane GitOps</title><link>https://rhidayat.work/series/kratix/03-kratix-gitops-vs-crossplane-gitops/</link><pubDate>Sun, 09 Aug 2026 20:30:00 +0000</pubDate><guid>https://rhidayat.work/series/kratix/03-kratix-gitops-vs-crossplane-gitops/</guid><description>Crossplane uses GitOps to provision AWS infrastructure. Kratix uses GitOps to orchestrate Promises. This frequently leads to severe architectural confusion for teams adopting Platform Engineering. In this episode, we define the exact boundary between the two tools and learn how they complement each other in a Production IDP.</description></item><item><title>Crossplane Ep 15: Building an IDP with Backstage</title><link>https://rhidayat.work/series/crossplane/advanced/15-building-an-idp-with-backstage/</link><pubDate>Sun, 09 Aug 2026 19:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/15-building-an-idp-with-backstage/</guid><description>We have built the APIs, the translation engine, the GitOps pipeline, and the security webhooks. But developers still have to write YAML to request a database. In this final episode, we integrate Crossplane with Backstage to create the ultimate Internal Developer Portal (IDP).</description></item><item><title>Crossplane Ep 14: Custom Composition Webhooks</title><link>https://rhidayat.work/series/crossplane/advanced/14-custom-composition-webhooks/</link><pubDate>Sun, 09 Aug 2026 19:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/14-custom-composition-webhooks/</guid><description>OpenAPI schema validation (like &lt;code&gt;type: integer&lt;/code&gt;) is too basic for enterprise security. What if you need to enforce that a database&amp;rsquo;s storage size is an even number, or that the requested environment matches a specific regex? In this episode, we write a Kubernetes Validating Webhook in Go to intercept and inspect Crossplane Claims.</description></item><item><title>Crossplane Ep 13: Provider Families and Performance</title><link>https://rhidayat.work/series/crossplane/advanced/13-provider-family-and-performance/</link><pubDate>Sun, 09 Aug 2026 19:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/13-provider-family-and-performance/</guid><description>If you install the monolithic &lt;code&gt;provider-aws&lt;/code&gt; package into a small EKS cluster, your Kubernetes API server might crash. AWS has over 1,000 resources, meaning Crossplane will inject 1,000 CRDs and run a massive Go controller in memory. In this episode, we learn how to architect high-performance Crossplane clusters using Provider Families.</description></item><item><title>Crossplane Ep 12: GitOps with ArgoCD and Crossplane</title><link>https://rhidayat.work/series/crossplane/advanced/12-gitops-with-argocd-and-crossplane/</link><pubDate>Sun, 09 Aug 2026 19:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/12-gitops-with-argocd-and-crossplane/</guid><description>If you are running &lt;code&gt;kubectl apply -f my-database.yaml&lt;/code&gt; from your laptop, you are doing it wrong. In modern Platform Engineering, no human should ever talk directly to the Kubernetes API. In this episode, we configure ArgoCD to automatically deploy Crossplane XRs directly from a GitHub repository.</description></item><item><title>Crossplane Ep 11: Writing Composition Functions in Go</title><link>https://rhidayat.work/series/crossplane/advanced/11-writing-composition-functions-in-go/</link><pubDate>Sun, 09 Aug 2026 19:00:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/advanced/11-writing-composition-functions-in-go/</guid><description>In Episode 10, we learned that Composition Functions allow us to escape the limitations of YAML. In this episode, we will write a custom Go program that dynamically generates an array of AWS Subnets based on a single integer provided by the Application Developer.</description></item><item><title>Crossplane Ep 10: Introduction to Composition Functions</title><link>https://rhidayat.work/series/crossplane/intermediate/10-composition-functions-introduction/</link><pubDate>Sun, 09 Aug 2026 18:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/10-composition-functions-introduction/</guid><description>YAML is excellent for configuration, but terrible for programming. As your Platform scales, you will inevitably need &lt;code&gt;for&lt;/code&gt; loops, complex &lt;code&gt;if/else&lt;/code&gt; logic, and external API calls. In this final intermediate episode, we introduce Composition Functions—the architecture that allows you to write Crossplane logic in Turing-complete languages.</description></item><item><title>Crossplane Ep 9: Troubleshooting Sync Errors</title><link>https://rhidayat.work/series/crossplane/intermediate/09-troubleshooting-crossplane-sync-errors/</link><pubDate>Sun, 09 Aug 2026 18:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/09-troubleshooting-crossplane-sync-errors/</guid><description>When you run &lt;code&gt;terraform apply&lt;/code&gt;, you get immediate red text in your console if an AWS API call fails. Because Crossplane is an asynchronous control loop, &lt;code&gt;kubectl apply&lt;/code&gt; always succeeds immediately. When a database fails to boot 10 minutes later, how do you find the error? In this episode, we learn the Crossplane troubleshooting cascade.</description></item><item><title>Crossplane Ep 8: Managing Dependencies Between Resources</title><link>https://rhidayat.work/series/crossplane/intermediate/08-managing-dependencies-between-resources/</link><pubDate>Sun, 09 Aug 2026 18:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/08-managing-dependencies-between-resources/</guid><description>If a Composition provisions both an AWS VPC and a Subnet, the Subnet physically cannot be created until the VPC exists and returns an ID. In Terraform, you use implicit dependency mapping (e.g., &lt;code&gt;vpc_id = aws_vpc.main.id&lt;/code&gt;). In Crossplane, we manage this using Cross-Resource References and Selector matching.</description></item><item><title>Crossplane Ep 7: Environment Configs</title><link>https://rhidayat.work/series/crossplane/intermediate/07-environment-configs/</link><pubDate>Sun, 09 Aug 2026 18:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/07-environment-configs/</guid><description>If your company has three clusters (Development, Staging, and Production), you do not want to write three different Compositions for the same RDS database. In this episode, we learn how to use Crossplane EnvironmentConfigs to inject global context (like AWS Account IDs, VPC IDs, and Regions) dynamically into your Compositions.</description></item><item><title>Crossplane Ep 6: Patching and Transforms</title><link>https://rhidayat.work/series/crossplane/intermediate/06-patching-and-transforms/</link><pubDate>Sun, 09 Aug 2026 18:00:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/intermediate/06-patching-and-transforms/</guid><description>In Episode 5, we hardcoded our RDS instance size to 20GB. If a developer asked for 50GB in their Claim, Crossplane ignored it. In this episode, we explore the Patcher, learning how to dynamically route data from the Composite Resource (XR) into the physical Managed Resources (MRs).</description></item><item><title>Crossplane Ep 5: Compositions</title><link>https://rhidayat.work/series/crossplane/fundamental/05-compositions/</link><pubDate>Sun, 09 Aug 2026 17:50:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/05-compositions/</guid><description>In Episode 4, we built an API (XRD) but it didn&amp;rsquo;t actually create any AWS infrastructure. In this final fundamental episode, we write a Composition. This is the &amp;rsquo;translation engine&amp;rsquo; that instructs Crossplane exactly which physical Managed Resources to create when a developer requests our custom API.</description></item><item><title>Crossplane Ep 4: Composite Resources (XR)</title><link>https://rhidayat.work/series/crossplane/fundamental/04-composite-resources-xr/</link><pubDate>Sun, 09 Aug 2026 17:40:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/04-composite-resources-xr/</guid><description>Managed Resources (MRs) are too low-level for application developers. In this episode, we learn how to define a Composite Resource Definition (XRD). This allows Platform Engineers to design a brand new, highly abstracted Custom Kubernetes API tailored exactly to their company&amp;rsquo;s needs.</description></item><item><title>Crossplane Ep 3: Managed Resources (MR)</title><link>https://rhidayat.work/series/crossplane/fundamental/03-managed-resources-mr/</link><pubDate>Sun, 09 Aug 2026 17:30:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/03-managed-resources-mr/</guid><description>A Managed Resource (MR) is the foundational building block of Crossplane. It is a 1-to-1 representation of a physical cloud object (like an S3 Bucket or an RDS Instance) stored as a Custom Resource in Kubernetes. In this episode, we provision our first AWS resource directly via kubectl.</description></item><item><title>Crossplane Ep 2: Providers and Credentials</title><link>https://rhidayat.work/series/crossplane/fundamental/02-providers-and-credentials/</link><pubDate>Sun, 09 Aug 2026 17:20:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/02-providers-and-credentials/</guid><description>Crossplane is useless on its own. To orchestrate AWS, Azure, or GCP, we must install Providers. In this episode, we install the official Upbound AWS Provider, configure Kubernetes Secrets to store our IAM credentials, and bind them to a ProviderConfig.</description></item><item><title>Crossplane Ep 1: The Kubernetes Native Control Plane</title><link>https://rhidayat.work/series/crossplane/fundamental/01-the-kubernetes-native-control-plane/</link><pubDate>Sun, 09 Aug 2026 17:10:00 +0000</pubDate><guid>https://rhidayat.work/series/crossplane/fundamental/01-the-kubernetes-native-control-plane/</guid><description>To understand Crossplane, you must first understand the Kubernetes Control Loop. In this episode, we explore the theoretical difference between CLI-driven IaC (Terraform) and Control Plane IaC (Crossplane). We will then install Crossplane into a local cluster using Helm.</description></item></channel></rss>