<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Stebakov · SRE / DevOps</title>
    <link>https://stebas.com/</link>
    <description>Notes from production and the home lab: upgrades, migrations, incidents and the reasoning behind them.</description>
    <language>en</language>
    <item>
      <title>RDS refused connections at 10% CPU: default connection pools times replicas</title>
      <link>https://stebas.com/posts/rds-connection-ceiling-npgsql-pools/</link>
      <guid>https://stebas.com/posts/rds-connection-ceiling-npgsql-pools/</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <description>Load tests hit a flat plateau of ~420 database connections and the request was for a much bigger database. The real ceiling was max_connections versus Npgsql default pools.</description>
    </item>
    <item>
      <title>Calico was Ready with no errors, and every new pod was unreachable for half a minute</title>
      <link>https://stebas.com/posts/calico-xdp-resync-new-pod-blackhole/</link>
      <guid>https://stebas.com/posts/calico-xdp-resync-new-pod-blackhole/</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <description>After a Calico upgrade, fresh pods were blackholed for 15–42 seconds. Felix was stuck in an XDP resync loop that only a cross-node, fresh-pod test could see.</description>
    </item>
    <item>
      <title>Kubernetes 1.32 to 1.37 in one day, five hops, without the kubespray that built the cluster</title>
      <link>https://stebas.com/posts/kubernetes-five-hop-upgrade-without-kubespray/</link>
      <guid>https://stebas.com/posts/kubernetes-five-hop-upgrade-without-kubespray/</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <description>An end-of-life bare-metal cluster, a lost kubespray inventory and binaries outside any package manager. How five kubeadm hops went in one day, and the traps no plan listed.</description>
    </item>
    <item>
      <title>It worked for a minute, then timed out: MetalLB L2 with kube-proxy ipvs and no strictARP</title>
      <link>https://stebas.com/posts/metallb-l2-ipvs-strictarp/</link>
      <guid>https://stebas.com/posts/metallb-l2-ipvs-strictarp/</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <description>Moving hosts to a new LoadBalancer IP worked briefly, then an external load balancer saw Layer 4 timeouts. Every node was answering ARP for the same IP.</description>
    </item>
    <item>
      <title>The certificates expired on schedule. The alert fired for a week — into nowhere</title>
      <link>https://stebas.com/posts/kubeadm-certs-expired-alert-into-null/</link>
      <guid>https://stebas.com/posts/kubeadm-certs-expired-alert-into-null/</guid>
      <pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate>
      <description>A kubeadm cluster lost its control plane exactly one year after install. The expiry alert had been firing for seven days, but Alertmanager only had a null receiver.</description>
    </item>
    <item>
      <title>The alert fired and nobody saw it: a cluster label lost in aggregation</title>
      <link>https://stebas.com/posts/alert-lost-cluster-label/</link>
      <guid>https://stebas.com/posts/alert-lost-cluster-label/</guid>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <description>A node ran at 90-98% CPU for four hours and ended in an OOM kill. The CPU alert did fire, but avg by(instance) dropped the label every route and dashboard selected on.</description>
    </item>
    <item>
      <title>Kubernetes 1.33 → 1.36 and Calico → Cilium in one day</title>
      <link>https://stebas.com/posts/k8s-136-cilium-in-one-day/</link>
      <guid>https://stebas.com/posts/k8s-136-cilium-in-one-day/</guid>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <description>A home-lab rehearsal: three Kubernetes hops, a CNI swap to Cilium with kube-proxy replacement, and ingress-nginx retired in favour of Gateway API — why a bounded big-bang beat live migration, and the traps worth knowing.</description>
    </item>
    <item>
      <title>A production certificate expired and nobody noticed: the front proxy covered for it</title>
      <link>https://stebas.com/posts/expired-tls-hidden-by-front/</link>
      <guid>https://stebas.com/posts/expired-tls-hidden-by-front/</guid>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <description>Every public host returned 200 while the cluster served an expired wildcard. A proxy with its own TLS hid the outage; the real finding was the missing expiry alert.</description>
    </item>
    <item>
      <title>multipathd hijacked a Longhorn volume: "mount point busy" while nothing was mounted</title>
      <link>https://stebas.com/posts/multipathd-hijacks-longhorn/</link>
      <guid>https://stebas.com/posts/multipathd-hijacks-longhorn/</guid>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <description>A pod sat in Init for five days, 2413 mount retries, and a full power cycle did not help. multipathd had built a map over the Longhorn iSCSI device and held it open.</description>
    </item>
    <item>
      <title>The rebalance storm was just a deploy: a threshold that scales with group size</title>
      <link>https://stebas.com/posts/rebalance-storm-deploy-signature/</link>
      <guid>https://stebas.com/posts/rebalance-storm-deploy-signature/</guid>
      <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
      <description>A Kafka rebalance alert fired at 60 per hour on every release. The metric was summed over 40 consumers and averaged over a sliding hour, so the alert described the past.</description>
    </item>
    <item>
      <title>Argo CD said Synced, and the API server had quietly thrown my fix away</title>
      <link>https://stebas.com/posts/argocd-synced-but-field-pruned/</link>
      <guid>https://stebas.com/posts/argocd-synced-but-field-pruned/</guid>
      <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
      <description>Months of missing metrics, a fix already in git and a green Synced status. The field did not exist in the CRD, so the API server pruned it and nobody complained.</description>
    </item>
    <item>
      <title>A liveness probe tied to someone else's network: 330 restarts that fixed nothing</title>
      <link>https://stebas.com/posts/liveness-probe-external-dependency/</link>
      <guid>https://stebas.com/posts/liveness-probe-external-dependency/</guid>
      <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
      <description>Two identical cloudflared replicas, 330 and 13 restarts. The liveness probe was checking the tunnel to the edge, so every uplink hiccup turned into a SIGKILL.</description>
    </item>
    <item>
      <title>The loading screen was a retry loop, not a hang — and the reboot was never needed</title>
      <link>https://stebas.com/posts/retry-loop-not-a-hang/</link>
      <guid>https://stebas.com/posts/retry-loop-not-a-hang/</guid>
      <pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate>
      <description>A game on my Linux workstation froze on its loading screen, and the known fix was a full reboot. Five seconds of /proc counters showed a hot retry loop that a single SIGTERM could end.</description>
    </item>
    <item>
      <title>Three alerting outages from one root: a name where an ID belonged</title>
      <link>https://stebas.com/posts/mutable-name-vs-contract/</link>
      <guid>https://stebas.com/posts/mutable-name-vs-contract/</guid>
      <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
      <description>Someone renamed a Slack channel and alert delivery for a production system died silently. It was the third failure on the same identifier — every earlier fix changed the transport and kept the name.</description>
    </item>
    <item>
      <title>Kafka at 94 % disk with 17 hours left, and retention that kept twice what we asked</title>
      <link>https://stebas.com/posts/kafka-retention-segment-roll/</link>
      <guid>https://stebas.com/posts/kafka-retention-segment-roll/</guid>
      <pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate>
      <description>Traffic grew 150x and nobody resized the volumes. Worse, with default segment rolling a 7-day retention really meant 7 to 14 days. How we bought time and fixed the cause.</description>
    </item>
    <item>
      <title>Basic auth vanished on port 80 after an Ingress to Gateway API migration</title>
      <link>https://stebas.com/posts/gateway-api-policy-per-listener/</link>
      <guid>https://stebas.com/posts/gateway-api-policy-per-listener/</guid>
      <pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate>
      <description>Every status was green and my own curl returned 401. Yet the WordPress login was open to the world: Gateway API binds a policy to one listener, while Ingress annotations covered every port.</description>
    </item>
    <item>
      <title>NotReady for six hours, and the node was alive the whole time</title>
      <link>https://stebas.com/posts/notready-was-memory-thrashing/</link>
      <guid>https://stebas.com/posts/notready-was-memory-thrashing/</guid>
      <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
      <description>Every signal said the node was dead. It was thrashing on memory, and the obvious fix — delete the node and force-detach the volume — was one command away from corrupting a database.</description>
    </item>
    <item>
      <title>A star in the middle of a Vault path is not a wildcard</title>
      <link>https://stebas.com/posts/vault-acl-mid-path-glob/</link>
      <guid>https://stebas.com/posts/vault-acl-mid-path-glob/</guid>
      <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
      <description>A dead token took down a secrets operator. Reissuing it exposed an older bug: 27 Vault policies used * mid-path, silently denied what they declared, and hid an over-privilege.</description>
    </item>
    <item>
      <title>A Postgres replica stuck in a pg_rewind loop for 23 hours: rebuild, do not repair</title>
      <link>https://stebas.com/posts/cnpg-replica-pg-rewind-loop/</link>
      <guid>https://stebas.com/posts/cnpg-replica-pg-rewind-loop/</guid>
      <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
      <description>After a failover a CloudNativePG replica could not rewind: its WAL segments were zero bytes and its data directory a tenth of the primary. Nobody noticed for 23 hours because nothing scraped the operator metrics.</description>
    </item>
    <item>
      <title>An error budget in VictoriaMetrics: recording rules, burn-rate alerts and one honest panel</title>
      <link>https://stebas.com/posts/error-budget-burn-rate-alerts/</link>
      <guid>https://stebas.com/posts/error-budget-burn-rate-alerts/</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
      <description>How we built an error budget for tier-1 services from metrics we already had: per-service SLO targets, multi-window burn-rate alerts, a Grafana row — and why a negative budget right after launch was not an incident.</description>
    </item>
    <item>
      <title>One p99 alert, five slow routes, five different causes</title>
      <link>https://stebas.com/posts/latency-triage-per-route/</link>
      <guid>https://stebas.com/posts/latency-triage-per-route/</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
      <description>A service-level latency alert named no endpoint. Splitting it per route showed an external gateway, a captcha check, a provider call — and a set of measurement traps that would have sent us the wrong way.</description>
    </item>
    <item>
      <title>Moving production Postgres from an RDS Multi-AZ instance to a Multi-AZ DB cluster</title>
      <link>https://stebas.com/posts/rds-instance-to-multi-az-cluster-cutover/</link>
      <guid>https://stebas.com/posts/rds-instance-to-multi-az-cluster-cutover/</guid>
      <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
      <description>A planned cutover with near-zero data loss — and three traps: "maintenance" that did not stop writes, passwords RDS will not let you copy, and a dump that took 25 minutes over VPN and 31 seconds in the VPC.</description>
    </item>
    <item>
      <title>The lag went to zero and nobody was fixed: a Kafka consumer stall hidden by a group.id rename</title>
      <link>https://stebas.com/posts/kafka-consumer-stall-hidden-by-group-rename/</link>
      <guid>https://stebas.com/posts/kafka-consumer-stall-hidden-by-group-rename/</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <description>Consumer lag grew for five days, then dropped to zero and stayed there. It looked self-healed. In fact the consumer was stuck, the metric had vanished, and the alert had resolved itself.</description>
    </item>
    <item>
      <title>Profiling a Python memory leak in production with memray — and the outage we caused on the way</title>
      <link>https://stebas.com/posts/python-memory-leak-memray-in-production/</link>
      <guid>https://stebas.com/posts/python-memory-leak-memray-in-production/</guid>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <description>A backend OOMed every 10–15 hours. Hourly memray snapshots on the live pod found the leak in library middleware, not the app — after a first attempt took production down for seven minutes.</description>
    </item>
    <item>
      <title>Moving a production cluster from Longhorn to LINSTOR — and the expectation that did not come true</title>
      <link>https://stebas.com/posts/longhorn-to-linstor-migration/</link>
      <guid>https://stebas.com/posts/longhorn-to-linstor-migration/</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why we swapped Longhorn for LINSTOR/DRBD on a self-managed cluster, how each workload was moved with a different method, and what went wrong on the way.</description>
    </item>
    <item>
      <title>From ingress-nginx to Envoy Gateway with zero downtime: 27 Ingresses, 39 HTTPRoutes</title>
      <link>https://stebas.com/posts/ingress-nginx-to-envoy-gateway/</link>
      <guid>https://stebas.com/posts/ingress-nginx-to-envoy-gateway/</guid>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
      <description>ingress-nginx is retired and blocks Kubernetes upgrades. How we moved 16 public hosts to Envoy Gateway by building the new entry point next to the old one and swapping only the address at the end.</description>
    </item>
    <item>
      <title>Moving CloudNativePG to the Barman Cloud plugin without splitting the archive</title>
      <link>https://stebas.com/posts/cnpg-barman-cloud-plugin-switchover/</link>
      <guid>https://stebas.com/posts/cnpg-barman-cloud-plugin-switchover/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>CNPG is removing native barmanObjectStore support. The switch has no valid intermediate state, the database had no base backups at all, and one path decides whether point-in-time recovery still works.</description>
    </item>
    <item>
      <title>Four checks that lied while the system was fine</title>
      <link>https://stebas.com/posts/four-checks-that-lied/</link>
      <guid>https://stebas.com/posts/four-checks-that-lied/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>In one day of platform migrations, four verification steps reported failure while everything was healthy. When one signal disagrees with all the others, suspect the signal first.</description>
    </item>
    <item>
      <title>Alerts that cannot fire: a blind ServiceMonitor and a dead delivery channel</title>
      <link>https://stebas.com/posts/alerts-that-cannot-fire/</link>
      <guid>https://stebas.com/posts/alerts-that-cannot-fire/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>A Vault peer stayed sealed for 32 hours and secrets stopped syncing for a week, with a VaultSealed alert in the repo and Alertmanager healthy. Two independent failures hid it.</description>
    </item>
    <item>
      <title>"Kernel drift" was uptime drift: patches landed, nothing rebooted</title>
      <link>https://stebas.com/posts/kernel-drift-was-uptime-drift/</link>
      <guid>https://stebas.com/posts/kernel-drift-was-uptime-drift/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>Three different kernels across seven nodes looked like unfinished patch waves and sent an investigation down a false trail. Every node had the same patches; only uptime differed.</description>
    </item>
    <item>
      <title>kubectl patch --type merge wiped CoreDNS, and every health check stayed green</title>
      <link>https://stebas.com/posts/kubectl-merge-patch-wiped-coredns/</link>
      <guid>https://stebas.com/posts/kubectl-merge-patch-wiped-coredns/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>A one-line image bump replaced the whole container spec. CoreDNS lost its config, quietly fell back to the whoami plugin and answered every query with NOERROR and no answer.</description>
    </item>
    <item>
      <title>Replacing MetalLB with Cilium LB IPAM without dropping a single request</title>
      <link>https://stebas.com/posts/metallb-to-cilium-lb-ipam/</link>
      <guid>https://stebas.com/posts/metallb-to-cilium-lb-ipam/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>The cluster had exactly one LoadBalancer IP and every route depended on it. How I handed it from MetalLB to Cilium with zero failed requests — by letting both controllers run at once.</description>
    </item>
    <item>
      <title>Moving Vault from Shamir to transit auto-unseal, and the four traps on the way</title>
      <link>https://stebas.com/posts/vault-transit-auto-unseal/</link>
      <guid>https://stebas.com/posts/vault-transit-auto-unseal/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>Every Vault pod restart came back sealed and froze secret sync behind it. How we added a transit auto-unseal provider, migrated a three-node raft cluster, and what bit us.</description>
    </item>
    <item>
      <title>Vault kept sealing itself. The cause was a 15-minute VM freeze below the cluster</title>
      <link>https://stebas.com/posts/vm-backup-freeze-cascade/</link>
      <guid>https://stebas.com/posts/vm-backup-freeze-cascade/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>Four Vault seals in three weeks, each treated as a separate incident. A journald gap analysis showed the hypervisor stunning the VM during backups, and Longhorn turning that into a cascade.</description>
    </item>
    <item>
      <title>A GitLab upgrade and two signals that lied</title>
      <link>https://stebas.com/posts/gitlab-upgrade-signals-that-lie/</link>
      <guid>https://stebas.com/posts/gitlab-upgrade-signals-that-lie/</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>A routine minor upgrade of self-hosted GitLab in Docker. A pre-flight check claimed 32 pending migrations, and the container reported healthy while serving nothing.</description>
    </item>
    <item>
      <title>Updating the OS on seven Kubernetes nodes without anyone noticing</title>
      <link>https://stebas.com/posts/rolling-os-update-seven-nodes/</link>
      <guid>https://stebas.com/posts/rolling-os-update-seven-nodes/</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>A rolling Ubuntu point update across a cluster that holds all its own state. The pre-flight checks turned a scary job into a boring one, and Longhorn decided the pace.</description>
    </item>
    <item>
      <title>One stale DHCP option took down a whole Kubernetes cluster</title>
      <link>https://stebas.com/posts/stale-dhcp-route-killed-cluster/</link>
      <guid>https://stebas.com/posts/stale-dhcp-route-killed-cluster/</guid>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
      <description>After a host reboot about fifty pods crashlooped while every node was Ready. The cause was a forgotten DHCP classless-route option that silently removed the default gateway.</description>
    </item>
    <item>
      <title>Merged, synced, mounted — and still not alerting: vmalert without hot reload</title>
      <link>https://stebas.com/posts/vmalert-rules-no-hot-reload/</link>
      <guid>https://stebas.com/posts/vmalert-rules-no-hot-reload/</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>New Kafka alert rules went through Git and Argo CD into the ConfigMap, yet vmalert never evaluated them. The GitOps pipeline broke on its very last step.</description>
    </item>
    <item>
      <title>A Grafana panel that tells you when a pod will OOM</title>
      <link>https://stebas.com/posts/grafana-capacity-forecast-dashboard/</link>
      <guid>https://stebas.com/posts/grafana-capacity-forecast-dashboard/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>Turning a memory trend into a time-to-OOM and time-to-full ETA in PromQL, the two bugs that made it lie, and the leak it caught on day one.</description>
    </item>
    <item>
      <title>ONLINE_UNCERTAIN: when the MySQL operator and the database disagree</title>
      <link>https://stebas.com/posts/innodb-online-uncertain-rescan/</link>
      <guid>https://stebas.com/posts/innodb-online-uncertain-rescan/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>A router flapping, an operator stuck in a lock for two days, a CRD frozen at 2/3 — while all three InnoDB Cluster members were healthy. The fix was one metadata rescan.</description>
    </item>
    <item>
      <title>Vault Secrets Operator went quiet after a seal — and a restart did not wake it</title>
      <link>https://stebas.com/posts/vso-stuck-after-vault-seal/</link>
      <guid>https://stebas.com/posts/vso-stuck-after-vault-seal/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>38 of 43 VaultStaticSecrets stuck for two days with a frozen error. Unsealing Vault and restarting the operator did nothing; a one-field spec change did.</description>
    </item>
    <item>
      <title>A WordPress login loop that only happened sometimes</title>
      <link>https://stebas.com/posts/wordpress-redirect-loop-per-pod-salts/</link>
      <guid>https://stebas.com/posts/wordpress-redirect-loop-per-pod-salts/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>wp-admin bounced back to the login page with reauth=1, but not always. The cause was random auth salts generated per pod behind a non-sticky load balancer.</description>
    </item>
    <item>
      <title>Three incidents that were one: a database IP baked into a config</title>
      <link>https://stebas.com/posts/dbaas-master-ip-change/</link>
      <guid>https://stebas.com/posts/dbaas-master-ip-change/</guid>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <description>Login 500s, backends in CrashLoopBackOff and a stuck rollout looked like three problems. All of them were one hardcoded database IP in a pgbouncer config.</description>
    </item>
    <item>
      <title>The "disk errors" were an OOM: how Longhorn volumes lost their backend</title>
      <link>https://stebas.com/posts/longhorn-eio-was-node-oom/</link>
      <guid>https://stebas.com/posts/longhorn-eio-was-node-oom/</guid>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <description>EIO, read-only ext4, a corrupted MySQL datadir and a sealed Vault looked like a failing disk. Host dmesg showed a node-wide OOM that killed the Longhorn instance-manager first.</description>
    </item>
    <item>
      <title>"Vault keeps sealing itself" — no, it just never unseals</title>
      <link>https://stebas.com/posts/vault-shamir-reseals-on-restart/</link>
      <guid>https://stebas.com/posts/vault-shamir-reseals-on-restart/</guid>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <description>A Vault pod sat at Ready 0/1 for days while raft quorum quietly held on two peers. Nothing was sealing it: Shamir seal without auto-unseal leaves every restart sealed.</description>
    </item>
    <item>
      <title>A Longhorn volume that would not grow: an attachment ticket pinned to a bad node</title>
      <link>https://stebas.com/posts/longhorn-online-expansion-stuck-on-bad-node/</link>
      <guid>https://stebas.com/posts/longhorn-online-expansion-stuck-on-bad-node/</guid>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
      <description>A PVC sat in Resizing forever while Longhorn retried the expansion every five seconds without an error. The volume was locked to one unhealthy node by a stale attachment ticket.</description>
    </item>
    <item>
      <title>Changing an immutable StatefulSet field without restarting a single pod</title>
      <link>https://stebas.com/posts/resize-immutable-sts-field/</link>
      <guid>https://stebas.com/posts/resize-immutable-sts-field/</guid>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
      <description>Git said 20 GiB, the live StatefulSet ran 6 GiB templates and Argo CD said Synced. How orphan deletion plus OnDelete rebuilt the template with zero downtime.</description>
    </item>
    <item>
      <title>Five days at 1/3 with every dashboard green: when a CRD status lies</title>
      <link>https://stebas.com/posts/crd-status-lies-stalled-controller/</link>
      <guid>https://stebas.com/posts/crd-status-lies-stalled-controller/</guid>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
      <description>A MySQL InnoDB Cluster ran without HA for five days while its status, the pod phase and the readiness gate all said healthy. All three came from one stalled operator.</description>
    </item>
    <item>
      <title>Helm says "another operation is in progress" — and nothing is running</title>
      <link>https://stebas.com/posts/helm-pending-upgrade-lock/</link>
      <guid>https://stebas.com/posts/helm-pending-upgrade-lock/</guid>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <description>A cancelled CI job left two Helm releases stuck in pending-upgrade and blocked every deploy. How to find the lock, release it safely and check a whole namespace at once.</description>
    </item>
    <item>
      <title>How I think about the platform</title>
      <link>https://stebas.com/posts/hello/</link>
      <guid>https://stebas.com/posts/hello/</guid>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <description>Platform as product, GitOps, CI/CD, DevSecOps — predictable releases and security in the pipeline, not after the fact.</description>
    </item>
  </channel>
</rss>
