<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operator on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/operator/</link><description>Recent content in Operator on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/operator/index.xml" rel="self" type="application/rss+xml"/><item><title>Crossplane</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/crossplane/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/crossplane/</guid><description>&lt;p&gt;Crossplane is Kubernetes-native infrastructure management. Where Terraform runs as a CLI tool that applies changes and exits, Crossplane runs as a controller inside a Kubernetes cluster and continuously reconciles infrastructure — the same control loop model as Kubernetes itself.&lt;/p&gt;
&lt;p&gt;Cloud resources become Kubernetes objects. You &lt;code&gt;kubectl apply&lt;/code&gt; an RDS instance the same way you apply a Deployment. Crossplane&amp;rsquo;s controllers watch those objects and make the API calls to converge actual infrastructure to the desired state.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="core-concepts"&gt;Core concepts
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Providers&lt;/strong&gt; extend Crossplane with CRDs for a specific cloud. &lt;code&gt;provider-aws&lt;/code&gt; adds Kubernetes resources for every AWS service — S3 buckets, RDS instances, VPCs. Apply a provider, get hundreds of new resource types.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Managed Resources (MRs)&lt;/strong&gt; are the individual cloud resources:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;s3.aws.upbound.io/v1beta1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Bucket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;my-assets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;forProvider&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;region&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;eu-central-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tags&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Environment&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;prod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crossplane creates this bucket and keeps it in sync. If someone deletes it outside of Crossplane, the controller recreates it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Composite Resources (XRs)&lt;/strong&gt; are the powerful part. You define your own CRDs — a &lt;code&gt;Platform&lt;/code&gt; or &lt;code&gt;DatabaseCluster&lt;/code&gt; — that compose multiple managed resources. A developer applies a &lt;code&gt;DatabaseCluster&lt;/code&gt; and gets an RDS instance, a subnet group, a parameter group, and security groups, all wired together, without needing to know any of the details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XRDs (Composite Resource Definitions)&lt;/strong&gt; define the schema for composite resources — what fields the developer sees, what defaults apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compositions&lt;/strong&gt; define how a composite resource maps to managed resources — the implementation behind the abstraction.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-platform-engineering-model"&gt;The platform engineering model
&lt;/h2&gt;&lt;p&gt;Crossplane&amp;rsquo;s real value is as a platform layer. A platform team owns the Compositions — they define what a &amp;ldquo;compliant database&amp;rdquo; or &amp;ldquo;standard app environment&amp;rdquo; looks like. Dev teams consume the simplified abstractions without touching the underlying cloud resources.&lt;/p&gt;
&lt;p&gt;Self-service infrastructure with guardrails baked in.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="vs-terraform"&gt;vs Terraform
&lt;/h2&gt;&lt;p&gt;Crossplane and Terraform are not direct alternatives — they solve the problem differently.&lt;/p&gt;
&lt;p&gt;Terraform is a CLI tool: run plan, review, apply, exit. State is a file. Good for human-in-the-loop workflows and one-off provisioning.&lt;/p&gt;
&lt;p&gt;Crossplane is a control plane: always running, always reconciling. Better for continuous enforcement and self-service platforms. More complex to set up and operate.&lt;/p&gt;
&lt;p&gt;In practice: Terraform for provisioning foundational infrastructure (clusters, networks, accounts). Crossplane for what runs on top of the cluster — letting application teams provision their own databases, queues, and object storage through Kubernetes-native APIs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="upbound"&gt;Upbound
&lt;/h2&gt;&lt;p&gt;The commercial platform behind Crossplane. Managed control plane hosting, a marketplace of providers and compositions, and tooling for building and publishing your own platform APIs. Worth evaluating if you are building a serious internal platform.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="learning-curve"&gt;Learning curve
&lt;/h2&gt;&lt;p&gt;Steep. You need to understand Kubernetes controllers, CRDs, and the Crossplane composition model before you can be productive. The payoff is a genuinely powerful platform abstraction — but it is not a beginner tool.&lt;/p&gt;
&lt;p&gt;A good framing: Crossplane is a &lt;strong&gt;digital twin of your infrastructure&lt;/strong&gt;. The cluster holds the desired state of everything — cloud resources, application configuration, other tools — and continuously reconciles reality to match it.&lt;/p&gt;
&lt;p&gt;Genuinely cool and worth learning if you have a cluster. The provider model has expanded well beyond cloud infrastructure — from v2 onwards Crossplane can manage applications, not just infra. There are also providers for Ansible and Terraform/OpenTofu, which means Crossplane can be the orchestration layer that drives other IaC tools. One control plane to rule them all.&lt;/p&gt;
&lt;p&gt;The prerequisite is the cluster itself. If you already run Kubernetes, Crossplane is a natural extension of the same model you already operate. If you do not, it is not the tool to start with.&lt;/p&gt;</description></item><item><title>Rook</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/rook/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/rook/</guid><description>&lt;p&gt;Rook is a Kubernetes operator that deploys and manages storage systems — primarily &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/cloud-infrastructure/ceph/" &gt;Ceph&lt;/a&gt; — as native Kubernetes resources. The distinction: Ceph is the storage system; Rook is the Kubernetes wiring around it.&lt;/p&gt;
&lt;p&gt;Without Rook you would run Ceph manually (or via &lt;code&gt;cephadm&lt;/code&gt;) and then configure the Kubernetes CSI driver separately. Rook collapses that into CRDs and handles the full lifecycle: deployment, configuration, expansion, upgrades, and failure recovery.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="how-it-works"&gt;How it works
&lt;/h2&gt;&lt;p&gt;Rook introduces several CRDs:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CephCluster&lt;/strong&gt; — declares the cluster: which nodes, which disks to use as OSDs, replication settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CephBlockPool&lt;/strong&gt; — defines a Ceph pool (replication factor, failure domain). Maps to an RBD pool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;StorageClass&lt;/strong&gt; — references a CephBlockPool and enables dynamic PVC provisioning. Kubernetes workloads request storage; Rook/Ceph fulfils it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CephFilesystem&lt;/strong&gt; — deploys CephFS + MDS for POSIX shared filesystem access.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CephObjectStore&lt;/strong&gt; — deploys the Ceph RGW S3-compatible object storage gateway.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="typical-install-sequence"&gt;Typical install sequence
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://raw.githubusercontent.com/rook/rook/refs/tags/v1.17.9/deploy/examples/crds.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://raw.githubusercontent.com/rook/rook/refs/tags/v1.17.9/deploy/examples/common.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://raw.githubusercontent.com/rook/rook/refs/tags/v1.17.9/deploy/examples/operator.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then apply a &lt;code&gt;CephCluster&lt;/code&gt; manifest declaring your storage topology, followed by &lt;code&gt;CephBlockPool&lt;/code&gt; and &lt;code&gt;StorageClass&lt;/code&gt; for PVC support.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="single-node-considerations"&gt;Single-node considerations
&lt;/h2&gt;&lt;p&gt;A single-node setup requires &lt;code&gt;allowMultiplePerNode: true&lt;/code&gt; in the &lt;code&gt;CephCluster&lt;/code&gt; spec (MONs, MGR, and OSDs all land on the same node). Replication &lt;code&gt;size&lt;/code&gt; must be set to &lt;code&gt;1&lt;/code&gt; — there is nowhere else to replicate. This works for experimentation; it is not a production configuration. See &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/cloud-infrastructure/ceph/" &gt;Ceph&lt;/a&gt; for details on the replication model.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="related"&gt;Related
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://rook.io/docs/rook/latest/" target="_blank" rel="noopener"
 &gt;Rook documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/cloud-infrastructure/ceph/" &gt;Ceph&lt;/a&gt; — the underlying storage system&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/rook-ceph/" &gt;Rook + Ceph in the homelab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>