Kubernetes SRE guide
Kubernetes Multi-Region Architecture and Edge Failover Guide
Choose regions, data boundaries, and traffic controls for a multi-region deployment from application correctness and measured user experience, not geographic intuition alone.
On this page
A Kubernetes multi-region architecture can reduce exposure to a regional failure and bring some workloads nearer to users. It also introduces more state, coordination, routing, release, observability, and incident-response complexity than a single-region deployment. An edge layer can improve delivery decisions for suitable traffic, but it cannot make a strongly consistent write safe across regions or remove the latency of a centralized dependency.
For a business running one intelligent entry point in front of several regional origins, this is the same discipline at a wider radius: a managed edge-orchestration layer can steer traffic across every region, but it cannot invent write authority the application never designed for — it can only make the regional failover decision faster and visible in one place.
Data design comes before traffic steering
Decide where authoritative writes live, how replicas lag or conflict, and what a user sees during a regional failure before sending the same session to more than one region.
Overview
Outcome and prerequisites
Outcome: Acme Shop can deliver public catalog reads close to EU and US customers while keeping checkout writes in their home authority and rehearsing a bounded, reversible US application failover. Prerequisites: two independently deployable clusters, documented data authority, a tested same-authority standby, regional capacity evidence, edge-to-origin authentication, and synthetic checkout telemetry.
Running scenario: Acme Shop protects checkout authority
Acme Shop serves public catalog pages from regional edge caches. EU customer accounts and checkout writes remain in the EU authority; US accounts and checkout writes remain in the US authority. Product catalog reads can use approved replicas with a disclosed freshness policy. During a US application-region outage, Acme can shift a small US checkout cohort only to a compatible US standby with payment, data, and capacity prerequisites. It does not route EU personal data or US payments to another authority simply because it is geographically close or healthy. Each authority runs its own Kubernetes cluster and control plane — no cluster or etcd quorum is stretched across the Atlantic, for reasons covered below.
- EU and US shoppers
Requests enter the nearest approved edge.
- Regional edge
Public catalog reads may be served from a safe cache; private and write routes are explicit.
- Home authority
Account and checkout writes remain in their documented EU or US authority.
- Compatible standby
A same-authority standby receives only a progressive, approved failure shift.
- End-to-end evidence
Synthetic journeys and traces prove destination, correctness, latency, and capacity.
Figure 1. Edge proximity improves delivery for suitable traffic, while account and checkout authority remains an application and data invariant.
Classify data and choose a topology
Separate static public assets, cacheable public responses, personalized reads, authenticated writes, asynchronous jobs, and control-plane functions. For every store, document source of truth, replica topology, replication lag, conflict resolution, backup and restore, encryption and residency constraints, and behavior during partial failure. Include sessions, rate-limit counters, queues, secrets, certificates, feature flags, and identity dependencies; a service is not stateless merely because its pods are replaceable.
A single active region with tested recovery is often the simplest consistency model. Active-passive application regions can reduce startup time while preserving write ownership. Active-active systems require explicit partitioning, affinity, or a data system designed for the needed consistency. Running the same image in two regions does not make a system active-active if all meaningful writes depend on one database region.
Stateful workloads add a second topology axis. A pod bound to a zonal PersistentVolume cannot reschedule to a zone the volume cannot reach, and the same logic compounds across regions: a StatefulSet replica provisioned against US storage has no safe home in the EU cluster, however idle EU capacity looks. Acme tags each store as zonal, regional, or authority-bound so a capacity-driven reschedule never tries to move a stateful pod somewhere its data cannot follow.
Design the control plane behind a Kubernetes multi-region architecture
A Kubernetes multi-region architecture is a decision about how many control planes you run, not only how many regions you serve. etcd's Raft consensus assumes low single-digit-millisecond round trips between members; stretch one quorum across regions typically tens to hundreds of milliseconds apart, and the result is leader elections and write stalls under ordinary conditions, not only during an outage. Acme therefore runs one independent control plane, etcd quorum, and failure domain per region, so a regional outage never also removes the one thing an incident needs most: the ability to decide.
Cross-cluster service discovery is still evolving: the Multi-Cluster Services API pairs a ServiceExport in one cluster with a ServiceImport in another, inside a trusted ClusterSet. Implementations exist, but the API remains a pre-GA proposal covering discovery only — it never decides which cluster is authoritative. Acme treats it as a faster path to another region's services, not a substitute for the authority map above.
One review across every cluster and every provider
Two control planes are the right call for isolation, but they also mean two etcd datastores and two dashboards an authority rule can drift out of sync with. Acme watches both regional clusters and every edge provider ahead of them through Optimi's MYO, so "which cluster is authoritative right now" resolves to one audited timeline, not a cross-reference exercise mid-incident.
Make Kubernetes placement explicit for a multi-region deployment
Deploy each regional workload reproducibly and validate it under its intended failure role. The following Kubernetes topologySpreadConstraints example spreads checkout-api across zones within one Acme Shop regional cluster. It improves zone distribution; it does not substitute for cross-region data replication, capacity, or a failover policy.
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout-api
namespace: acme-shop-us
spec:
replicas: 6
selector:
matchLabels:
app: checkout-api
template:
metadata:
labels:
app: checkout-api
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: checkout-api
containers:
- name: checkout-api
image: registry.example.invalid/acme/checkout-api:2026.07.14
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
memory: 1Gi
That spread constraint controls placement within one region's cluster; it says nothing about which region receives a request in the first place — that decision happens one layer up.
Zone-local routing vs. cross-region traffic steering
Kubernetes has its own native mechanism for zone-aware traffic, at a different layer than the cross-region decision this guide is mainly about. A Service's trafficDistribution field can request PreferSameZone — route to an endpoint in the client's own zone when one is healthy — or PreferSameNode. Pair it with topology-aware routing so kube-proxy has zone hints to act on:
apiVersion: v1
kind: Service
metadata:
name: checkout-api
namespace: acme-shop-us
annotations:
service.kubernetes.io/topology-mode: Auto
spec:
selector:
app: checkout-api
trafficDistribution: PreferSameZone
ports:
- port: 443
targetPort: 8443
This cuts cross-zone latency and, on most clouds, cross-zone transfer cost — but it is entirely intra-cluster, with no concept of the EU or US authority boundary. It falls back to cluster-wide routing when zones are too skewed or sparse to balance safely, and is incompatible with internalTrafficPolicy: Local. Treat it as an optimization layered underneath — never in place of — the authority-aware steering below.
Traffic steering for the cross-region decision itself can operate at DNS, an edge proxy, global load balancer, or application layer. Choose the control point for propagation behavior, protocol needs, session handling, observability, and rollback speed. DNS caches and client behavior can delay a change. Use health checks that represent the journey users need, but do not make them so deep that an optional slow dependency withdraws all capacity. Every policy needs a documented rollback and an access-controlled, audited manual override.
For a 50% planned shift of a 800 requests-per-second US checkout load with 30% headroom, the standby needs at least 800 x 0.5 x 1.3 = 520 requests per second of validated safe capacity. Validate database pools, payment-provider quota, TLS, WAF or rate policy, queue workers, and deployment parity at the same time.
Traffic steering follows data authority first. Health and proximity can choose among approved destinations, but cannot authorize a cross-authority write failover.
trace_id=4bf92f7a route=POST /checkout client_region=US
selected_origin=us-east-authority authority=US steering=primary cache_status=BYPASS
journey_health=healthy deployment=2026.07.14 standby_capacity=520rps
eu_authority_requests_to_us=0 decision=hold_primaryRehearse regional failover and failback
Measure from the user or synthetic client through DNS, TLS, edge, ingress, application, data store, and critical external services. Segment by user region, route, selected origin, network, and release. Keep shifts progressive: start with a limited cohort or path, hold for a defined dwell period, and expand only while customer success, latency, data behavior, and regional saturation meet the approved criteria. A full immediate shift can turn an isolated incident into a global capacity event.
Failback deserves the same caution. Restoring 100% of traffic the moment primary's health check turns green can recreate the incident from another angle: caches are cold and pools unwarmed, so the just-recovered region absorbs a load step instead of a ramp. Reverse the same progressive-shift schedule used for failover — small cohort, dwell, then expand.
Validation
Validation, rollback, and failure behavior
In an approved exercise window, establish baseline US checkout success, p95 latency, payment behavior, queue age, and regional capacity. Make only the scoped US primary journey check fail, shift 10% of disposable synthetic checkout traffic to the compatible US standby, and hold for the dwell period. Verify EU requests never select US authority and each test order is recorded once. Restore primary health, wait for recovery hysteresis, and shift traffic back gradually. If duplicate, uncertain, or cross-authority behavior appears, halt the shift, restore the last reviewed route policy or primary destination, preserve evidence, and reconcile only through the documented payment and order process. Do not force global failover or bypass security controls to complete an exercise.
Troubleshooting
Troubleshooting
| Symptom | Likely cause | Safe check | Recovery |
|---|---|---|---|
| Traffic flaps between regions | Health check lacks recovery hysteresis or minimum dwell | Compare health history with routing events | Add consecutive-success and dwell requirements before repeating the exercise. |
| Standby receives traffic but checkout fails | Missing deployment, secret reference, dependency, or quota parity | Run an approved synthetic checkout and inspect dependency health | Halt the shift, restore primary routing, and repair the missing prerequisite. |
| EU request reaches a US service | Proximity rule overrode data-authority policy | Inspect sanitized trace attributes for route and authority | Disable the unsafe route rule, restore the reviewed policy, and assess exposure through the proper process. |
| Origin load spikes after regional shift | Cache is cold, cache key differs, or shield is bypassed | Compare hit ratio, cache keys, and origin concurrency | Pause further shift, restore cache consistency, and warm only public paths. |
| DNS change appears ineffective | Recursive resolvers retained the prior answer | Compare resolver responses with edge traffic distribution | Use the approved edge control for a confirmed outage and allow DNS caches to converge. |
| Zone-local routing stops balancing across zones | EndpointSlice hint safeguard fell back to cluster-wide routing | Inspect kubectl get endpointslice -o yaml hints and node zone labels | Restore endpoint density or labels; the fallback is safe default behavior, not an incident. |
| Cross-cluster service import resolves to the wrong region | Stale or misconfigured ServiceExport/ServiceImport | Compare cluster exports against the authority map | Correct or remove the export; discovery must never override the failover policy. |
Related guides
Authoritative references
- Kubernetes: Multi-Zone
- Kubernetes: Topology Aware Routing
- Kubernetes: Service Traffic Distribution
- Kubernetes Enhancement Proposal: Multi-Cluster Services API
- Google SRE: Data Integrity
- Google SRE: Disaster Recovery Planning
Put one view over every region in your Kubernetes multi-region architecture
Talk to Optimi about orchestrating Performance, Security, and Visibility across every regional cluster and edge provider you run, so a regional failover stays a rehearsed decision, not a scramble.
Discuss multi-region failover readiness