Eleven Minutes, Zero Humans: How This Kubernetes Upgrade Pipeline Works

Eleven Minutes, Zero Humans: How This Kubernetes Upgrade Pipeline Works

Enterprise Developer Platforms

Most Kubernetes control plane upgrades require a human. They require someone to SSH in, watch etcd health, and verify node rejoin after each reboot. A July production run on Kairos completed the same operation β€” three control-plane nodes, one at a time β€” in eleven minutes with a two-line Git commit as the only human input.

11 min
to upgrade a Kubernetes control plane across 3 nodes with zero human intervention on Kairos

What Kairos Is

Kairos is an immutable Linux distribution designed around A/B partition upgrades. Rather than patching packages in place, it writes a new OS image to an inactive partition and reboots into it. The previous partition remains intact. Rolling back is a reboot β€” not a recovery procedure. This design makes the upgrade unit the entire OS image, not individual packages, which eliminates the drift that accumulates in traditional Kubernetes node maintenance.

The Six-Tool Pipeline

The eleven-minute result requires six tools working in sequence, each with a specific role:

1. Gitea β€” self-hosted Git repository with CI runners. The source of truth for node configuration.

2. Renovate β€” automated dependency bumping. When Kairos releases a new version, Renovate opens a PR against the Gitea repo within its scanning window. No human monitors release notes.

3. Kyverno β€” ClusterPolicy admission controller. Blocks misconfigurations before they reach the cluster. Acts as the gate between β€œa PR was merged” and β€œthe cluster is modified.”

4. Cosign β€” cryptographic image signature verification. Before any image is deployed, Cosign verifies it against the upstream CI identity. This is the supply chain security layer β€” it ensures that the image being deployed originated from the Kairos build pipeline, not a shadow build.

5. ArgoCD β€” GitOps deployment. Detects the merged version bump as drift between the desired state (Git) and the actual state (cluster) and triggers reconciliation.

6. kairos-operator β€” custom resource executor. Handles node cordoning, sequential upgrade execution, and post-reboot rejoin validation. This is the component that actually does the work; the others provide the governance and delivery layers above it.

The Critical Concurrency Setting

The near-miss in this pipeline is worth understanding in detail. The concurrency setting in the kairos-operator controls how many nodes upgrade simultaneously. Setting concurrency: 0 upgrades all nodes at once β€” which means all three control-plane nodes reboot simultaneously. etcd quorum requires a majority of nodes to be healthy; losing all three simultaneously breaks quorum and potentially corrupts cluster state.

The production pipeline had concurrency: 0 initially. Per the CNCF writeup, it β€œonly survived by chance rather than design.” The correct setting is concurrency: 1 β€” one node at a time, with rejoin validation before the next node begins. This adds roughly two minutes per node but is the difference between a reliable pipeline and a high-stakes gamble.

The per-node timeline with concurrency: 1: image pull takes 25.5 seconds for a 324 MB image; the upgrade and reboot cycle runs approximately 2 minutes per node. Three nodes, sequentially: approximately 7–8 minutes of node operations plus coordination overhead equals the 11-minute total.

The So What

The pipeline is replicable. Every tool in the six-component stack is open-source or self-hostable: Gitea, Renovate, Kyverno, Cosign, ArgoCD, and kairos-operator. The total investment to replicate this is the integration work, not licensing. The architecture β€” Renovate for automated discovery, Cosign for supply chain verification, ArgoCD for GitOps, kairos-operator for execution β€” maps cleanly onto most existing platform engineering stacks.

The concurrency: 1 setting is the most important operational detail in the entire post. Every other component in this pipeline handles failure gracefully; concurrent control-plane upgrades do not. Any implementation of this pattern should treat concurrency: 1 as a hard constraint, not a default to evaluate later.

Source: Cloud Native Computing Foundation

Content created with AI assistance and reviewed for accuracy.

πŸ’¬

Join the conversation

Stack Insiders is our free community for readers who want to go deeper β€” share resources, ask questions, and connect with others across every vertical we cover.

Join Stack Insiders →

Newsletter coming soon.

Curated digests across AI, biohacking, photography, travel, and more. Be the first to know when we launch.