Skip to main content

Free O’Reilly Book | Linkerd: Up & Running

Download
close
Cost optimization · Kubernetes

Load Balancing and Reliability for gRPC on Kubernetes

Linkerd delivers automatic, per-request gRPC load balancing and advanced traffic management to ensure optimal microservice performance, seamless scaling, and reliability across your Kubernetes clusters without requiring a single code change.

Why your cross-zone bill is so high?

Cloud providers bill for traffic that crosses an availability-zone boundary, charged in each direction. Kubernetes spreads traffic as evenly as it can across pods, so in a typical 3-zone cluster about two-thirds of your traffic crosses a zone boundary and gets billed for it.

$100K–$1M+

Annual cross-zone charges at 1 GB/s on AWS (high-traffic cluster)

≈ 0

Cross-zone cost on Azure — in-zone routing highest-value on AWS & GCP

Why Kubernetes can't load balance gRPC

Kubernetes relies on layer-4 routing, which distributes traffic on a per-connection basis rather than per-request. Because gRPC utilizes long-lived HTTP/2 connections to maximize efficiency, Kubernetes sends all subsequent requests down the exact same initial pipeline instead of spreading them across available pods.

This inherent architectural clash leads to severe traffic imbalances and underutilized replicas, requiring an application-layer proxy to achieve true load balancing.

1 of N pods

p99 latency spikes under load. The hot pod queues while the rest sit idle. HTTP/2 long-lived connections route at L4, once at connect time.

HTTP/2 + Kubernetes L4 routing · one TCP connection per client

163ms faster p99

Linkerd proxies read L7 and route each request to the fastest live replica with EWMA. Automatic the moment the service is meshed — zero configuration.

Sub-ms p99 per proxy · 2025 benchmark · linkerd.io

The Kubernetes blog documents that balancing gRPC means deciding per request, at L7. That's what a service mesh does.

What you get

Mesh your gRPC services and you get per-request balancing, retries, timeouts, and circuit breaking with no code changes and no configuration.

Even load, zero config

Per-request balancing for HTTP/2 and gRPC the moment a service is meshed, so every replica shares load.

Checkmark

Reliability without changing code

Retries, timeouts, and circuit breaking set by annotation on standard Gateway API resources.

Canary deployments driven by real metrics

Progressive delivery that promotes or rolls back on actual success-rate and latency.

Low latency overhead

Built on a lightning-fast Rust micro-proxy that uses under 10MB of memory per pod, Linkerd was proven in a 2025 benchmark to be 163ms faster at the p99 tail latency than Istio at 2,000 RPS.

How it works

Linkerd's proxy reads gRPC at L7 and balances every request across all healthy endpoints, using an exponentially weighted moving average (EWMA) to favor the fastest. Reliability (retries, timeouts, circuit breaking) and traffic routing for canary releases ride on the same proxy, configured through annotations and Gateway API HTTPRoute / GRPCRoute resources.

Request-level gRPC load balancing with Linkerd

Each gRPC request is balanced across all replicas. No single pod runs hot

Without Linkerd With Linkerd
application gRPC client pod backend replica 1 backend replica 2 backend replica 3 kubernetes cluster application microproxy gRPC client pod per-request (EWMA) backend replica 1 backend replica 2 backend replica 3 kubernetes cluster
application gRPC client pod backend replica 1 backend replica 2 backend replica 3 kubernetes cluster application microproxy gRPC client pod per-request (EWMA) backend replica 1 backend replica 2 backend replica 3 kubernetes cluster

Kubernetes pins gRPC connections to one pod. Replicas 2 and 3 sit idle while replica 1 handles all the load.

Zone-aware load balancing with HAZL

Under normal load HAZL keeps requests in-zone; when the in-zone endpoint is overloaded or returning errors, it spills to another zone, then returns in-zone as load recovers.

Balance gRPC the day you mesh it

Linkerd focuses on the operator experience. By keeping resource consumption low and taking advantage of standard resources before creating Linkerd-specific CRDs, it creates a simple experience delivering the features you need.

Real-world concerns

✗  Circuit breaking won't catch gRPC app errors (HTTP 200 + trailer status)

✗  Retries amplify load, so limit to idempotent methods and use budgets

✗  Headless services are not balanced

✗  Sidecar per pod = real per-pod cost (kept low by <10 MB footprint).


What Linkerd adds

✓  L7 per-request balancing for HTTP/2 and gRPC using Gateway API

✓  Retries, timeouts (composable since 2.16)

✓  Endpoint-level circuit breaking (5xx accrual)

✓  Progressive delivery using Gateway API and Flagger or Argo CD

✓  Rate-limit-aware balancing (HTTP 429, BEL 2.20)

✓  HAZL: zonal load balancing

✓  Lifecycle automation

✓  Hardened releases + commercial support

Why gRPC is better with Linkerd

1

Per-request balancing, zero config

Linkerd automatically load balances traffic across all destination endpoints the moment a service is meshed, solving the "hot pod" problem instantly. By using advanced EWMA (Exponentially Weighted Moving Average) and power-of-two-choices algorithms, the proxy dynamically routes gRPC traffic to the fastest replica. Furthermore, Linkerd 2.20 adds rate-limit-aware load balancing, meaning the proxy automatically detects HTTP 429 or gRPC RESOURCE_EXHAUSTED responses and shifts traffic away from overloaded pods to preserve overall throughput (and Buoyant Enterprise for Linkerd’s HAZL still keeps traffic in-zone where possible).

Read the docs ↗

2

Reliability

Linkerd lets you manage timeouts and retries entirely via declarative annotations on standard Kubernetes Gateway API GRPCRoute and HTTPRoute resources, as well as on Service resources.

Read the docs ↗

3

Endpoint-level circuit breaking

To prevent a single degraded pod from dragging down your entire application, Linkerd enforces client-side circuit breaking at the individual endpoint level. By default, the proxy automatically trips and isolates any endpoint that returns 7 consecutive 5xx or gRPC internal errors. It then safely probes the isolated instance using exponential backoff and jitter before gradually reintroducing traffic.

Read the docs ↗

4

Metric-Driven Progressive Delivery

Achieve risk-free canary and blue/green deployments by shifting traffic dynamically using standard Gateway API routing logic. Paired with Flagger or Argo CD, Linkerd uses its core golden metrics (real-time success rates and latency) to automatically promote stable software versions or roll back faulty ones based on live performance data rather than guesswork.

Read the docs ↗

Show me the evidence

Every claim is backed by a reproducible demo, a published cost model, and a CNCF track record.

Trusted in production

Trusted in production by Tradeshift, Expel and teams at Walmart, HP, and Expedia.

Migration without downtime

Tradeshift migrated to Amazon EKS without downtime. Expel expanded to AWS with Buoyant.

CNCF-graduated

Buoyant created Linkerd, coined the term "service mesh," and shipped the service mesh in July 28, 2021.

Frequently asked questions

Why doesn't Kubernetes load balance gRPC?

gRPC multiplexes requests over one long-lived HTTP/2 connection, and Kubernetes balances at the connection level, so all requests pin to one pod.

Does Linkerd need configuration to balance gRPC?

No. Request-level balancing for HTTP/2 and gRPC is automatic once a service is meshed.

How do I do canary deploys?

Dynamic request routing on Gateway API HTTPRoute/GRPCRoute with Flagger; the older SMI TrafficSplit is deprecated.

Does circuit breaking work for gRPC?

Balancing, retries, and timeouts do. Circuit breaking accrues on 5xx, so it won't trip on gRPC errors returned as HTTP 200 with a non-OK trailer status.