<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gitops on Chris Wagner</title><link>/tags/gitops/</link><description>Recent content in Gitops 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="/tags/gitops/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>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>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>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>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>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></channel></rss>