The OS Layer Your Platform Ignores
Immutable nodes for Kubernetes
Brian "bex" Exelbierd
Principal Product Manager, Microsoft Azure
🌐 www.bexelbie.com
✉️ [email protected]
✉️ [email protected]
@[email protected]
---
# You have 100 Kubernetes nodes.
# Can you prove their filesystems match?
---
# Mutable systems drift
- Nodes at different lifecycle stages get updates at different times
- Package upgrade ordering varies across a fleet
- Node A got update X before Y; Node B got Y before X → different state
- Debug sessions leave artifacts: tcpdump, strace, hot-patched binaries
- Debug artifacts and daemonset writes fill disks, blow quotas
---
# The divergence is invisible
Two nodes report the same kernel and OS version.
Their userspace has diverged.
**You can't tell from the outside.**
---
# Kubernetes can't check this
Kubernetes solves **orchestration**, not **OS integrity**.
- It knows: is the node Ready? Is kubelet responding?
- It doesn't know: what's on the filesystem. What changed since last boot.
- Node replacement from the "same image" doesn't help — mutable images mutate.
---
# "Shift Down"
---
# You secured your container images.
## What about the node they run on?
- SLSA, Sigstore, SBOMs → container supply chain ✓
- But the node runs a **mutable filesystem**
- Detecting drift ≠ preventing drift
- What if drift were **structurally impossible**?
---
# Flatcar Container Linux
A container-optimized, immutable Linux distribution
- **CNCF Incubating** project (CoreOS → Kinvolk → Microsoft → CNCF)
- Made for one thing: running containers reliably
- The OS itself is treated like a container image
- A **functionality contract**: you define what you need, Flatcar delivers and maintains it
---
# Immutable by design
| | Mutable OS | Flatcar |
|:--|:--|:--|
| `/usr` | Read-write, anyone can change it | **Read-only**, dm-verity protected |
| Updates | Individual packages, any order | Entire OS atomically, as one unit |
| Verification | Package-level audit | VERSION_ID + sysext list = full identity |
| After reboot | Same node, new mysteries | Cryptographically verified identical userspace |
---
# Demo: Provision & Prove Immutability
## What we're provisioning
```yaml
# Butane config → transpiled to Ignition JSON
variant: flatcar
version: 1.0.0
storage:
files:
- path: /opt/extensions/kubernetes/kubernetes-v1.33.2-x86-64.raw
contents:
source: https://extensions.flatcar.org/...
links:
- path: /etc/extensions/kubernetes.raw
target: /opt/extensions/kubernetes/kubernetes-v1.33.2-x86-64.raw
systemd:
units:
- name: kubeadm.service
enabled: true
contents: |
...
ExecStart=/usr/bin/kubeadm join
Brian "bex" Exelbierd
Principal Product Manager, Microsoft Azure
🌐 www.bexelbie.com
✉️ [email protected]
✉️ [email protected]
@[email protected]