<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloud-Native on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/cloud-native/</link><description>Recent content in Cloud-Native 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/cloud-native/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>Kubernetes</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/</guid><description>&lt;p&gt;Kubernetes (K8s) is the de facto standard for container orchestration and the second largest open source project after the Linux kernel. It has well and truly reached the plateau of productivity — the ecosystem is mature and it genuinely delivers.&lt;/p&gt;
&lt;p&gt;That said, the honest take: &lt;strong&gt;K8s is ridiculously hard to deploy and manage&lt;/strong&gt; (day 2 operations especially). Docker Swarm is equally ridiculously easy to get started with. For raw scale, Mesos/DC/OS wins — clusters of 80k+ nodes have been documented in the wild, versus K8s master&amp;rsquo;s practical ceiling of around 5k nodes.&lt;/p&gt;
&lt;p&gt;So the real question is whether the ecosystem justifies the complexity for your situation. For most teams doing cloud-native work, it does.&lt;/p&gt;
&lt;h2 id="core-concepts"&gt;Core concepts
&lt;/h2&gt;&lt;p&gt;The main building blocks:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pods&lt;/strong&gt; — smallest deployable unit, wrapping one or more containers that share network and storage.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pods" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/pods.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deployments&lt;/strong&gt; — declare desired state; K8s handles rolling updates and self-healing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Deployments" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/deployments.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secrets&lt;/strong&gt; — store sensitive data (passwords, tokens, keys) separately from application config.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Secrets" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/secrets.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DaemonSets&lt;/strong&gt; — run a pod on every node. Typical use: log collectors, monitoring agents.&lt;/p&gt;
&lt;p&gt;&lt;img alt="DaemonSets" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/daemonsets.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ReplicaSets&lt;/strong&gt; — ensure N copies of a pod are running at any given time.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ReplicaSets" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/replicasets.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt; — HTTP/S routing rules at layer 7. Your load balancer config, declarative.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ingress" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="1920" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/ingress.png" srcset="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/ingress_hu_b0bb8a58e86a1fe2.png 800w, https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/ingress_hu_34af71a3280d9a15.png 1600w, https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/ingress.png 2400w" width="2400"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CronJobs&lt;/strong&gt; — scheduled jobs, K8s-native.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CronJobs" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/cronjobs.png" width="800"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom Resource Definitions (CRDs)&lt;/strong&gt; — extend the K8s API with your own resource types. The foundation of most K8s operators.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CRDs" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/crd.png" width="800"&gt;&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture
&lt;/h2&gt;&lt;p&gt;How the pieces fit together internally:&lt;/p&gt;
&lt;p&gt;&lt;img alt="K8s internal architecture" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="1280" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/inner.png" srcset="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/inner_hu_ca8f0543462c084c.png 800w, https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/inner.png 1600w" width="1600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="K8s component overview" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="640" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/zoo.png" width="800"&gt;&lt;/p&gt;
&lt;h2 id="containers-vs-virtual-machines"&gt;Containers vs virtual machines
&lt;/h2&gt;&lt;p&gt;Not an either/or — they solve different problems and are frequently combined.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Separate: containers alongside VMs" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="1280" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/seperate.png" srcset="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/seperate_hu_557182bcbb415ab4.png 800w, https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/seperate.png 1600w" width="1600"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Combined: containers running on top of VMs" class="gallery-image" data-flex-basis="300px" data-flex-grow="125" height="1280" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/combined.png" srcset="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/combined_hu_9f383172dd98181c.png 800w, https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/kubernetes/combined.png 1600w" width="1600"&gt;&lt;/p&gt;
&lt;h2 id="local-clusters-for-development"&gt;Local clusters for development
&lt;/h2&gt;&lt;p&gt;When you need K8s without a full cluster:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Best for&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://microk8s.io/" target="_blank" rel="noopener"
 &gt;MicroK8s&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Ubuntu, snap-based, batteries included&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://minikube.sigs.k8s.io/" target="_blank" rel="noopener"
 &gt;Minikube&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;The classic, broad driver support&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener"
 &gt;Kind&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;K8s in Docker, great for CI pipelines&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://k3d.io/" target="_blank" rel="noopener"
 &gt;K3D&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;K3s in Docker, fast startup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://k3s.io/" target="_blank" rel="noopener"
 &gt;K3S&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Lightweight K8s, edge and IoT use cases&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/" target="_blank" rel="noopener"
 &gt;kubernetes.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://landscape.cncf.io/" target="_blank" rel="noopener"
 &gt;CNCF Landscape&lt;/a&gt; — map of the cloud-native ecosystem&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=PH-2FfFD2PU" target="_blank" rel="noopener"
 &gt;TGI Kubernetes intro (YouTube)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://igy.cx/posts/setup-microk8s-rbac-storage/" target="_blank" rel="noopener"
 &gt;Setting up MicroK8s with RBAC and Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>