Skip to main content
So far we’ve covered how to stand the system up and send it a prompt: the request reaches the gateway, the scheduler picks a pod, and an answer returns. The middle step — the scheduler — does most of the hard work, so let’s expand that. The component we’ve been calling the scheduler (or the “small brain” out front) has a proper name: the Endpoint Picker (EPP). Its job is exactly that — pick an endpoint (pod) from a fleet that can serve the request. If you’ve run services in production you’re familiar with load balancers: they watch server health and steer new requests toward the least-busy server. It would be natural to assume an LLM-serving system behaves the same way (just with fancier metrics). The key difference — and the source of much of the throughput improvement here — is that it does not. Instead, the EPP uses a per-request, claim-based scoring model that factors in cache affinity and load to minimize expensive context reloads. Typical topology:
  • A fleet of pods (prefill pods, decode pods, cache-aware instances).
  • A Kubernetes gateway that takes requests off the network.
  • The EPP running beside the gateway to decide which pod gets each request.
Inside the EPP, a request flows through three high-level stages:
The flow-control stage contains several important policies (rate limiting, prioritization, concurrency limits). These policies are complex and are beyond the scope of this article.
Request scheduling itself breaks down into three sub-steps. Conceptually, for a chat request like:
the EPP does the following:
  • Filter: remove pods that cannot handle the request (wrong role, not ready, model not loaded, insufficient GPU memory, etc.). From an initial pool of 40 candidates you might end up with ~12 suitable pods.
  • Score: run a set of scoring plugins on each remaining candidate and compute numeric scores.
  • Select: pick the highest-scoring pod and forward the request.
A dark teal slide titled "Filter, Score, Select" with a left-side rounded turquoise button labeled "EPP" and multiple small score badges (e.g., 0.4, 0.6, 1.1) scattered on the right. The layout is minimalist and includes a small "© Copyright KodeKloud" note at the bottom.
Scoring is plugin-driven. The EPP uses a shortlist of scorer plugins that each assert a numeric claim about a pod at that moment. Typical plugins include: Each plugin runs over the same filtered list and produces a numeric contribution. The EPP adds these contributions to produce a final score per pod, then selects the highest-scoring pod.
A dark-themed infographic titled "The Routing Brain" showing a three-step flow: 1) Filter, 2) Score (with KV cache and Load), and 3) Select. A small "pod" progress card at the bottom left shows a partially filled bar and "39% saved."
Why is this different from a plain load balancer? Consider a simple example: pod 0 is busier than pod 1. A classic load balancer would pick pod 1 to keep load balanced. But if pod 0 already contains most of your conversation in its KV cache, sending the request to pod 0 avoids an expensive context reload. The EPP will add the cache-affinity score to the load score, and pod 0 can end up with a higher total score — so the router intentionally routes to the busier pod to skip the reload delay. This behavior trades short-term load balance for lower overall latency for the request being routed — it’s an intelligent trade-off that produces the measured throughput gains.
A dark-themed infographic titled "A Real Pick" showing two server pods ("pod 0" and "pod 1") with progress bars and queue sizes. Below them are two vertical bars comparing metrics (cache and load) for each pod.
Conceptually: the EPP is a scoring loop over a filtered list. Each numeric score is a claim about a pod in that instant — how busy it is, what context it holds, queue depth, etc. These real-time claims are summed into a single value that represents how well a pod can serve the request right now.
A diagram titled "What a Load Balancer Would Have Done" showing a load balancer and an EPP component routing traffic through a pause/queue to two pods labeled pod1 and pod0. Arrows, queue counts and status markers indicate how requests would be distributed.
This claim-based scoring is the source of the numeric speedup: the router can route your request to the pod that already “remembers” you, avoiding reloading large contexts from backing storage. That optimization is not merely a better load balancer — it’s an intelligent router that combines cache affinity with load-awareness to make per-request decisions.
A dark infographic slide titled "Where the 3x Comes From" with a large "3x" and the equation "0.9 + 0.2 = 1.1" in the center. It also shows UI-style blocks labeled "Load Balancer," "EPP," and "pod 0."
Where do the numeric score components come from? Each score is derived from metrics that describe the fleet at that moment: per-pod load, queue lengths, cache contents, age of cached items, and other telemetry. The next section (not covered here) explains how the EPP gathers and maintains these metrics so the scorer can make accurate claims.
A presentation slide titled "Where Do the Numbers Come From?" showing an EPP block on the left feeding into a large circle filled with a grid of small blue tiles, each displaying a shield icon and a question mark. An arrowed circular outline indicates data flow around the tiles.
Further reading and references:

Watch Video