Ajay Akilan
01The work

Six things I've done to one system.

Zoom’s chat platform runs in fifteen regions across AWS, Azure and OCI. I own the messaging services on it — the APIs, the real-time messaging layer, and the public edge.

Reading length — for review

01hours → 3 min

Record / 01

Moved the services onto Kubernetes

They ran on virtual machines managed by configuration scripts, and a deploy took hours because a deploy meant touching machines. I owned the move for my services — building the infrastructure definitions and the deployment pipelines, with verification built into them rather than added afterwards.

Deploys went from hours to under three minutes. Rollbacks to under two.

I also built production clusters from nothing on three different clouds, including one region delivered end to end. Building a region from an empty account showed me how much of our setup was actually deliberate and how much had just been copied forward.

Operating recordMIGRATION
BEFORE
VIRTUAL MACHINESConfiguration scripts · deploys took hours
Replatform services
INFRASTRUCTUREDefinitions → production cluster
DELIVERY PIPELINEDeploy → verify → rollback on failure
KUBERNETES SERVICESProduction clusters across three clouds
< 3 mindeploy< 2 minrollback
Infrastructure provisioning and application delivery are separate paths. A cluster is the execution environment, not a build artifact.
027h → 52m

Record / 02

Cut a seven-hour release to fifty-two minutes

Releases ran across multiple clusters on different days, and active-active doubled the surface. Verification was manual — an engineer triggering jobs in sequence and reading each result by hand — and end to end a release took about seven hours, most of it verification and waiting.

I rebuilt it on our internal workflow engine, starting on the canary and dogfood clusters, replacing each manual step with a platform component or building what didn't exist yet.

Verification was the part I underestimated. Across that many clusters the cost compounds, and a slip there causes real problems — the step meant to catch mistakes was the one most prone to them at that scale. The wall was that it needed shell scripts running against pods, and the workflow engine couldn't do that. So I went into the pipeline runtime underneath it and extended it until it could.

The script checks process health, logs, metrics, ports and release versions, then parses the output: fail on what matters, flag what needs a look, pass when it's clean. It tells you what's wrong, not just that something is.

Parallel deploys were argued about on reliability grounds. My position was that active-active was already in place and the infrastructure supported it — one side down doesn't affect the side still serving. A failed release now rolls back in parallel too, so recovery got faster as a side effect.

Fifty-two minutes now, deploying and verifying together, and verification runs against every pod rather than one sample per cluster. That caught edge cases we'd been missing.

Other services have picked up the pattern since, and the verification script gets adapted and asked about. I'd rather build the thing the next service can pick up than the thing that only solves my problem.

Operating recordRELEASE
PREVIOUS · 7h
REBUILT · 52m
INTERNAL WORKFLOW ENGINEUnderlying runtime extended for pod shell checks
Parallel cluster execution
CLUSTER ADeploy → verify every pod
CLUSTER BDeploy → verify every pod
Checks: process · logs · metrics · ports · version
PASS → proceedFLAG → reviewFAIL → rollback
End-to-end release time, not per-stage durations. Verification runs on every pod; failed releases support parallel rollback. Canary and dogfood clusters were the starting point.
03−50% edge cost

Record / 03

Replaced the public edge while it was serving

The edge layer is where every request arrives. I led its replatform across the production fleet on two clouds — phased cutovers, automated verification and failover validation at each stage, no customer impact, and edge infrastructure cost on the largest cluster cut in half.

The reason it worked is a tool I wrote. The DNS zone has over a hundred thousand records, and moving traffic weight across it by hand is the kind of task where one wrong entry is a very bad afternoon. So: a Python CLI that traces the resolution chain with live health-check data overlaid, changes weights in bulk behind a preview-confirm-apply flow, and writes an audit line for every change. It became my standard tooling for cutovers, and I shared it with my team. I mostly wanted to be able to see what I was about to do before I did it.

I also ran the cache-layer transition from Redis to Valkey as a documented process that became the team standard, and retired the legacy edge stack — DNS, certificates and monitoring cleaned up behind it. That part took longer than the replacement did.

Service topologyEDGE
WEIGHTED DNSEndpoint selection · health signals
DNS lookup / answer · not a request proxy
Client connects to a resolved endpoint

REGION A LIVE

EDGE PROXYPhased replacement · verified cutovers
KUBERNETESChat backend services
Independent data access
DOCUMENT STORE
CACHE

REGION B LIVE

EDGE PROXYPhased replacement · verified cutovers
KUBERNETESChat backend services
Independent data access
DOCUMENT STORE
CACHE
Parallel regional request paths, not serial edge hops. DNS changes: preview → confirm → apply → audit. Verification and failover validation accompany each phase. Conceptual estate. Cross-region data replication and consistency are out of scope for this diagram.
0414 of 15

Record / 04

Made losing a region uneventful

Active-active was a fleet-wide programme; I ran it for the chat backend and edge services, across fourteen of fifteen production clusters. Both regions live, traffic weighted between them, failover wired into the traffic-orchestration console. Losing one means shifting DNS weight to the side still serving. New lookups resolve there, though connections already open to the failed region drop, and cached answers can keep pointing at it until they expire.

Most of that work wasn't architecture. It was VPC peering, route tables, DNS resolution conflicts and scheduler behaviour. None of it was difficult to understand and all of it took a long time.

Certificates came out of the same work. I automated the TLS lifecycle for the edge, validating rotations on a node running the full production configuration but taking no live traffic, before anything real touched it.

Service topologyREGION FAILURE
WEIGHTED DNSHealth signals · weight shifted to the serving region
DNS lookup / answer · not a request proxy
New lookups resolve to region A

REGION A LIVE

EDGE PROXYPublic request ingress
KUBERNETESChat backend services
Independent data access
DOCUMENT STORE
CACHE

WEIGHT 100

REGION B UNAVAILABLE

EDGE PROXYPublic request ingress
KUBERNETESChat backend services
Independent data access
DOCUMENT STORE
CACHE

WEIGHT 0

DNS SELECTIONNew answers return region ASERVICE AVAILABILITYRegion B is not servingCLIENT RECOVERYOpen connections to B fail; clients retry
Region B unavailable, with DNS weight moved to the region still serving. Shifting weight changes which endpoint new lookups resolve to; it does not move connections already open to the failed region, and cached answers can keep returning region B until they expire. A zero-weight record may still be selected when no positive-weight record is healthy. Conceptual estate. Cross-region data replication and consistency are out of scope for this diagram.
05SLOs + runbooks

Record / 05

Built the view of what's happening

The company moved off Grafana onto an internal metrics platform; I took my services across and built out what they needed — dashboards covering infrastructure, application, API and load balancer metrics, alerting sorted into severity tiers and tied to runbooks, and service level objectives defined with the developers rather than handed to them.

I've been on call since my third month and have run incident response for the messaging estate through hundreds of P0 and P1 events, alongside the NOC, development and platform teams. Every one turned into a change somewhere — a metric, a threshold, a runbook.

Most of the work was taking alerts away.

Operating recordOBSERVE
SERVICE METRICSBehaviour across the messaging estate
INTERNAL METRICS PLATFORMMigrated from Grafana
DASHBOARDSInfrastructure · application · API · load balancer
SLOs + ALERTSDeveloper-defined objectives · severity tiers
RUNBOOKS + INCIDENT RESPONSENOC · development · platform teams
Alerting is tied to runbooks and pruned deliberately: the goal was fewer alerts, not more.
06−29 → −77%

Record / 06

Took 29 to 77 percent off what it costs to run

Instance right-sizing, storage-mode tuning across the document store and cache layers, and Kubernetes resource refinement, applied across the services I own. Per-cluster reductions between 29 and 77 percent, with six-figure annual savings, and I wrote the roadmap that keeps it from drifting back.

None of it was possible before the monitoring was good enough to show what the services actually used.

Operating recordCOST
MEASURE ACTUAL DEMANDMonitoring before capacity changes
Optimisation approaches, applied in parallel
INSTANCESRight-size
STORE + CACHEStorage / capacity modes
KUBERNETESResource refinement
29–77%per-cluster cost reduction
Reported per-cluster reduction range. Six-figure annual savings; a maintenance roadmap limits drift.

Active-active / 04

Both regions live.

Losing one means shifting DNS weight to the side still serving. New lookups resolve there; open connections to the failed region drop, and cached answers can keep pointing at it until they expire.

DNS weighting / 01

Shift the DNS weights.

Region A60DNS WEIGHT
Region B40DNS WEIGHT
DNS WEIGHT 60/40BOTH REGIONS WEIGHTED

Relative DNS selection weights, not measured request percentages. Resolver caching, TTLs, health evaluation, and existing connections affect failover timing. A zero weight is not a health-failure simulation; provider-specific fallback rules may still select zero-weight records.

02Working inventory

The toolbox.

01 / CloudAWS: EKS, EC2, Route 53, DynamoDB, ElastiCache, VPC, IAM, Lambda, S3 · Azure: AKS, Cosmos DB, Functions · Oracle Cloud Infrastructure
02 / Containers & orchestrationKubernetes (CKA), Docker · resource requests and limits, autoscaling, namespace and RBAC conventions
03 / CI/CD & deliveryJenkins, GitLab CI, Tekton, an internal Kubernetes delivery platform · canary, blue-green, rolling and active-active strategies · automated verification gates, parallel deploy and rollback
04 / Infrastructure as codeTerraform, Ansible · remote state, plan-review-apply, protected branches, peer review
05 / ObservabilityPrometheus, Grafana, Elasticsearch and Kibana, an internal metrics platform · SLI/SLO definition, severity-tiered alerting tied to runbooks, incident command
06 / Networking & edgeNGINX, OpenResty, NGINX Plus, NLB/ALB · Route 53 at 100,000+ records, VPC peering, weighted DNS, TLS certificate lifecycle
07 / Data & cachingDynamoDB, Redis, Valkey, ElastiCache, Cosmos DB · capacity-mode and storage-tier tuning
08 / LanguagesPython (boto3, CLI tooling), Bash, Lua · Linux production debugging with strace, netstat, lsof
09 / CertificationsCertified Kubernetes Administrator (2025) · Kubernetes and Cloud Native Associate (2025) · AWS Certified Cloud Practitioner (2023)