<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubernetes on</title><link>/tags/kubernetes/</link><description>Recent content in Kubernetes on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 18 Mar 2025 00:00:00 +0000</lastBuildDate><atom:link href="/tags/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>Lesson 5: Debugging in Kubernetes — kubectl tricks that save hours</title><link>/post/fundamentals/k8s-debugging/</link><pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate><guid>/post/fundamentals/k8s-debugging/</guid><description>&lt;p&gt;The most stressful hours of my on-call life have been in Kubernetes clusters where something was wrong but nothing was obviously broken. Pods in &lt;code&gt;Pending&lt;/code&gt; for reasons that weren&amp;rsquo;t clear. Services returning 503s but all pods showing as &lt;code&gt;Running&lt;/code&gt;. Memory usage climbing slowly across a fleet for two days before things started dying. Over years of debugging production Kubernetes issues, I&amp;rsquo;ve accumulated a set of commands and mental models that cut through the noise. This article is that collection.&lt;/p&gt;</description></item><item><title>Lesson 4: Operators and CRDs — Extending Kubernetes with your own resources</title><link>/post/fundamentals/k8s-operators/</link><pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate><guid>/post/fundamentals/k8s-operators/</guid><description>&lt;p&gt;I used to manage PostgreSQL on Kubernetes with a collection of shell scripts and Helm hooks. Provisioning a new database instance meant running a script that created a StatefulSet, a Service, a ConfigMap, a Secret, and set up replication. Failover meant manually triggering another script. Backups were a cron job that required careful coordination with the stateful set. Every operational task was a script that a human had to run, remember, and maintain. Then I discovered the Zalando Postgres Operator, and I understood what the Operator pattern is actually for: encoding human operational knowledge into the Kubernetes control plane itself.&lt;/p&gt;</description></item><item><title>Lesson 3: ConfigMaps and Secrets — Configuration without rebuilding</title><link>/post/fundamentals/k8s-config-secrets/</link><pubDate>Wed, 16 Oct 2024 00:00:00 +0000</pubDate><guid>/post/fundamentals/k8s-config-secrets/</guid><description>&lt;p&gt;We had a bug where the same Docker image was running in staging and production but behaving differently. I spent an hour diffing the code before I checked the environment variables. The staging pod had &lt;code&gt;CACHE_TTL=60&lt;/code&gt; and the production pod had &lt;code&gt;CACHE_TTL=3600&lt;/code&gt;. The image was identical. The behavior was totally different. That kind of environment-specific configuration — the values that shouldn&amp;rsquo;t be baked into the image — is exactly what ConfigMaps and Secrets are for. But they have subtleties that bite you if you treat them as simple key-value stores.&lt;/p&gt;</description></item><item><title>Lesson 2: Deployments and Scaling — Rolling updates, HPA, VPA</title><link>/post/fundamentals/k8s-deployments/</link><pubDate>Wed, 07 Aug 2024 00:00:00 +0000</pubDate><guid>/post/fundamentals/k8s-deployments/</guid><description>&lt;p&gt;The week before a major product launch, our Kubernetes cluster started evicting pods. Traffic was spiking as we ran load tests, but instead of scaling up, the HPA was oscillating — scaling up, then the new pods were getting OOMKilled, then scaled down, then up again. Pods were in CrashLoopBackOff, the HPA metrics were lagging behind the actual load, and I was watching health check failures cascade. It turned out our resource requests were wildly inaccurate — set once during initial deployment and never updated as the service&amp;rsquo;s actual usage changed. That day I learned that Deployments and autoscaling aren&amp;rsquo;t fire-and-forget configurations.&lt;/p&gt;</description></item><item><title>Lesson 1: Pod Design Patterns — Sidecar, ambassador, adapter</title><link>/post/fundamentals/k8s-pod-patterns/</link><pubDate>Fri, 24 May 2024 00:00:00 +0000</pubDate><guid>/post/fundamentals/k8s-pod-patterns/</guid><description>&lt;p&gt;The first time I deployed a service to Kubernetes, I put everything in a single container. Logging, metrics, TLS termination, the actual application — all in one Docker image. It worked, but the image was massive, updating any single concern meant rebuilding and redeploying the whole thing, and the application team had to understand infrastructure concerns they shouldn&amp;rsquo;t need to care about. The sidecar pattern was the thing that changed how I thought about container composition.&lt;/p&gt;</description></item></channel></rss>