Tag
Kubernetes
Running production workloads on K3s — ArgoCD GitOps, Velero backups, network policies, and troubleshooting.
33 articles
- 3-2-1 Backup in Practice: Velero + PBS + Offsite That Doesn't Work Yet17 Sept 2026Three backup layers, two storage media, one offsite copy — the theory. In practice: Velero's defaultVolumesToFsBackup gap, PBS restore gotchas with IP conflicts, and Google Drive API throttled to 1.6 KiB/s. Here's what actually works.
- NFS vs local-path: The SQLite Trap That Corrupted My S3 Metadata10 Sept 2026Garage S3's SQLite database corrupted because NFS file-locking semantics don't work with SQLite's WAL mode. The lesson: embedded databases and NFS are incompatible, and the fix is local-path for anything with a .db file.
- Private AKS on Azure: No Public API Server, No Public Node IPs, No Default Outbound07 Sept 2026A production AKS cluster with private_cluster_enabled, forced-tunneled node egress via a Route Table, and private-endpoint-only ACR/Key Vault — the workload cluster that sits behind a Hub & Spoke and an Azure Firewall.
- When Your LLM Hallucinated Your OCR27 Aug 2026paperless-gpt's VISION_LLM_MODEL pointed at a text-only model that fabricated German OCR content for real documents. Combined with an Ollama iGPU that crashed 451 times in one day from an unstable Vulkan/radv fallback, the AI pipeline was hallucinating on hallucinating hardware.
- Vault Auto-Unseal Without Cloud KMS: The Polling Sidecar Pattern23 Aug 2026HashiCorp Vault OSS doesn't support auto-unseal without a KMS. The workaround: a polling sidecar that reads unseal keys from a Kubernetes Secret and runs vault operator unseal every 5 seconds. The trade-offs, the security boundary, and the seal window.
- Chaos Mesh in a Homelab: Weekly Pod-Kills on a Single-Host Cluster20 Aug 2026Running scheduled chaos experiments on a non-production k3s cluster. Weekly pod-kills and latency injection — what breaks, what it teaches, and why chaos testing matters even when nobody's paying for uptime.
- Cloudflare Tunnel Without Opening a Single Firewall Port16 Aug 2026 (updated)Zero inbound firewall rules for external service access. How Cloudflare Tunnel works with split-DNS on AdGuard, the chunked_encoding fix for large Immich uploads, and why routing Atlantis through Traefik matters for Authelia protection.
- Velero Said Backups Succeeded. The Data Was Never There.09 Aug 2026Velero's daily backup reported 'Completed' for weeks without ever capturing PVC data. The k8s manifests were there, but Postgres, Vaultwarden, and Paperless data was completely missing. Here's how defaultVolumesToFsBackup fixes it and why velero backup describe is the only real verification.
- Self-Hosted SSO for 25 Services: Authelia OIDC on Kubernetes06 Aug 2026How a single Authelia instance protects Proxmox, PBS, Grafana, ArgoCD, Headscale, and 20+ web apps with OIDC — CNPG-managed Postgres, Redis sessions, hmac_secret in Vault, and a Traefik ForwardAuth middleware that gates every request.
- How a Single Volume Was 65% of My Velero Backup and What I Almost Excluded Instead26 Jul 2026The nfs-provisioner's root-mount volume was backing up the entire shared NFS export as one 33.4GB blob every night — redundant because every app's PVC was already backed up separately. The investigation almost went wrong when the first hypothesis pointed at the wrong disk.
- Zero NetworkPolicies on Vault: How I Found the Biggest Gap in My Cluster and a GitOps Tracking Bug That Hid It19 Jul 2026Vault is the trust root every ExternalSecret reads from. Its namespace had zero NetworkPolicies — any pod in the cluster could reach it. The investigation also uncovered a class of ArgoCD drift that silently ignores merged changes.
- 310 Restarts in 21 Days: CNPG's Silent PodMonitor Failure and the Leader-Election Trap17 Jul 2026CloudNativePG's auto-generated PodMonitor was missing a single label — Prometheus never scraped it. The same I/O fragility that causes etcd timeouts was triggering leader-election failures, restarting the operator 310 times in 21 days. Here's how I traced both root causes.
- Beszel: Lightweight Host Monitoring That Doesn't Deserve Its Own Server16 Jul 2026Why I replaced a heavyweight monitoring stack for host-level metrics with a single container, how Kyverno caught my first deploy before it hit production, and why internal-only dashboards don't need a public DNS record.
- Kubernetes Health Probes: The Host Header Trap That Restarts Healthy Pods15 Jul 2026Adding health probes to 20+ workloads taught me that kubelet sends the Pod IP as the Host header — and apps with host-validation reject it. Here's the full sweep, the gotcha that caught me, and the probe patterns that actually work.
- Migrating Atlantis to an LXC Accidentally Made It Fully Public14 Jul 2026Moving Atlantis from Kubernetes to a dedicated LXC involved repointing the Cloudflare Tunnel. The new tunnel pointed straight at the LXC's IP, bypassing Traefik and Authelia entirely. Atlantis has no auth of its own. For roughly 18 hours, anyone with the URL had full plan/apply access to the infrastructure repo.
- Renovate OOMKilled Three Times: Why the Fix Wasn't More Memory14 Jul 2026Two GiB wasn't enough, so I bumped to 3 GiB. Still OOMKilled. Bumped to 4 GiB. Still OOMKilled. The real fix wasn't memory at all — it was Terraform hash concurrency. Here's how I isolated the actual spike.
- Zero NetworkPolicies on the Database Namespace: The Gap That Let Any Pod Reach Authelia's Postgres13 Jul 2026The database namespace holding Authelia's session storage had no network restrictions. Any pod in the cluster could reach it. Here's the audit that found it, the traffic pattern that shaped the fix, and the namespace I deliberately left unrestricted.
- Full Observability on k3s: kube-prometheus-stack + Loki + Grafana OIDC04 Jul 2026Deploy a production-grade monitoring stack on bare-metal k3s: Prometheus, Loki with Garage S3 storage, Promtail on edge nodes via Ansible, SNMP monitoring for MikroTik, and Grafana SSO via Authelia OIDC - all GitOps-managed.
- Redis Killed Nextcloud and Nobody Noticed for Hours01 Jul 2026Redis running without a PVC still has persistence enabled by default. When it can't write RDB snapshots to a read-only rootfs, it doesn't crash - it silently refuses all writes. Here's how that turned into a full Nextcloud outage and why the logs pointed at the wrong thing first.
- I Hardened Pod securityContext and Broke 9 Containers in Production25 Jun 2026capabilities.drop: [ALL] and runAsNonRoot: true passed schema validation cleanly. Within minutes of merge, nine containers - including both Postgres instances backing Paperless and Nextcloud - were down. Here's the failure analysis, why a manual kubectl fix got silently undone, and the lesson for any blanket securityContext change.
- kubectl Said Everything Was Correct. Traefik 404'd Anyway.25 Jun 2026Migrating Jellyfin off k3s onto a GPU-passthrough LXC meant pointing a Service at an external IP. The EndpointSlice looked completely correct via kubectl - Service existed, endpoint listed right - but Traefik 404'd every request. A second, unrelated gotcha surfaced in the same migration: a PVC silently shared by reference across two unrelated files.
- ArgoCD Gotchas: Cache Staleness and the SharedResourceWarning Nobody Explains22 Jun 2026kubectl apply succeeds, the field reverts within seconds, and there's no error anywhere. Two ArgoCD debugging patterns that hit the same homelab three times in one day: repo-server cache staleness reverting live edits, and two Applications silently fighting over the same resource.
- I Ran Gitleaks Against My Own Repo and Found 12 Real Secrets22 Jun 2026A full-history gitleaks scan of a homelab repo that had been running for months turned up 12 distinct plaintext secrets - including an OIDC signing key. Here's the scanning setup, the baseline strategy that doesn't block on pre-existing leaks, and the remediation plan.
- k3s Backup Without the Complexity: Velero + Garage S3 on Longhorn20 Jun 2026 (updated)Replace MinIO with Garage - a single 50MB binary - as the Velero backup target. Full daily cluster backups with Longhorn volume snapshots, deployed via ArgoCD.
- External Secrets Operator + HashiCorp Vault: GitOps Secret Lifecycle in Kubernetes18 Jun 2026Kubernetes Secrets are base64-encoded, not encrypted. Moving secrets out of the cluster into Vault - and syncing them back via External Secrets Operator - gives you rotation, audit logging, and compliance without changing how applications consume secrets.
- How a 1 GiB Memory Limit Took Down My Entire k3s Cluster18 Jun 2026A single misconfigured resource limit triggered a cascade: OOMKill on the control-plane, load average of 90, 1.2M DNS queries per day, and kubelet reporting the wrong allocatable memory. Here's the full post-mortem.
- Kyverno: Supply Chain Security as Admission Control on Kubernetes18 Jun 2026Most Kubernetes clusters accept any container image, any privilege level, and any resource configuration by default. Kyverno lets you enforce policies at admission time - before anything runs. Here's how to build a supply chain security baseline with Audit-first rollout.
- SLO Burn-Rate Alerting with Prometheus: Beyond Threshold Alerts18 Jun 2026Most teams alert when availability drops below a threshold. Burn-rate alerting tells you how fast you're spending your error budget - so you page on trajectory, not just current state. Here's how to implement the Google SRE Workbook approach on a bare-metal k3s cluster.
- Self-Hosted Tailscale Control Plane: Headscale on k3s with Authelia OIDC13 Jun 2026Deploy Headscale on a bare-metal k3s cluster with Longhorn persistence, Traefik ingress, and Authelia OIDC authentication - fully GitOps-managed via ArgoCD.
- Wildcard TLS on K3s with cert-manager and Cloudflare DNS0122 May 2026 (updated)HTTP-01 challenges fail behind a default-deny firewall. Switching cert-manager to Cloudflare DNS01 wildcard validation gives every Traefik IngressRoute a *.yourdomain.com certificate without opening port 80 to the internet.
- GitOps on K3s: Managing a Complete Homelab with ArgoCD20 May 2026 (updated)How to manage an entire Kubernetes homelab - MetalLB, Traefik, Longhorn, Authelia, and more - as a Git repository using ArgoCD's App-of-Apps pattern.
- Bare-Metal LoadBalancer on K3s: MetalLB + Traefik with ArgoCD18 May 2026How to get a real external IP on a bare-metal Kubernetes cluster using MetalLB L2 mode, and wire it up with Traefik for automatic HTTPS - fully GitOps-managed with ArgoCD.
- Enterprise Homelab: K3s, Authelia & Longhorn on Proxmox with Terraform16 May 2026 (updated)How to build a production-grade Kubernetes homelab with K3s, Authelia SSO, Longhorn storage, and ArgoCD - and the five painful mistakes that will cost you hours if you don't know about them.