Database Connection Pool Blew Up Mid-Traffic-Shift: 6 Production-Grade Decisions for Blue-Green and Canary Deployment with Traffic Governance
Overview 2 AM. A ride-hailing platform’s payment service does a blue-green switch. The on-call engineer runs kubectl rollout to flip the Service selector, shifting traffic from blue to green. Everything looks fine — Pods are Ready, health checks pass, response latency looks normal. Three minutes later, the DBA chat explodes. Database connections spike from 200 to 1,200, the connection pool is maxed out, and five downstream services all time out. Root cause: the green environment’s app version updated the ORM framework, and the default pool size jumped from 20 to 100....
One Namespace Ate 80% of Cluster Memory: 4 Production-Grade Decisions for K8s ResourceQuota Multi-Tenant Governance
Overview The night before a major promotional event, all Pods in the test environment were stuck in Pending. kubectl top nodes showed node CPU usage at 35% and memory under 50%. The Deployment YAML had reasonable requests and limits. The problem? Not a resource shortage — the “ledger” was maxed out. A namespace’s ResourceQuota had hit its ceiling, and the admission controller was rejecting all new Pod creation requests. This incident forced me to re-examine the entire chain of K8s namespace-level resource governance....
5000 Alerts Nobody Reads: 6 Architecture Decisions from Fragmented to Unified Observability
Overview A friend of mine complained last year: his company deployed Prometheus, ELK, and Jaeger — three separate tool stacks maintained by a 7-person ops team. They spent 4 hours a day just triaging alerts. One night at 3 AM, the payment service hit a P0 incident, and it took 42 minutes from alert trigger to root cause identification. The root cause was a database connection pool configuration change causing slow query buildup....
From 60% Toil to 20%: A 5-Level SRE Team Maturity Model and 6 Engineering Decisions for Quantitative Self-Assessment
Overview When I took over an operations team in 2021, I ran a simple audit: 12 people, 40 hours per week each, averaging 24 hours spent on manual ticket handling, service restarts, and disk space cleanup. That’s 60% toil. Of the remaining 16 hours, half went to status meetings. Actual engineering time: under 8 hours per week per person. Everyone was busy, but the system was still unstable. MTTR sat at 40 minutes, availability at 99....
Pods OOM Killed at 3 AM: From working_set Blind Spots to a Memory Warning System in 5 Production Decisions
Overview 3 AM. The alert group exploded. Five pods were OOMKilled and restarted within 10 minutes. The on-call engineer opened Grafana, and every pod’s working_set was still 200MB below its limit—80% utilization. Monitoring looked fine. The pods died anyway. This is not an isolated case. When I was doing a Kubernetes migration for a new-energy logistics platform, I dealt with this exact pattern—“monitoring is green but pods die”—more than 10 times....
When Your Self-Hosted Terraform Backend Cracks at 30 Engineers: 6 Engineering Decisions and a TCO Ledger from Moving to HCP Terraform
Overview Monday stand-up, our platform engineering team at a mobility platform was reviewing last week’s incidents: 17 state lock conflicts, two production environments broken by a “helpful” colleague running apply manually, and one set of credentials sitting in plaintext in CI logs. The root cause wasn’t a single operator error—it was our self-hosted Terraform backend (Git repo + S3 state bucket + DynamoDB lock + hand-made CI scripts) that had stopped holding up once the team grew from 5 to 30 engineers....
Rollback Made It Worse: 5-Layer CI/CD Auto-Rollback Architecture and 4 Production Pitfalls
Overview 2:47 AM, the alert chat exploded. A payment service’s P99 latency spiked from 80ms to 1200ms after a new version went live. The on-call engineer hit rollback immediately. kubectl rollout undo executed successfully, old version Pods came back up, traffic shifted back. The result? The service went completely down — because the new version had run a database migration script that changed the status column in the orders table from varchar(20) to tinyint....
Zero-Failure K8s Migration of 120 Microservices: 6 Pitfalls Nobody Talks About from a 3-Month Real Migration
Overview Migrating 120+ microservices from traditional VM deployments to Kubernetes sounds like a standard project: write Dockerfiles, build a cluster, migrate services, shift traffic. In planning meetings, everyone thinks three months is enough. In practice, you discover that the real challenges aren’t about “how to get services running” — that’s just helm install — but about pitfalls nobody warned you about: circular dependencies in service graphs, in-memory state loss during stateful migration, CNI performance cliffs at scale, DNS caching traps during canary traffic shifts, ConfigMap bloat, and monitoring metric gaps after migration....
Stop Configuring Servers by Hand: A Complete Guide to Packer Golden Image Pipelines from Build to Security Scanning
Overview 2 AM, alert fires. Investigation reveals a server running an outdated OpenSSL version with known vulnerabilities. Security team asks: how many more machines are in the same state? You don’t have an answer. That’s the cost of configuring servers manually. Each machine gets its own apt install, producing environments that drift apart. Someone forgot a patch, someone installed extra packages, someone changed a kernel parameter without documenting it. When things break, you realize—you have no idea how many “configuration drift” variants are running in production....
New Service OOMed 2 Hours After Launch: Replacing Manual Approval with a 7-Dimension Production Readiness Gate
Overview 1:47 AM. Phone buzzed. Alert channel exploded. A newly launched recommendation service at a ride-hailing project went OOMKilled on all 3 Pods less than 2 hours after launch. Memory spiked from 800MB to the 2GB limit, the kernel killed the process, Kubernetes restarted the Pod, and it got killed again. Loop. Users were routed to the fallback path. P99 latency shot from 80ms to 2000ms. The postmortem found the root cause....