<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Chris Wagner</title><link>/posts/</link><description>Recent content in Posts on Chris Wagner</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>cw@wagner.org.za (Chrisando Wagner)</managingEditor><webMaster>cw@wagner.org.za (Chrisando Wagner)</webMaster><copyright>© 2026 Chrisando Wagner</copyright><lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Why I Started Thinking Like a Platform-Engineering Product Owner, Not Just a DevOps Engineer</title><link>/posts/from-devops-to-platform-engineer/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/from-devops-to-platform-engineer/</guid><description>&lt;p&gt;Over the last few weeks I&amp;rsquo;ve been laying out how platform engineering grew out of DevOps practice, and what actually separates the two once you stop treating them as synonyms. This post is smaller than either of those, and more personal. It&amp;rsquo;s not an argument about where the industry is heading. It&amp;rsquo;s about a question I noticed I&amp;rsquo;d started asking myself before any other question, and what changed once I did.&lt;/p&gt;</description></item><item><title>Low-GL Beef and Red Cabbage Stew</title><link>/posts/beef-and-red-cabbage-stew/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/beef-and-red-cabbage-stew/</guid><description>&lt;p&gt;A beef stew that leans on braised red cabbage for body instead of potatoes or barley, so it stays low on the glycemic load. It&amp;rsquo;s a slow cook — most of the time is the pot doing its own thing — but the searing and base-building at the start is what decides whether it tastes of anything. Writing it down here while it&amp;rsquo;s fresh so the next attempt starts from a checklist instead of memory.&lt;/p&gt;</description></item><item><title>What My Homelab Pipeline Would Look Like as an Internal Developer Platform</title><link>/posts/building-golden-paths-from-my-pipeline/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/building-golden-paths-from-my-pipeline/</guid><description>&lt;p&gt;I&amp;rsquo;ve been building toward this over the last couple of weeks — writing about how platform engineering split off from DevOps as a discipline, and about the difference between &amp;ldquo;we all own operations&amp;rdquo; as a culture and a team whose actual job is building the platform other teams stand on. This post is where I stop talking about that distinction in the abstract and point it at something I&amp;rsquo;ve actually built.&lt;/p&gt;</description></item><item><title>Creamy Bacon Carbonara</title><link>/posts/creamy-bacon-carbonara/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/creamy-bacon-carbonara/</guid><description>&lt;p&gt;This is the creamy version — cream in the sauce, onion and garlic in the pan — not the Roman one with just egg, cheese and pasta water. Purists can look away. It&amp;rsquo;s a weeknight cook: the whole thing takes about as long as the pasta needs to boil, and the only real skill is getting the egg in off the heat so it turns into a sauce instead of scrambled egg.&lt;/p&gt;</description></item><item><title>Steak Fajitas</title><link>/posts/steak-fajitas/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/steak-fajitas/</guid><description>&lt;p&gt;Marinated skirt steak seared hard, peppers and onions charred in the same pan while the meat rests, and warm tortillas to wrap it all in. It&amp;rsquo;s a fast cook once the steak has had its time in the marinade — everything after that happens in about fifteen minutes. This is the base recipe, now with photos from the first proper run at it.&lt;/p&gt;
&lt;figure&gt;
&lt;img class="my-0 rounded-md nozoom max-w-xl mx-auto" src="../../images/cooking/steak-fajitas/steak-fajitas-plated.JPEG" alt="Folded steak fajita with griddle marks, guacamole and sour cream on the side" /&gt;
&lt;/figure&gt;
&lt;h2 class="relative group"&gt;Steak Fajitas
&lt;div id="steak-fajitas" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#steak-fajitas" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Servings:&lt;/strong&gt; 4&lt;/p&gt;</description></item><item><title>DevOps Is a Culture. Platform Engineering Is a Product Team. That Difference Matters More Than People Admit</title><link>/posts/devops-vs-platform-engineering/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/devops-vs-platform-engineering/</guid><description>&lt;p&gt;I covered where platform engineering actually comes from last week — the short version is that it&amp;rsquo;s what happens when &amp;ldquo;you build it, you run it&amp;rdquo; hits an organisation large enough that nobody can hold the whole picture in their head any more. This week I want to sit with a distinction that gets blurred constantly, in job specs, in conference talks, in the way people casually use &amp;ldquo;DevOps team&amp;rdquo; and &amp;ldquo;platform team&amp;rdquo; as if they&amp;rsquo;re the same noun with a rebrand: &lt;strong&gt;they are not the same thing, in kind, not just in degree.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Sunday Spread: Roast Chicken, Frikadelle, Spicy Rice and Creamy Spinach</title><link>/posts/sunday-roast-chicken-frikadelle-spicy-rice/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/sunday-roast-chicken-frikadelle-spicy-rice/</guid><description>&lt;figure&gt;
&lt;img class="my-0 rounded-md nozoom max-w-xl mx-auto" src="../../images/cooking/roast-chicken-frikadelle-spicy-rice.jpg" alt="Sunday Spread - Roast Chicken, Frikadelle, Spicy Rice and Creamy Spinach" /&gt;
&lt;/figure&gt;
&lt;p&gt;Braai leftovers from yesterday are long gone, so today&amp;rsquo;s the proper sit-down Sunday lunch — four things on the go at once, all timed to land on the table together. Roast chicken is the anchor, done simply with herb butter under the skin so the skin actually crisps. Frikadelle is the second protein, more because I had the mince in the freezer than any grand plan, but baked meatballs and roast chicken share an oven happily enough. The rice needed to be something with enough heat and acidity to stand up to two rich proteins instead of just soaking up gravy, so it went Mexican instead of the usual plain jeera rice. And the spinach and cheese bake is there to round the whole plate out — it&amp;rsquo;s rich on its own, but next to chicken and frikadelle it reads as the vegetable course, which is doing it a favour. Writing all four down together since they were cooked together and the timing is half the trick.&lt;/p&gt;</description></item><item><title>Creamy Potato Salad for the Braai</title><link>/posts/creamy-potato-salad/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/creamy-potato-salad/</guid><description>&lt;p&gt;Peri-peri chicken and spicy boerewors do a lot of the work on a braai plate, so the potato salad&amp;rsquo;s job is to cool things down, not compete for attention. This version leans on mayo and a spoon of mustard for tang, boiled egg for richness, and just enough crunch from celery and spring onion that it doesn&amp;rsquo;t turn into mash by the time it&amp;rsquo;s dished up. Boil the potatoes properly, dress them while they&amp;rsquo;re still warm, and it does the rest of the work on its own.&lt;/p&gt;</description></item><item><title>Tangy Coleslaw for the Braai</title><link>/posts/tangy-coleslaw/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/tangy-coleslaw/</guid><description>&lt;p&gt;Most coleslaw at a braai is an afterthought — a tub of the sweet, mayo-heavy stuff sitting next to the meat doing nothing for it. I want the opposite: something sharp enough to cut through grilled spicy boerewors and peri-peri chicken, not compete with it for richness. This version is vinegar-forward with a spoon of Dijon for backbone, just enough mayo to bind it, and it holds up sitting out on a table in the sun for a couple of hours, which the mayo-loaded versions don&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Garlic Naan, Stovetop</title><link>/posts/garlic-naan/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/garlic-naan/</guid><description>&lt;p&gt;There are a few ways to get to naan — some skip the yeast, some skip the dairy and go vegan with plant milk and oil. This is the version I keep coming back to: yeast-leavened, milk and yogurt in the dough, cooked on a hot tawa with a lid to trap steam and puff it up. No tandoor, no oven required, and the dairy is what gives it that soft, slightly tangy chew instead of a flatbread texture.&lt;/p&gt;</description></item><item><title>Butter Chicken, My Way</title><link>/posts/butter-chicken/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/butter-chicken/</guid><description>&lt;p&gt;Butter chicken done as two builds, not one pot — marinate and char the chicken first, then a separate makhani gravy that the chicken finishes in. Takes longer than dumping everything in together, but the char you get from the grill is the difference between restaurant butter chicken and boiled chicken in tomato sauce. Writing it down before I forget the ratios again.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Butter Chicken
&lt;div id="butter-chicken" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#butter-chicken" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;h3 class="relative group"&gt;Ingredients
&lt;div id="ingredients" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#ingredients" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;For the chicken marinade&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Platform Engineering Didn't Replace DevOps — It's DevOps Grown Up Enough to Ship as a Product</title><link>/posts/devops-platform-engineering-lineage/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/devops-platform-engineering-lineage/</guid><description>&lt;p&gt;I keep seeing some version of the same argument on LinkedIn: platform engineering is killing DevOps, or DevOps was always a fad and platform engineering is the &amp;ldquo;real&amp;rdquo; discipline that replaced it, or — my least favourite — that the two terms are just marketing labels for the same job with a new coat of paint every few years so vendors have something to sell at KubeCon. None of that matches what I&amp;rsquo;ve actually watched happen, either in my own homelab or in twenty-five years of building infrastructure for other people&amp;rsquo;s businesses. So this is post one of five where I want to work through it properly, using a pipeline I actually operate rather than a diagram borrowed from a vendor deck.&lt;/p&gt;</description></item><item><title>Sunday Classic: Mutton Curry</title><link>/posts/mutton-curry-and-roti/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/mutton-curry-and-roti/</guid><description>&lt;p&gt;A mutton curry with roti — stovetop, spice-forward, and forgiving if you walk away from the pot for five minutes. Writing it down here while it&amp;rsquo;s fresh so the next attempt starts from a checklist instead of memory.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Mutton Curry
&lt;div id="mutton-curry" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#mutton-curry" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;h3 class="relative group"&gt;Ingredients
&lt;div id="ingredients" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#ingredients" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1kg mutton (bone-in, curry cut)&lt;/li&gt;
&lt;li&gt;3 tbsp oil or ghee&lt;/li&gt;
&lt;li&gt;2 large onions, finely sliced&lt;/li&gt;
&lt;li&gt;3 tomatoes, chopped (or 1 cup tomato puree)&lt;/li&gt;
&lt;li&gt;2 tbsp ginger-garlic paste&lt;/li&gt;
&lt;li&gt;2–3 green chilies, slit&lt;/li&gt;
&lt;li&gt;1 cup plain yogurt, whisked&lt;/li&gt;
&lt;li&gt;1 tsp turmeric powder&lt;/li&gt;
&lt;li&gt;2 tsp red chili powder (adjust to taste)&lt;/li&gt;
&lt;li&gt;2 tsp coriander powder&lt;/li&gt;
&lt;li&gt;1 tsp cumin powder&lt;/li&gt;
&lt;li&gt;1 tsp garam masala&lt;/li&gt;
&lt;li&gt;2 bay leaves&lt;/li&gt;
&lt;li&gt;4–5 whole cloves&lt;/li&gt;
&lt;li&gt;2 green cardamom pods&lt;/li&gt;
&lt;li&gt;1 cinnamon stick&lt;/li&gt;
&lt;li&gt;1 tsp cumin seeds&lt;/li&gt;
&lt;li&gt;Salt, to taste&lt;/li&gt;
&lt;li&gt;Fresh coriander, chopped, for garnish&lt;/li&gt;
&lt;li&gt;Water, as needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="relative group"&gt;Method
&lt;div id="method" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#method" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brown the mutton.&lt;/strong&gt; Heat the oil or ghee in a heavy-bottomed pot over medium-high heat. Add the mutton pieces and cook, turning occasionally, until browned on the outside, about 8–10 minutes. Remove the mutton and set it aside — it goes back in later.&lt;/p&gt;</description></item><item><title>How I Actually Make Trade-off Calls — Not Just What I Build</title><link>/posts/principal-architecture-tradeoffs/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/principal-architecture-tradeoffs/</guid><description>&lt;p&gt;If you&amp;rsquo;ve already read the build logs — the k3s cluster, the storage classes, the failover drill — you know &lt;em&gt;what&lt;/em&gt; I build. This post is about the part that doesn&amp;rsquo;t show up in a &lt;code&gt;terraform apply&lt;/code&gt; output: how I actually decide something, in the moment a plan stops matching reality, and what I do about it afterward.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a different question than &amp;ldquo;what technology did you pick,&amp;rdquo; and it&amp;rsquo;s the one I think actually separates senior from principal-level work. Anyone competent can execute a plan that goes to schedule. What I&amp;rsquo;m going to walk through is a plan that didn&amp;rsquo;t, twenty minutes into a homelab rebuild, and the small, unglamorous decision that followed it — because that decision is a better sample of how I&amp;rsquo;ll behave on your platform than any tool list is.&lt;/p&gt;</description></item><item><title>What I Build — A Technical Services Profile</title><link>/posts/technical-profile/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/technical-profile/</guid><description>&lt;p&gt;If you&amp;rsquo;ve landed here from LinkedIn or a referral, this is the longer answer to &amp;ldquo;what do you actually do?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The short version: I design and build infrastructure, and increasingly I&amp;rsquo;m the one deciding what infrastructure gets built. I have done so for 25 years — across datacentres, managed service environments, banking platforms, and my own homelab — using everything from Windows Server and VMware to OpenStack, Red Hat, and modern cloud-native stacks on Kubernetes. My current role is setting cloud and containerisation strategy for a regulated banking platform: the reference architectures other engineering teams build against, the guardrails that keep a POPIA and PCI-DSS environment audit-ready, and the FinOps governance that keeps cloud spend accountable at group level.&lt;/p&gt;</description></item><item><title>Building an HA k3s Control Plane on Ubuntu 24.04 LTS: Terraform, Ansible, kube-vip, and a Real Failover Drill</title><link>/posts/k3s-enterprise/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/k3s-enterprise/</guid><description>&lt;p&gt;This is the latest iteration of my homelab automation: Terraform provisions six Ubuntu 24.04 LTS VMs on Proxmox, Ansible turns three of them into an HA k3s control plane with embedded etcd and a kube-vip floating VIP, and ArgoCD takes over GitOps management of everything above the OS the moment the cluster is up. It&amp;rsquo;s IaC end to end — nothing in this post was clicked into existence, and the two commands that matter (&lt;code&gt;terraform apply&lt;/code&gt;, &lt;code&gt;ansible-playbook site.yml&lt;/code&gt;) are the only manual steps in the whole build.&lt;/p&gt;</description></item><item><title>GitOps Reached Maturity in 2026 — Here's What That Actually Looks Like Running Your Own Blog</title><link>/posts/gitops-maturity/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/gitops-maturity/</guid><description>&lt;p&gt;Somewhere in the last year, &amp;ldquo;GitOps&amp;rdquo; quietly stopped being a talk track at KubeCon and started being the thing platform teams assume is already in place before a project even gets a name. Argo and Flux both sit at CNCF graduated status now, the highest maturity tier the foundation hands out, and the conference circuit has moved on from &amp;ldquo;should you adopt GitOps&amp;rdquo; to &amp;ldquo;how do you build a self-service golden path on top of it.&amp;rdquo; That&amp;rsquo;s the industry&amp;rsquo;s definition of maturity: a pattern boring enough that nobody has to argue for it any more.&lt;/p&gt;</description></item><item><title>I Run Kubernetes for a Bank and at Home. Here's When You Shouldn't.</title><link>/posts/kubernetes-overkill/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/kubernetes-overkill/</guid><description>&lt;p&gt;Every eighteen months or so, the same argument does a lap of the internet. Someone writes &amp;ldquo;we moved off Kubernetes and cut our infra bill by 60%.&amp;rdquo; A few months later, someone else writes &amp;ldquo;we moved back to Kubernetes and here&amp;rsquo;s why.&amp;rdquo; Both posts get the same engagement, both are right about their own environment, and both get quoted afterwards as if they&amp;rsquo;d settled something universal. Neither side did.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m writing this because I sit on both ends of that argument at the same time, every day, and I don&amp;rsquo;t think either tribe is being honest with the other.&lt;/p&gt;</description></item><item><title>POPIA, PCI-DSS, and My Proxmox Cluster: Bank-Grade Security at Home</title><link>/posts/bank-grade-homelab/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/bank-grade-homelab/</guid><description>&lt;p&gt;A recruiter once asked me, half-joking, whether I ran my home network &amp;ldquo;like a bank.&amp;rdquo; I laughed, said no, and then drove home and found I&amp;rsquo;d left a Grafana dashboard exposed on a LoadBalancer IP with no auth in front of it. That was years ago, before the current cluster existed, but the discomfort of that gap never quite left me. My day job is Cloud Architect at a banking group, where POPIA and PCI-DSS aren&amp;rsquo;t abstractions — they&amp;rsquo;re the reason certain designs get rejected in review before they ever reach a pull request. My homelab is not a bank. Nobody&amp;rsquo;s card data lives on it, no regulator will ever audit it, and I will say that plainly and repeatedly in this post so nobody mistakes what follows for a legal claim. What I&amp;rsquo;ve done instead is take the &lt;em&gt;discipline&lt;/em&gt; those regulations instil — because I practise it forty hours a week whether I like it or not — and apply it to four nodes and a Mikrotik router in a room in Johannesburg.&lt;/p&gt;</description></item><item><title>Progressive Delivery with Kargo: Warehouses, Freight, and Blue-Green Promotions</title><link>/posts/kargo-progressive-delivery/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/kargo-progressive-delivery/</guid><description>&lt;p&gt;&lt;a
href="../posts/blog-routing"&gt;How This Blog Is Served&lt;/a&gt;
walked through the full path from &lt;code&gt;git push&lt;/code&gt; to a served page, touching every layer along the way. This post stays in one place: &lt;strong&gt;Kargo&lt;/strong&gt;, the piece that sits between &amp;ldquo;CI built a new image&amp;rdquo; and &amp;ldquo;ArgoCD is told to deploy it.&amp;rdquo; It&amp;rsquo;s the part of the pipeline most likely to look like magic from the outside, so this is a proper look at what it&amp;rsquo;s actually doing — plus a couple of real gotchas hit while getting auto-promotion working correctly.&lt;/p&gt;</description></item><item><title>How This Blog Is Served — Kubernetes, Gateway API, and a Full GitOps Pipeline</title><link>/posts/blog-routing/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/blog-routing/</guid><description>&lt;p&gt;This blog runs on a self-hosted k3s cluster, served through a Cloudflare proxy, routed via the Kubernetes Gateway API, and deployed using a fully automated GitOps pipeline. This post walks through exactly how a &lt;code&gt;git push&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; makes it to your browser — from webhook to blue-green promotion.&lt;/p&gt;
&lt;p&gt;Source: &lt;a
href="https://git.wagner.org.za/cw/blog"
target="_blank"
&gt;git.wagner.org.za/cw/blog&lt;/a&gt;
&lt;/p&gt;
&lt;h2 class="relative group"&gt;The Full Picture
&lt;div id="the-full-picture" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#the-full-picture" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;Before diving into each layer, here is the end-to-end flow:&lt;/p&gt;</description></item><item><title>Homelab Part 4 - k3s Automation</title><link>/posts/k3s-automation/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/k3s-automation/</guid><description>&lt;p&gt;In &lt;a
href="../posts/homelab3"&gt;Part 3&lt;/a&gt;
we deployed k3s manually — great for understanding what each piece does, but not something you want to repeat. This post automates the entire thing: Terraform provisions the VMs, Ansible configures them and installs k3s + Cilium, and ArgoCD bootstraps itself and takes over GitOps management of the full cluster stack.&lt;/p&gt;
&lt;p&gt;Source: &lt;a
href="https://git.wagner.org.za/homelab/k3s-proxmox-automation.git"
target="_blank"
&gt;git.wagner.org.za/homelab/k3s-proxmox-automation&lt;/a&gt;
&lt;/p&gt;
&lt;h2 class="relative group"&gt;Architecture
&lt;div id="architecture" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#architecture" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────────────────┐
│ Proxmox Host │
│ │
│ ┌─────────────────┐ ┌───────────────┐ ┌───────────────┐ ┌────────────┐ │
│ │ k3s-controller │ │ k3s-worker-01 │ │ k3s-worker-02 │ │k3s-worker │ │
│ │ 172.16.10.1 │ │ 172.16.10.2 │ │ 172.16.10.3 │ │172.16.10.4 │ │
│ │ 8 cores / 16 GB │ │ 16c / 32 GB │ │ 16c / 32 GB │ │16c / 32 GB │ │
│ │ vda: 200 GB │ │ vda: 200 GB │ │ vda: 200 GB │ │vda: 200 GB │ │
│ │ │ │ vdb: 512 GB │ │ vdb: 512 GB │ │vdb: 512 GB │ │
│ │ k3s server │ │ vdc: 512 GB │ │ vdc: 512 GB │ │vdc: 512 GB │ │
│ │ Cilium / ArgoCD │ │ k3s agent │ │ k3s agent │ │k3s agent │ │
│ └────────┬────────┘ └──────┬────────┘ └──────┬────────┘ └─────┬──────┘ │
│ └───────────────-──┴──────────────────┴────────────-────┘ │
└──────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;div class="mermaid"&gt;
graph TB
subgraph Proxmox["Proxmox Host"]
C["&lt;b&gt;k3s-controller-01&lt;/b&gt;&lt;br/&gt;172.16.10.1&lt;br/&gt;8c / 16 GB&lt;br/&gt;vda: 200 GB OS&lt;br/&gt;─────────────&lt;br/&gt;k3s server&lt;br/&gt;Cilium · ArgoCD"]
W1["&lt;b&gt;k3s-worker-01&lt;/b&gt;&lt;br/&gt;172.16.10.2&lt;br/&gt;16c / 32 GB&lt;br/&gt;vda: 200 GB OS&lt;br/&gt;vdb: 512 GB DirectPV&lt;br/&gt;vdc: 512 GB Longhorn&lt;br/&gt;─────────────&lt;br/&gt;k3s agent"]
W2["&lt;b&gt;k3s-worker-02&lt;/b&gt;&lt;br/&gt;172.16.10.3&lt;br/&gt;16c / 32 GB&lt;br/&gt;vda: 200 GB OS&lt;br/&gt;vdb: 512 GB DirectPV&lt;br/&gt;vdc: 512 GB Longhorn&lt;br/&gt;─────────────&lt;br/&gt;k3s agent"]
W3["&lt;b&gt;k3s-worker-03&lt;/b&gt;&lt;br/&gt;172.16.10.4&lt;br/&gt;16c / 32 GB&lt;br/&gt;vda: 200 GB OS&lt;br/&gt;vdb: 512 GB DirectPV&lt;br/&gt;vdc: 512 GB Longhorn&lt;br/&gt;─────────────&lt;br/&gt;k3s agent"]
end
C --&gt;|k3s API :6443| W1
C --&gt;|k3s API :6443| W2
C --&gt;|k3s API :6443| W3
C &amp; W1 &amp; W2 &amp; W3 --&gt;|eBGP AS 65000| R["Router&lt;br/&gt;172.16.10.254"]
R --&gt;|advertises LB pool&lt;br/&gt;172.16.1.0/24| NET["Network"]
&lt;/div&gt;
&lt;p&gt;Each worker gets three disks:&lt;/p&gt;</description></item><item><title>Kairos — Immutable Kubernetes OS</title><link>/posts/kairos/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/kairos/</guid><description>&lt;h2 class="relative group"&gt;Kairos
&lt;div id="kairos" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#kairos" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;Kairos is a cloud-native Linux meta-distribution for running Kubernetes. It brings the power of the public cloud to your on-premises environment. &lt;a
href="https://kairos.io/"
target="_blank"
&gt;https://kairos.io/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Kairos is a Cloud Native Computing Foundation &lt;a
href="https://cncf.io/"
target="_blank"
&gt;CNCF&lt;/a&gt;
sandbox project.&lt;/p&gt;
&lt;h3 class="relative group"&gt;Architecture
&lt;div id="architecture" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#architecture" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p&gt;Kairos is designed to be a lightweight, secure, and scalable solution for deploying Kubernetes clusters. It uses a combination of containerized components and a lightweight operating system to provide a highly available and fault-tolerant platform.&lt;/p&gt;</description></item><item><title>Homelab Part 3 - Kubernetes</title><link>/posts/homelab3/</link><pubDate>Mon, 24 Nov 2025 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/homelab3/</guid><description>&lt;h2 class="relative group"&gt;Kubernetes
&lt;div id="kubernetes" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#kubernetes" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;Kubernetes is a popular open-source container orchestration platform that automates the deployment, scaling, and management of containerised applications. It provides a robust and scalable infrastructure for running microservices and containerised applications across multiple nodes.&lt;/p&gt;
&lt;p&gt;Kubernetes is a powerful tool that enables developers to deploy, manage, and scale containerised applications across multiple nodes. It provides a declarative way to define the desired state of the application, and automatically manages the deployment, scaling, and health of the application.&lt;/p&gt;</description></item><item><title>Homelab Part 2 - Cloud Images</title><link>/posts/homelab2/</link><pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/homelab2/</guid><description>&lt;h1 class="relative group"&gt;Proxmox Cloud Images
&lt;div id="proxmox-cloud-images" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#proxmox-cloud-images" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;
&lt;p&gt;We will now create our base VM cloud images and using cloudinit to configure them.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Ubuntu image using CLI
&lt;div id="ubuntu-image-using-cli" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#ubuntu-image-using-cli" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;These steps can be followed for any cloud image of your choice and will work with for example Rocky linux, etc.&lt;/p&gt;
&lt;p&gt;Choose your image at &lt;a
href="https://cloud-images.ubuntu.com"
target="_blank"
&gt;Ubuntu Cloud&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Homelab Part 1 - HCI</title><link>/posts/homelab/</link><pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate><author>cw@wagner.org.za (Chrisando Wagner)</author><guid>/posts/homelab/</guid><description>&lt;h2 class="relative group"&gt;Introduction
&lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;Welcome to the first part of my homelab series! In this part, we will explore the architecture of my homelab infrastructure and introduce the tools we will be using.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Homelab Architecture
&lt;div id="homelab-architecture" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#homelab-architecture" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;In this part we will get our hands dirty and get our host operating system ready for deployment.&lt;/p&gt;</description></item></channel></rss>