<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Kthena Blog</title>
        <link>https://kthena.volcano.sh/zh-Hans/blog</link>
        <description>Kthena Blog</description>
        <lastBuildDate>Tue, 30 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[Kthena v1.0.0 Released: Production-Ready Kubernetes-Native LLM Serving]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Summary]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#summary" class="hash-link" aria-label="Summary的直接链接" title="Summary的直接链接" translate="no">​</a></h2>
<p>We are excited to announce <strong>Kthena v1.0.0</strong>, a major milestone for Kubernetes-native LLM inference. This release focuses on production readiness across the serving stack: more accurate Gateway API routing, first-class role-level autoscaling for prefill/decode disaggregated workloads, safer role-level rolling updates, better router scheduling signals, session boost for multi-turn conversation workloads, richer cache-aware router observability with Prometheus metrics and example dashboards, and a more complete CLI experience.</p>
<p>Kthena v1.0.0 also includes an important autoscaling API consolidation. <code>AutoscalingPolicyBinding</code> has been removed, and target configuration now lives directly in <code>AutoscalingPolicy</code> through <code>homogeneousTarget</code>, <code>heterogeneousTarget</code>, and <code>disaggregatedTarget</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-highlights">Release Highlights<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#release-highlights" class="hash-link" aria-label="Release Highlights的直接链接" title="Release Highlights的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-features-overview">Key Features Overview<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#key-features-overview" class="hash-link" aria-label="Key Features Overview的直接链接" title="Key Features Overview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>AutoscalingPolicy consolidation and P/D coordinated disaggregated autoscaling:</strong> <code>AutoscalingPolicyBinding</code> is removed, and autoscaling target configuration is consolidated into <code>AutoscalingPolicy</code>; <code>disaggregatedTarget</code> enables coordinated role-level autoscaling for prefill/decode workloads, allowing each role to scale from its own metrics while keeping P/D replica ratios within healthy bounds through optional ratio constraints.</li>
<li class=""><strong>Session boost for multi-turn conversations:</strong> The router can prioritize follow-up requests from recently completed sessions, improving the chance of reusing warm KV cache under concurrent agentic and chat workloads.</li>
<li class=""><strong>Router scheduling and observability:</strong> Per-pod in-flight request tracking, Redis-backed cross-router synchronization, configurable pod metrics scraping, and cache-aware Prometheus metrics improve scheduling accuracy and operational visibility.</li>
<li class=""><strong>Role-level rolling update availability control:</strong> Enhancements to the <code>RoleRollingUpdate</code> feature. Now each role can set <code>maxUnavailable</code> to control the pace of the upgrade.</li>
<li class=""><strong>Gateway API and HTTPRoute correctness:</strong> Kthena router now honors HTTPRoute hostnames, keeps matched route rules consistent for backend selection and URL rewrites, fixes <code>PathPrefix</code> semantics, and respects Gateway listener <code>allowedRoutes</code>.</li>
<li class=""><strong>CLI and OpenAI-compatible API improvements:</strong> The CLI now exposes richer status output and supports <code>ModelRoute</code> and <code>ModelServer</code>, while the router adds an OpenAI-compatible <code>GET /v1/models</code> endpoint.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="autoscalingpolicy-consolidation-and-pd-coordinated-disaggregated-autoscaling">AutoscalingPolicy Consolidation and P/D Coordinated Disaggregated Autoscaling<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#autoscalingpolicy-consolidation-and-pd-coordinated-disaggregated-autoscaling" class="hash-link" aria-label="AutoscalingPolicy Consolidation and P/D Coordinated Disaggregated Autoscaling的直接链接" title="AutoscalingPolicy Consolidation and P/D Coordinated Disaggregated Autoscaling的直接链接" translate="no">​</a></h3>
<p>Kthena v1.0.0 introduces a simpler and more powerful autoscaling API. Users now configure what to scale, how to collect metrics, and scaling boundaries in a single <code>AutoscalingPolicy</code> resource.</p>
<p>The new <code>disaggregatedTarget</code> mode is designed for <strong>coordinated P/D autoscaling</strong> in role-based ModelServing deployments, especially prefill/decode disaggregated inference. Prefill and decode roles can make scaling decisions from their own metrics, while the autoscaler applies shared constraints so the two sides grow and shrink together instead of drifting independently. Each role can define its own replica range, metrics, and metric sources, and operators can configure a <code>ratioConstraint</code> to keep the P/D replica ratio within a healthy range.</p>
<p>Example <code>disaggregatedTarget</code> configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">disaggregatedTarget</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> workload.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ModelServing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vllm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">qwen</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prefill</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prefill_waiting_requests</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">targetValue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metricSources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">prefill_waiting_requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">prometheus</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">serverURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prometheus</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stack</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prometheus.test.svc.cluster.local</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">9090</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">query</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sum(vllm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">num_requests_waiting</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">namespace="autoscale</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> service="vllm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prefill"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">decode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> decode_gpu_cache_usage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">targetValue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.75"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metricSources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">decode_gpu_cache_usage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">prometheus</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">serverURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prometheus</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stack</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prometheus.test.svc.cluster.local</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">9090</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">query</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sum(vllm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">gpu_cache_usage_perc</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">namespace="autoscale</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> service="vllm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">decode"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ratioConstraint</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">numeratorRole</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prefill</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">denominatorRole</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> decode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minRatio</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.25"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">maxRatio</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1"</span><br></span></code></pre></div></div>
<p>Related changes:</p>
<ul>
<li class="">Proposal:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1172" target="_blank" rel="noopener noreferrer" class="">Proposal of merge <code>autoscalingPolicybingding</code> into <code>autoscalingPolicy</code> #1172</a></li>
</ul>
</li>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1203" target="_blank" rel="noopener noreferrer" class="">merge autoscalingpolicybinding to autoscalingpolicy #1203</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1258" target="_blank" rel="noopener noreferrer" class="">Implementation of PD disaggregation auto-scaler #1258</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="session-boost-for-multi-turn-conversation-workloads">Session Boost for Multi-Turn Conversation Workloads<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#session-boost-for-multi-turn-conversation-workloads" class="hash-link" aria-label="Session Boost for Multi-Turn Conversation Workloads的直接链接" title="Session Boost for Multi-Turn Conversation Workloads的直接链接" translate="no">​</a></h3>
<p>Kthena v1.0.0 adds session boost support to improve multi-round chat, agentic workflows, and RAG chains where each request depends on previous responses. In these workloads, follow-up requests often reuse a large shared prefix. If they wait behind unrelated traffic for too long, corresponding backend KV cache entries may be evicted and time-to-first-token can increase.</p>
<p>Session boost lets the router track recently completed sessions and prioritize follow-up requests from those sessions in the waiting queue. The implementation keeps this behavior separate from user-fairness scheduling and uses dedicated session-boost configuration, including session header selection, bounded recent-session tracking, inflight admission limits, and an optional grace period for advanced cache-hit optimization.</p>
<p>The feature is designed to improve cache reuse opportunities under concurrent multi-turn traffic without claiming pod affinity by itself. For the strongest KV cache benefit, operators should also ensure that session-aware or cache-aware routing can place follow-up requests on backends that still hold the warm cache.</p>
<p>Example Helm configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">networking</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">kthenaRouter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sessionBoost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">header</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> X</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Session</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">maxSessions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4096</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">inflightPerPod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">gracePeriod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0s</span><br></span></code></pre></div></div>
<p>Related changes:</p>
<ul>
<li class="">Issue: <a href="https://github.com/volcano-sh/kthena/issues/1190" target="_blank" rel="noopener noreferrer" class="">Improve multi-round conversation case #1190</a></li>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1183" target="_blank" rel="noopener noreferrer" class="">session boost queue to optimize multi conversation scenario #1183</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/YaoZengzeng" target="_blank" rel="noopener noreferrer" class="">@YaoZengzeng</a>, <a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>, <a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>, <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smarter-router-scheduling-and-cache-aware-observability">Smarter Router Scheduling and Cache-Aware Observability<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#smarter-router-scheduling-and-cache-aware-observability" class="hash-link" aria-label="Smarter Router Scheduling and Cache-Aware Observability的直接链接" title="Smarter Router Scheduling and Cache-Aware Observability的直接链接" translate="no">​</a></h3>
<p>The router now has better load signals for scheduling decisions. Kthena tracks per-pod in-flight requests and can synchronize these counters across router replicas through Redis, allowing the <code>least-request</code> plugin to make decisions based on real-time load instead of only local router state.</p>
<p>Cache-aware scheduling is also much more observable. The <code>prefix-cache</code> and <code>kvcache-aware</code> score plugins now export Prometheus metrics on the router's existing <code>/metrics</code> endpoint, replacing klog-only visibility with queryable, model-labelled time series for load testing and production tuning.</p>
<p>For cache effectiveness, Kthena records match-ratio histograms instead of simple hit/miss counters. <code>kthena_router_prefix_cache_match_ratio</code> and <code>kthena_router_kvcache_aware_match_ratio</code> report the fraction of a prompt's blocks already available on the best-matching candidate pod, with <code>0</code> representing a real miss. This makes hit rate derivable from the <code>le="0.0"</code> bucket while also showing how much of the prefix was reused.</p>
<p>Related changes:</p>
<ul>
<li class="">Proposal:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/blob/main/docs/proposal/cache-observability.md" target="_blank" rel="noopener noreferrer" class="">Observability for prefix-cache and kvcache-aware Score Plugins</a></li>
</ul>
</li>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/962" target="_blank" rel="noopener noreferrer" class="">feat(router): add per-pod in-flight request tracking with Redis sync #962</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/997" target="_blank" rel="noopener noreferrer" class="">Add SGLang tokenizer support for KV-cache-aware scheduling #997</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1194" target="_blank" rel="noopener noreferrer" class="">router: add observability metrics for prefix-cache and kvcache-aware score plugins #1194</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1151" target="_blank" rel="noopener noreferrer" class="">feat(router): make pod metrics update interval configurable #1151</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1123" target="_blank" rel="noopener noreferrer" class="">perf(router): cache parsed prompt to avoid redundant ParsePrompt call #1123</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1255" target="_blank" rel="noopener noreferrer" class="">fix: parallelize pod metrics scraping loop with bounded concurrency #1255</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>, <a href="https://github.com/blenbot" target="_blank" rel="noopener noreferrer" class="">@blenbot</a>, <a href="https://github.com/kube-gopher" target="_blank" rel="noopener noreferrer" class="">@kube-gopher</a>, <a href="https://github.com/rajnish-jais" target="_blank" rel="noopener noreferrer" class="">@rajnish-jais</a>, <a href="https://github.com/nabrahma" target="_blank" rel="noopener noreferrer" class="">@nabrahma</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-rollingupdate-availability-control">Role RollingUpdate Availability Control<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#role-rollingupdate-availability-control" class="hash-link" aria-label="Role RollingUpdate Availability Control的直接链接" title="Role RollingUpdate Availability Control的直接链接" translate="no">​</a></h3>
<p>Kthena v0.4.0 introduced <code>RoleRollingUpdate</code>, but role updates could still delete all outdated Role replicas in a ServingGroup at once. When <code>spec.replicas</code> was <code>1</code>, this could make the service temporarily unavailable during a role-level rollout.</p>
<p>Kthena v1.0.0 adds per-Role <code>maxUnavailable</code> support for <code>RoleRollingUpdate</code>. Operators can now control the step size of each Role update independently, using either an absolute number or a percentage. This gives role-level rolling updates the same availability-oriented control that ServingGroup-level updates already had, while keeping Role-level and ServingGroup-level rollout budgets separate.</p>
<p>Example Role-level rollout configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rolloutStrategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RoleRollingUpdate</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prefill</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">maxUnavailable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># entryTemplate and workerTemplate omitted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> decode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">maxUnavailable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 25%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># entryTemplate and workerTemplate omitted</span><br></span></code></pre></div></div>
<p>Related changes:</p>
<ul>
<li class="">Issue: <a href="https://github.com/volcano-sh/kthena/issues/1188" target="_blank" rel="noopener noreferrer" class="">Control the number of unavailable Role replicas in RoleRollingUpdate #1188</a></li>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1239" target="_blank" rel="noopener noreferrer" class="">Role rollingupdate support maxUnavailable settings #1239</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>, <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-api-and-httproute-correctness">Gateway API and HTTPRoute Correctness<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#gateway-api-and-httproute-correctness" class="hash-link" aria-label="Gateway API and HTTPRoute Correctness的直接链接" title="Gateway API and HTTPRoute Correctness的直接链接" translate="no">​</a></h3>
<p>Kthena-router now handles Gateway API traffic with stronger correctness guarantees. The router honors <code>HTTPRoute.spec.hostnames</code>, keeps the matched HTTPRoute rule associated with backend selection and URL rewrite filters, and chooses more specific path rules within a route. This avoids accidentally routing a request through a backend or filter from a different rule than the one that matched the request.</p>
<p>This release also fixes Gateway API <code>PathPrefix</code> matching semantics and makes the router respect Gateway listener <code>allowedRoutes</code> before accepting HTTPRoutes.</p>
<p>Related changes:</p>
<ul>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1174" target="_blank" rel="noopener noreferrer" class="">feat: honor HTTPRoute hostnames and matched rule selection #1174</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1119" target="_blank" rel="noopener noreferrer" class="">Fix HTTPRoute PathPrefix matching #1119</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/1263" target="_blank" rel="noopener noreferrer" class="">fix(router): respect Gateway allowedRoutes #1263</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/zhy76" target="_blank" rel="noopener noreferrer" class="">@zhy76</a>, <a href="https://github.com/Monti-27" target="_blank" rel="noopener noreferrer" class="">@Monti-27</a>, <a href="https://github.com/avinxshKD" target="_blank" rel="noopener noreferrer" class="">@avinxshKD</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli-and-openai-compatible-api-improvements">CLI and OpenAI-Compatible API Improvements<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#cli-and-openai-compatible-api-improvements" class="hash-link" aria-label="CLI and OpenAI-Compatible API Improvements的直接链接" title="CLI and OpenAI-Compatible API Improvements的直接链接" translate="no">​</a></h3>
<p>The <code>kthena</code> CLI now surfaces more useful status information and supports more resource types:</p>
<ul>
<li class=""><code>kthena get model-servings</code> now shows <code>READY</code> and <code>STATUS</code> columns.</li>
<li class=""><code>kthena get model-boosters</code> now shows a <code>STATUS</code> column.</li>
<li class=""><code>kthena get model-routes</code> and <code>kthena get model-servers</code> are now supported.</li>
<li class=""><code>kthena describe model-route</code> and <code>kthena describe model-server</code> are now supported.</li>
</ul>
<p>The router also adds an OpenAI-compatible <code>GET /v1/models</code> endpoint, returning available model names in the standard list response shape.</p>
<p>Related changes:</p>
<ul>
<li class="">PRs:<!-- -->
<ul>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/978" target="_blank" rel="noopener noreferrer" class="">feat: add STATUS and READY columns to kthena get output #978</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/981" target="_blank" rel="noopener noreferrer" class="">feat: add CLI support for ModelRoute and ModelServer resources #981</a></li>
<li class=""><a href="https://github.com/volcano-sh/kthena/pull/996" target="_blank" rel="noopener noreferrer" class="">feat: support /v1/models endpoint #996</a></li>
</ul>
</li>
<li class="">Contributors: <a href="https://github.com/anirudh240" target="_blank" rel="noopener noreferrer" class="">@anirudh240</a>, <a href="https://github.com/madmecodes" target="_blank" rel="noopener noreferrer" class="">@madmecodes</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-enhancements">Additional Enhancements<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#additional-enhancements" class="hash-link" aria-label="Additional Enhancements的直接链接" title="Additional Enhancements的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Added KEDA/HPA compatibility for <code>ModelServing</code> by setting the scale subresource label selector. <a href="https://github.com/volcano-sh/kthena/pull/839" target="_blank" rel="noopener noreferrer" class="">#839</a></li>
<li class="">Added a controller-manager debug port for dumping cached ServingGroup and Role configuration. <a href="https://github.com/volcano-sh/kthena/pull/900" target="_blank" rel="noopener noreferrer" class="">#900</a></li>
<li class="">Added SGLang Dynamo mocker coverage and SGLang inference simulator integration. <a href="https://github.com/volcano-sh/kthena/pull/920" target="_blank" rel="noopener noreferrer" class="">#920</a>, <a href="https://github.com/volcano-sh/kthena/pull/1231" target="_blank" rel="noopener noreferrer" class="">#1231</a></li>
<li class="">Added router <code>pprof</code> endpoint support. <a href="https://github.com/volcano-sh/kthena/pull/1057" target="_blank" rel="noopener noreferrer" class="">#1057</a></li>
<li class="">Added <code>debugPort</code> Helm chart support for controller-manager. <a href="https://github.com/volcano-sh/kthena/pull/1032" target="_blank" rel="noopener noreferrer" class="">#1032</a></li>
<li class="">Improved ModelBooster GPU and offline environment support. <a href="https://github.com/volcano-sh/kthena/pull/972" target="_blank" rel="noopener noreferrer" class="">#972</a>, <a href="https://github.com/volcano-sh/kthena/pull/1141" target="_blank" rel="noopener noreferrer" class="">#1141</a>, <a href="https://github.com/volcano-sh/kthena/pull/1146" target="_blank" rel="noopener noreferrer" class="">#1146</a>, <a href="https://github.com/volcano-sh/kthena/pull/945" target="_blank" rel="noopener noreferrer" class="">#945</a></li>
<li class="">Added GPU usage plugin E2E coverage. <a href="https://github.com/volcano-sh/kthena/pull/1199" target="_blank" rel="noopener noreferrer" class="">#1199</a></li>
<li class="">Refreshed the quick-start documentation and recommends starting with ModelServing. <a href="https://github.com/volcano-sh/kthena/pull/1260" target="_blank" rel="noopener noreferrer" class="">#1260</a></li>
<li class="">Added DeepSeek-v4 model-serving examples. <a href="https://github.com/volcano-sh/kthena/pull/936" target="_blank" rel="noopener noreferrer" class="">#936</a>, <a href="https://github.com/volcano-sh/kthena/pull/937" target="_blank" rel="noopener noreferrer" class="">#937</a></li>
<li class="">Added KV-cache-aware scheduler plugin documentation. <a href="https://github.com/volcano-sh/kthena/pull/910" target="_blank" rel="noopener noreferrer" class="">#910</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stability-and-correctness-highlights">Stability and Correctness Highlights<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#stability-and-correctness-highlights" class="hash-link" aria-label="Stability and Correctness Highlights的直接链接" title="Stability and Correctness Highlights的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Router request handling correctness:</strong> Fixes in JWT auth, empty request validation, streaming content-type parsing, retry behavior, mid-stream error propagation, IPv6 backend URLs, and HTTPRoute matching make the router more predictable under production traffic.</li>
<li class=""><strong>Gateway API reconciliation correctness:</strong> The router now respects HTTPRoute hostnames, matched rule selection, path-prefix semantics, and Gateway listener namespace admission rules, reducing mismatches between Gateway API configuration and runtime routing behavior.</li>
<li class=""><strong>Autoscaler and metrics reliability:</strong> Autoscaler metric collection now uses the target-referenced namespace first, checks HTTP response status before parsing metrics, stabilizes scale-down with the maximum sliding window, and supports bounded concurrent pod metric scraping.</li>
<li class=""><strong>Controller concurrency safety:</strong> ModelBooster and ModelServing controller fixes address data races, concurrent map writes, stale pod bindings, duplicate role deletion, and unsafe PodInfo access.</li>
<li class=""><strong>Webhook and deployment stability:</strong> Webhook certificate generation, cert-manager CA injection, webhook names, validator messages, and quick-start example defaults were corrected to reduce installation and onboarding failures.</li>
<li class=""><strong>Test and CI hardening:</strong> Additional unit and E2E coverage was added for controllers, autoscaler, router debug modules, ModelBooster lifecycle operations, SGLang PD routing, and status-aware scale-down behavior.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#bug-fixes" class="hash-link" aria-label="Bug Fixes的直接链接" title="Bug Fixes的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="router">Router<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#router" class="hash-link" aria-label="Router的直接链接" title="Router的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Fixed router auth panic when the JWKS cache is empty. <a href="https://github.com/volcano-sh/kthena/pull/1219" target="_blank" rel="noopener noreferrer" class="">#1219</a></li>
<li class="">Required the Bearer scheme for JWT auth. <a href="https://github.com/volcano-sh/kthena/pull/1035" target="_blank" rel="noopener noreferrer" class="">#1035</a></li>
<li class="">Rejected empty router model requests. <a href="https://github.com/volcano-sh/kthena/pull/1036" target="_blank" rel="noopener noreferrer" class="">#1036</a></li>
<li class="">Corrected streaming content-type detection when parameters are present. <a href="https://github.com/volcano-sh/kthena/pull/1145" target="_blank" rel="noopener noreferrer" class="">#1145</a></li>
<li class="">Fixed retries sending empty bodies to fallback pods in the aggregated proxy path. <a href="https://github.com/volcano-sh/kthena/pull/1031" target="_blank" rel="noopener noreferrer" class="">#1031</a></li>
<li class="">Returned mid-stream and copy errors from proxy requests. <a href="https://github.com/volcano-sh/kthena/pull/1049" target="_blank" rel="noopener noreferrer" class="">#1049</a></li>
<li class="">Added IPv6 pod backend URL support. <a href="https://github.com/volcano-sh/kthena/pull/1071" target="_blank" rel="noopener noreferrer" class="">#1071</a></li>
<li class="">Fixed stale KV cache ownership. <a href="https://github.com/volcano-sh/kthena/pull/1224" target="_blank" rel="noopener noreferrer" class="">#1224</a></li>
<li class="">Removed an unnecessary goroutine in the ModelPrefixStore LRU eviction callback. <a href="https://github.com/volcano-sh/kthena/pull/1243" target="_blank" rel="noopener noreferrer" class="">#1243</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="autoscaler-and-metrics">Autoscaler and Metrics<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#autoscaler-and-metrics" class="hash-link" aria-label="Autoscaler and Metrics的直接链接" title="Autoscaler and Metrics的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Used the target-referenced namespace first in autoscaler metric collection. <a href="https://github.com/volcano-sh/kthena/pull/1068" target="_blank" rel="noopener noreferrer" class="">#1068</a></li>
<li class="">Checked HTTP status before parsing metrics responses. <a href="https://github.com/volcano-sh/kthena/pull/1142" target="_blank" rel="noopener noreferrer" class="">#1142</a></li>
<li class="">Used the maximum sliding window for autoscaler scale-down stabilization. <a href="https://github.com/volcano-sh/kthena/pull/946" target="_blank" rel="noopener noreferrer" class="">#946</a></li>
<li class="">Used gauge values for SGLang metrics. <a href="https://github.com/volcano-sh/kthena/pull/976" target="_blank" rel="noopener noreferrer" class="">#976</a></li>
<li class="">Treated zero TTFT/TPOT as uninitialized in least-latency scoring. <a href="https://github.com/volcano-sh/kthena/pull/1040" target="_blank" rel="noopener noreferrer" class="">#1040</a></li>
<li class="">Used ModelServer's configured workload port for metrics instead of hardcoded defaults. <a href="https://github.com/volcano-sh/kthena/pull/1205" target="_blank" rel="noopener noreferrer" class="">#1205</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modelserving-and-modelbooster-controllers">ModelServing and ModelBooster Controllers<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#modelserving-and-modelbooster-controllers" class="hash-link" aria-label="ModelServing and ModelBooster Controllers的直接链接" title="ModelServing and ModelBooster Controllers的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Used controller owner references for ModelBooster children. <a href="https://github.com/volcano-sh/kthena/pull/1054" target="_blank" rel="noopener noreferrer" class="">#1054</a></li>
<li class="">Fixed a ModelBoosterController data race and concurrent-map-write panic. <a href="https://github.com/volcano-sh/kthena/pull/1085" target="_blank" rel="noopener noreferrer" class="">#1085</a></li>
<li class="">Fixed stale ModelServer pod bindings. <a href="https://github.com/volcano-sh/kthena/pull/1126" target="_blank" rel="noopener noreferrer" class="">#1126</a></li>
<li class="">Fixed concurrent grace-map access in error-pod handling. <a href="https://github.com/volcano-sh/kthena/pull/1157" target="_blank" rel="noopener noreferrer" class="">#1157</a></li>
<li class="">Guarded PodInfo access against data races. <a href="https://github.com/volcano-sh/kthena/pull/1167" target="_blank" rel="noopener noreferrer" class="">#1167</a></li>
<li class="">Avoided duplicate role deletion while a role is already deleting. <a href="https://github.com/volcano-sh/kthena/pull/1269" target="_blank" rel="noopener noreferrer" class="">#1269</a></li>
<li class="">Fixed ModelServing webhook panic on missing replicas. <a href="https://github.com/volcano-sh/kthena/pull/1055" target="_blank" rel="noopener noreferrer" class="">#1055</a></li>
<li class="">Synced PodGroup NetworkTopology when ModelServing topology changes. <a href="https://github.com/volcano-sh/kthena/pull/1088" target="_blank" rel="noopener noreferrer" class="">#1088</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectors-and-pd-paths">Connectors and PD Paths<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#connectors-and-pd-paths" class="hash-link" aria-label="Connectors and PD Paths的直接链接" title="Connectors and PD Paths的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Rebuilt NIXL prefill/decode request bodies on every proxy call. <a href="https://github.com/volcano-sh/kthena/pull/947" target="_blank" rel="noopener noreferrer" class="">#947</a></li>
<li class="">Rebuilt SGLang prefill/decode request bodies on every proxy call. <a href="https://github.com/volcano-sh/kthena/pull/984" target="_blank" rel="noopener noreferrer" class="">#984</a></li>
<li class="">Added streaming error handling improvements. <a href="https://github.com/volcano-sh/kthena/pull/1236" target="_blank" rel="noopener noreferrer" class="">#1236</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-webhooks-and-examples">Helm, Webhooks, and Examples<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#helm-webhooks-and-examples" class="hash-link" aria-label="Helm, Webhooks, and Examples的直接链接" title="Helm, Webhooks, and Examples的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Fixed cert-manager CA injection annotation for controller-manager webhooks. <a href="https://github.com/volcano-sh/kthena/pull/1018" target="_blank" rel="noopener noreferrer" class="">#1018</a></li>
<li class="">Used random serial numbers for webhook certificates. <a href="https://github.com/volcano-sh/kthena/pull/1160" target="_blank" rel="noopener noreferrer" class="">#1160</a></li>
<li class="">Corrected webhook names and validator messages. <a href="https://github.com/volcano-sh/kthena/pull/1152" target="_blank" rel="noopener noreferrer" class="">#1152</a>, <a href="https://github.com/volcano-sh/kthena/pull/1159" target="_blank" rel="noopener noreferrer" class="">#1159</a></li>
<li class="">Fixed quick-start ModelBooster <code>cacheURI</code> and Hugging Face endpoint examples. <a href="https://github.com/volcano-sh/kthena/pull/1246" target="_blank" rel="noopener noreferrer" class="">#1246</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-changes-and-upgrade-notes">API Changes and Upgrade Notes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#api-changes-and-upgrade-notes" class="hash-link" aria-label="API Changes and Upgrade Notes的直接链接" title="API Changes and Upgrade Notes的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-change-autoscalingpolicybinding-removed">Breaking Change: AutoscalingPolicyBinding Removed<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#breaking-change-autoscalingpolicybinding-removed" class="hash-link" aria-label="Breaking Change: AutoscalingPolicyBinding Removed的直接链接" title="Breaking Change: AutoscalingPolicyBinding Removed的直接链接" translate="no">​</a></h3>
<p><code>AutoscalingPolicyBinding</code> has been removed from CRDs, generated clients, informers, listers, apply configurations, and Helm chart embedded CRDs.</p>
<p>Users should migrate autoscaling target configuration into one of the following <code>AutoscalingPolicy.spec</code> fields:</p>
<ul>
<li class=""><code>homogeneousTarget</code></li>
<li class=""><code>heterogeneousTarget</code></li>
<li class=""><code>disaggregatedTarget</code></li>
</ul>
<p>For further details, please refer to the <a href="https://kthena.volcano.sh/docs/next/reference/crd/workload.serving.volcano.sh" target="_blank" rel="noopener noreferrer" class="">CRD documentation</a> and the <a href="https://github.com/volcano-sh/kthena/pull/1172" target="_blank" rel="noopener noreferrer" class="">Proposal</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-modelbooster-and-router-configuration">New ModelBooster and Router Configuration<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#new-modelbooster-and-router-configuration" class="hash-link" aria-label="New ModelBooster and Router Configuration的直接链接" title="New ModelBooster and Router Configuration的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><code>ModelBackend.runtimeClassName</code> configures the Kubernetes RuntimeClass used by generated backend pods.</li>
<li class=""><code>ModelWorker.tolerations</code> configures worker pod tolerations.</li>
<li class=""><code>KTHENA_SKIP_ENGINE_DEPENDENCY_INSTALL=true</code> skips startup-time connector dependency installation for offline or prebuilt engine images.</li>
<li class=""><code>METRICS_SCRAPE_INTERVAL</code> controls the router pod metrics scrape interval.</li>
<li class="">Controller-manager Helm values now support <code>debugPort</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-environment">Build Environment<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#build-environment" class="hash-link" aria-label="Build Environment的直接链接" title="Build Environment的直接链接" translate="no">​</a></h3>
<p>The project toolchain, Dockerfiles, CI workflows, and development documentation have been upgraded to Go <code>1.26.4</code>. See <a href="https://github.com/volcano-sh/kthena/pull/1244" target="_blank" rel="noopener noreferrer" class="">feat: comprehensive upgrade to Go 1.26.4 #1244</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tests-docs-and-infrastructure">Tests, Docs, and Infrastructure<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#tests-docs-and-infrastructure" class="hash-link" aria-label="Tests, Docs, and Infrastructure的直接链接" title="Tests, Docs, and Infrastructure的直接链接" translate="no">​</a></h2>
<p>Kthena v1.0.0 includes broad test, documentation, and infrastructure improvements:</p>
<ul>
<li class="">Added unit tests for ModelRouteController and GatewayController. <a href="https://github.com/volcano-sh/kthena/pull/992" target="_blank" rel="noopener noreferrer" class="">#992</a></li>
<li class="">Added E2E coverage for updating and deleting ModelBooster. <a href="https://github.com/volcano-sh/kthena/pull/1000" target="_blank" rel="noopener noreferrer" class="">#1000</a></li>
<li class="">Added E2E coverage for status-aware scale-down behavior. <a href="https://github.com/volcano-sh/kthena/pull/982" target="_blank" rel="noopener noreferrer" class="">#982</a></li>
<li class="">Added SGLang PD router E2E coverage. <a href="https://github.com/volcano-sh/kthena/pull/994" target="_blank" rel="noopener noreferrer" class="">#994</a></li>
<li class="">Added autoscaler, config, and router debug unit tests. <a href="https://github.com/volcano-sh/kthena/pull/903" target="_blank" rel="noopener noreferrer" class="">#903</a></li>
<li class="">Fixed flaky controller and router tests. <a href="https://github.com/volcano-sh/kthena/pull/950" target="_blank" rel="noopener noreferrer" class="">#950</a>, <a href="https://github.com/volcano-sh/kthena/pull/1102" target="_blank" rel="noopener noreferrer" class="">#1102</a>, <a href="https://github.com/volcano-sh/kthena/pull/1162" target="_blank" rel="noopener noreferrer" class="">#1162</a></li>
<li class="">Used the PodGroup informer cache when listing existing PodGroups. <a href="https://github.com/volcano-sh/kthena/pull/1081" target="_blank" rel="noopener noreferrer" class="">#1081</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-instructions">Upgrade Instructions<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#upgrade-instructions" class="hash-link" aria-label="Upgrade Instructions的直接链接" title="Upgrade Instructions的直接链接" translate="no">​</a></h2>
<p>To upgrade to Kthena v1.0.0 after the release is published:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-review-breaking-api-changes">1. Review Breaking API Changes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#1-review-breaking-api-changes" class="hash-link" aria-label="1. Review Breaking API Changes的直接链接" title="1. Review Breaking API Changes的直接链接" translate="no">​</a></h3>
<p>Before upgrading, review any existing autoscaling resources in your cluster. <code>AutoscalingPolicyBinding</code> is removed in v1.0.0, so clusters using the old two-resource autoscaling model must migrate to the new single-resource <code>AutoscalingPolicy</code> model.</p>
<p>Check whether your cluster still has old binding resources:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get autoscalingpolicybindings.workload.serving.volcano.sh --all-namespaces</span><br></span></code></pre></div></div>
<p>If any resources are returned, migrate their target and metric-source configuration into one of the following <code>AutoscalingPolicy.spec</code> fields before or during the upgrade:</p>
<ul>
<li class=""><code>homogeneousTarget</code></li>
<li class=""><code>heterogeneousTarget</code></li>
<li class=""><code>disaggregatedTarget</code></li>
</ul>
<p>For prefill/decode disaggregated workloads, use <code>disaggregatedTarget.roles</code> and, when needed, <code>disaggregatedTarget.ratioConstraint</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-back-up-existing-kthena-resources">2. Back Up Existing Kthena Resources<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#2-back-up-existing-kthena-resources" class="hash-link" aria-label="2. Back Up Existing Kthena Resources的直接链接" title="2. Back Up Existing Kthena Resources的直接链接" translate="no">​</a></h3>
<p>Back up Kthena custom resources before applying the new CRDs and controllers:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelservings.workload.serving.volcano.sh --all-namespaces -o yaml &gt; modelservings-backup.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelboosters.workload.serving.volcano.sh --all-namespaces -o yaml &gt; modelboosters-backup.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get autoscalingpolicies.workload.serving.volcano.sh --all-namespaces -o yaml &gt; autoscalingpolicies-backup.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelroutes.networking.serving.volcano.sh --all-namespaces -o yaml &gt; modelroutes-backup.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelservers.networking.serving.volcano.sh --all-namespaces -o yaml &gt; modelservers-backup.yaml</span><br></span></code></pre></div></div>
<p>If you still have <code>AutoscalingPolicyBinding</code> resources, back them up before removing or migrating them:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get autoscalingpolicybindings.workload.serving.volcano.sh --all-namespaces -o yaml &gt; autoscalingpolicybindings-backup.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-upgrade-kthena">3. Upgrade Kthena<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#3-upgrade-kthena" class="hash-link" aria-label="3. Upgrade Kthena的直接链接" title="3. Upgrade Kthena的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-helm">Using Helm<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#using-helm" class="hash-link" aria-label="Using Helm的直接链接" title="Using Helm的直接链接" translate="no">​</a></h4>
<p>For OCI-based Helm installation from GHCR:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">helm upgrade kthena oci://ghcr.io/volcano-sh/charts/kthena \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --version v1.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --namespace kthena-system</span><br></span></code></pre></div></div>
<p>If this is a fresh installation instead of an upgrade:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">helm install kthena oci://ghcr.io/volcano-sh/charts/kthena \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --version v1.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --namespace kthena-system \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --create-namespace</span><br></span></code></pre></div></div>
<p>If you install from the release chart package:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -L -o kthena.tgz https://github.com/volcano-sh/kthena/releases/download/v1.0.0/kthena.tgz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">helm upgrade kthena kthena.tgz --namespace kthena-system</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-verify-the-upgrade">4. Verify the Upgrade<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#4-verify-the-upgrade" class="hash-link" aria-label="4. Verify the Upgrade的直接链接" title="4. Verify the Upgrade的直接链接" translate="no">​</a></h3>
<p>Check that all Kthena components are running:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods -n kthena-system</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get svc -n kthena-system</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get crd | grep serving.volcano.sh</span><br></span></code></pre></div></div>
<p>Verify workload, networking, and autoscaling resources:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelservings.workload.serving.volcano.sh --all-namespaces</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelboosters.workload.serving.volcano.sh --all-namespaces</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get autoscalingpolicies.workload.serving.volcano.sh --all-namespaces</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelroutes.networking.serving.volcano.sh --all-namespaces</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get modelservers.networking.serving.volcano.sh --all-namespaces</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#upgrade-notes" class="hash-link" aria-label="Upgrade Notes的直接链接" title="Upgrade Notes的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><code>AutoscalingPolicyBinding</code> is removed. Migrate to <code>AutoscalingPolicy.spec.homogeneousTarget</code>, <code>spec.heterogeneousTarget</code>, or <code>spec.disaggregatedTarget</code> before relying on v1.0.0 autoscaling behavior.</li>
<li class=""><code>disaggregatedTarget</code> supports role-level autoscaling and optional role ratio constraints. Fixed roles can use <code>minReplicas == maxReplicas</code>.</li>
<li class="">Existing ModelBooster behavior remains backward compatible by default. Set <code>KTHENA_SKIP_ENGINE_DEPENDENCY_INSTALL=true</code> only when using offline or prebuilt engine images that already include connector dependencies.</li>
<li class="">GPU clusters that require custom runtimes can set <code>ModelBackend.runtimeClassName</code>; tainted GPU nodes can be targeted with <code>ModelWorker.tolerations</code>.</li>
<li class="">Router pod metrics scraping can be tuned with <code>METRICS_SCRAPE_INTERVAL</code>. Keep the default unless you need fresher scheduling signals or lower scrape overhead.</li>
<li class="">Development and build prerequisites now use Go <code>1.26.4</code>; this affects contributors and image builders, not normal Helm or manifest-based runtime upgrades.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you-contributors">Thank You, Contributors<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v1.0.0#thank-you-contributors" class="hash-link" aria-label="Thank You, Contributors的直接链接" title="Thank You, Contributors的直接链接" translate="no">​</a></h2>
<p>Thank you to everyone who contributed to Kthena v1.0.0 across controllers, router, autoscaler, CLI, Helm charts, examples, docs, CI, generated clients, and tests.</p>
<p>Special thanks to contributors including <a href="https://github.com/Abirdcfly" target="_blank" rel="noopener noreferrer" class="">@Abirdcfly</a>, <a href="https://github.com/Alivestars04" target="_blank" rel="noopener noreferrer" class="">@Alivestars04</a>, <a href="https://github.com/anirudh240" target="_blank" rel="noopener noreferrer" class="">@anirudh240</a>, <a href="https://github.com/avinxshKD" target="_blank" rel="noopener noreferrer" class="">@avinxshKD</a>, <a href="https://github.com/blenbot" target="_blank" rel="noopener noreferrer" class="">@blenbot</a>, <a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>, <a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>, <a href="https://github.com/JagjeevanAK" target="_blank" rel="noopener noreferrer" class="">@JagjeevanAK</a>, <a href="https://github.com/katara-Jayprakash" target="_blank" rel="noopener noreferrer" class="">@katara-Jayprakash</a>, <a href="https://github.com/kube-gopher" target="_blank" rel="noopener noreferrer" class="">@kube-gopher</a>, <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>, <a href="https://github.com/madmecodes" target="_blank" rel="noopener noreferrer" class="">@madmecodes</a>, <a href="https://github.com/nabrahma" target="_blank" rel="noopener noreferrer" class="">@nabrahma</a>, <a href="https://github.com/nXtCyberNet" target="_blank" rel="noopener noreferrer" class="">@nXtCyberNet</a>, <a href="https://github.com/rajnish-jais" target="_blank" rel="noopener noreferrer" class="">@rajnish-jais</a>, <a href="https://github.com/Sanchit2662" target="_blank" rel="noopener noreferrer" class="">@Sanchit2662</a>, <a href="https://github.com/verma-garv" target="_blank" rel="noopener noreferrer" class="">@verma-garv</a>, <a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>, <a href="https://github.com/xrwang8" target="_blank" rel="noopener noreferrer" class="">@xrwang8</a>, <a href="https://github.com/zhy76" target="_blank" rel="noopener noreferrer" class="">@zhy76</a>, and <a href="https://github.com/YaoZengzeng" target="_blank" rel="noopener noreferrer" class="">@YaoZengzeng</a>.</p>
<p>We warmly invite developers, operators, and AI infrastructure teams to try Kthena v1.0.0 and help shape the next generation of cloud native LLM serving.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Kthena v0.4.0 Released: More Robust and Feature-Rich Version]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0</guid>
            <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Thanks to the incredible dedication and collective efforts of our contributors over the past two months, Kthena’s stability has reached new heights. We want to express our deepest gratitude to everyone who contributed to this milestone. Today, we are thrilled to announce the official release of Kthena v0.4.0—our most robust and feature-rich version yet!]]></description>
            <content:encoded><![CDATA[<p>Thanks to the incredible dedication and collective efforts of our contributors over the past two months, Kthena’s stability has reached new heights. We want to express our deepest gratitude to everyone who contributed to this milestone. Today, we are thrilled to announce the official release of <strong>Kthena v0.4.0</strong>—our most robust and feature-rich version yet!</p>
<p>Beyond rock-solid stability, Kthena v0.4.0 introduces a wave of exciting new features designed to streamline your LLM workloads and empower your AI infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-observability">Improved Observability<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#improved-observability" class="hash-link" aria-label="Improved Observability的直接链接" title="Improved Observability的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-status-visibility">Role Status Visibility<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#role-status-visibility" class="hash-link" aria-label="Role Status Visibility的直接链接" title="Role Status Visibility的直接链接" translate="no">​</a></h3>
<p>To minimize kube-apiserver load, Kthena's <code>ModelServing</code> utilizes a local store to cache the status of <code>ServingGroup</code>s and <code>Role</code>s. While highly efficient, we realized this limited our observability during debugging.</p>
<p>In v0.4.0, we've broken the black box. We now <a href="https://github.com/volcano-sh/kthena/pull/676" target="_blank" rel="noopener noreferrer" class="">expose role status directly via Kubernetes Events</a>, dramatically enhancing the observability of <code>ModelServing</code>. Looking ahead, we plan to directly embed this crucial Role information into the <code>ModelServing</code> Status, giving you complete, transparent control over your deployments.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehensive-access-logging">Comprehensive Access Logging<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#comprehensive-access-logging" class="hash-link" aria-label="Comprehensive Access Logging的直接链接" title="Comprehensive Access Logging的直接链接" translate="no">​</a></h3>
<p>Router observability is now easier than ever. The Router now generates a detailed access log, capturing rich <a href="https://github.com/volcano-sh/kthena/pull/621" target="_blank" rel="noopener noreferrer" class="">routing metadata</a> for every single request. Here is an example of a Router log:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[2026-04-16T07:33:08.435627146Z] "POST /v1/chat/completions HTTP/1.1" 200 model_name=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B model_router=deepseek-r1-1-1.5b model_server=deepseek-r1 selected_pod=deepseek-r1-1-1.5b-6989c66877-p6jvv request_id=ad683d1b-6011-4b0f-b9b5-cbb18d43c57b gateway=dev/default http_route=kthena-e2e-gie-8eoas/llm-route inference_pool=kthena-e2e-gie-8eoas/deepseek-r1-1-1.5b tokens=10/38 timings=3ms(0+2+0)</span><br></span></code></pre></div></div>
<p>Compared to previous versions, we have introduced the <code>gateway</code>, <code>http_route</code>, and <code>inference_pool</code> fields to provide deeper visibility into Gateway and Gateway Inference Extension traffic.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-faster-smarter-router">A Faster, Smarter Router<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#a-faster-smarter-router" class="hash-link" aria-label="A Faster, Smarter Router的直接链接" title="A Faster, Smarter Router的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deterministic--efficient-model-selection">Deterministic &amp; Efficient Model Selection<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#deterministic--efficient-model-selection" class="hash-link" aria-label="Deterministic &amp; Efficient Model Selection的直接链接" title="Deterministic &amp; Efficient Model Selection的直接链接" translate="no">​</a></h3>
<p>Previously, mapping multiple <code>ModelRoute</code> resources to a single model could trigger route conflicts—leading to ambiguous rule matching and inconsistent target selection. Because Kubernetes' built-in CRD validation cannot enforce global cross-object uniqueness, we tackled this gracefully at the routing layer.</p>
<p>Kthena v0.4.0 introduces a robust <a href="https://github.com/volcano-sh/kthena/pull/779" target="_blank" rel="noopener noreferrer" class="">conflict-resolution mechanism</a>. When duplicate <code>ModelRoute</code>s exist, the router deterministically prioritizes the oldest (typically prebuilt) route, treating newer duplicates as lower priority. Predictable, rock-solid routing every time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configurable-prefix-caching">Configurable Prefix-Caching<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#configurable-prefix-caching" class="hash-link" aria-label="Configurable Prefix-Caching的直接链接" title="Configurable Prefix-Caching的直接链接" translate="no">​</a></h3>
<p>One size doesn't fit all. That's why Kthena replaced hardcoded prefix-cache parameters with a fully <a href="https://github.com/volcano-sh/kthena/pull/844" target="_blank" rel="noopener noreferrer" class="">configurable prefix-matching system</a>. You now have granular control over prefix-cache behavior with the following parameters:</p>
<ul>
<li class=""><strong>Block Size (for hash processing):</strong> Controls the granularity of the prefix match. Smaller blocks offer more precise matching but increase CPU overhead, while larger blocks process faster.</li>
<li class=""><strong>Max Block Limits:</strong> Sets a ceiling on how much of a given prompt is hashed. This protects the router from computational bottlenecks and latency spikes when handling excessively long incoming prompts.</li>
<li class=""><strong>Cache Capacity:</strong> Defines how many prefix entries the router can remember. Increasing this improves cache hit rates for highly diverse workloads, at the cost of slightly higher memory footprint.</li>
<li class=""><strong>Top-K Results:</strong> Determines how many candidate instances are considered when a match is found. Tuning this allows for better load balancing, ensuring traffic is distributed smoothly across multiple nodes instead of overwhelming a single active instance.</li>
</ul>
<p>By fine-tuning these settings, you can tailor Kthena's routing performance to match your specific models and business LLM workloads.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="granular-resource-efficient-rolling-updates">Granular, Resource-Efficient Rolling Updates<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#granular-resource-efficient-rolling-updates" class="hash-link" aria-label="Granular, Resource-Efficient Rolling Updates的直接链接" title="Granular, Resource-Efficient Rolling Updates的直接链接" translate="no">​</a></h2>
<p>Historically, Kthena executed rolling updates at the entire <code>ServingGroup</code> level. For massive LLM applications, completely rebuilding a <code>ServingGroup</code> is an incredibly resource-intensive and time-consuming process.</p>
<p>To solve this, we are introducing <a href="https://github.com/volcano-sh/kthena/pull/802" target="_blank" rel="noopener noreferrer" class="">role-based rolling updates</a>. You no longer need to update an entire <code>ServingGroup</code> when only a specific <code>Role</code> requires changes (which is also why we introduced <code>RoleRecreate</code> in the recovery policy). Starting from v0.4.0, you can dynamically adjust your <code>rolloutStrategy</code>—drastically cutting down resource consumption, speeding up deployment times.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-open-ecosystem">An Open Ecosystem<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#an-open-ecosystem" class="hash-link" aria-label="An Open Ecosystem的直接链接" title="An Open Ecosystem的直接链接" translate="no">​</a></h2>
<p>We are deeply committed to building Kthena as an open, inclusive, and thriving project alongside the wider open-source community.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modelscope-support">ModelScope Support<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#modelscope-support" class="hash-link" aria-label="ModelScope Support的直接链接" title="ModelScope Support的直接链接" translate="no">​</a></h3>
<p>In v0.4.0, we have extended Kthena's model downloader with <a href="https://github.com/volcano-sh/kthena/pull/861" target="_blank" rel="noopener noreferrer" class="">ModelScope protocol support</a>. This allows users and operators to choose a model repository that suits their needs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-a-variety-of-inference-engines">Support for A Variety of Inference Engines<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.4.0#support-for-a-variety-of-inference-engines" class="hash-link" aria-label="Support for A Variety of Inference Engines的直接链接" title="Support for A Variety of Inference Engines的直接链接" translate="no">​</a></h3>
<p>Furthermore, we are proud that <code>ModelServing</code> is now thoroughly verified to support leading inference engines like <strong>vLLM</strong> and <strong>SGLang</strong>.</p>
<p>To help user get started quickly, Kthena v0.4.0 includes <a href="https://github.com/volcano-sh/kthena/pull/883" target="_blank" rel="noopener noreferrer" class="">SGLang deployment examples and documentation</a>. This guide enables developers to use SGLang in Kthena with ease.</p>
<p>By seamlessly integrating with diverse AI technologies rather than locking you into a single solution, Kthena continues to deepen its roots within the vibrant Cloud Native AI landscape. We warmly invite developers worldwide to join us in building this inclusive and dynamic future together!</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Kthena v0.3.0 Released: Production-Ready Inference Orchestration]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0</guid>
            <pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Released: 2026-01-31]]></description>
            <content:encoded><![CDATA[<p>Released: 2026-01-31</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#summary" class="hash-link" aria-label="Summary的直接链接" title="Summary的直接链接" translate="no">​</a></h2>
<p>Release v0.3.0 establishes Kthena as a more robust and scalable platform for AI inference workloads. This release introduces significant enhancements in ModelServing, Router, and ModelBooster. Key highlights include seamless integration with <strong>LeaderWorkerSet</strong>, advanced <strong>network topology-aware scheduling</strong> for PD disaggregation, and a comprehensive <strong>Router Observability</strong> framework. Additionally, this version brings native <strong>ModelServing version control</strong>, support for <strong>vLLM data parallel deployment</strong>, and a complete E2E test suite for the router, ensuring high stability and reliability for production environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#whats-new" class="hash-link" aria-label="What's New的直接链接" title="What's New的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-features-overview">Key Features Overview<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#key-features-overview" class="hash-link" aria-label="Key Features Overview的直接链接" title="Key Features Overview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>LeaderWorkerSet Support</strong>: Integration with the <strong>LeaderWorkerSet (LWS)</strong> API allows for sophisticated management of distributed inference workloads.</li>
<li class=""><strong>Role-Level Gang Scheduling &amp; Topology Awareness</strong>: Leverages Volcano's new <code>subGroupPolicy</code> feature to enable fine-grained, <strong>role-based gang scheduling</strong> and <strong>network topology awareness</strong>.</li>
<li class=""><strong>ModelServing Partition Revision Control</strong>: Introduced a native revision-based version control system for ModelServing.</li>
<li class=""><strong>Router Observability &amp; Debugging</strong>: Comprehensive documentation and framework for router observability, plus a dedicated debug port.</li>
<li class=""><strong>Enhanced Rolling Updates</strong>: Support for <code>maxUnavailable</code> allows tuning the velocity of updates for faster rollouts.</li>
<li class=""><strong>Plugin Support</strong>: Flexible plugin architecture for ModelServing to inject custom configuration logic.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="leaderworkerset-support-for-modelserving-role">LeaderWorkerSet Support for ModelServing Role<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#leaderworkerset-support-for-modelserving-role" class="hash-link" aria-label="LeaderWorkerSet Support for ModelServing Role的直接链接" title="LeaderWorkerSet Support for ModelServing Role的直接链接" translate="no">​</a></h3>
<p><strong>Background and Motivation</strong>:
Distributed inference workloads often require complex topologies where a leader pod manages multiple worker pods. Configuring these relationships manually can be error-prone. By integrating with the Kubernetes LeaderWorkerSet (LWS) API, Kthena simplify the deployment and management of these workloads.</p>
<p><strong>Key Capabilities</strong>:</p>
<ul>
<li class=""><strong>Direct Integration</strong>: ModelServing Roles can now leverage LWS to automatically manage leader-worker groups.</li>
<li class=""><strong>Simplified Topology</strong>: Reduces the complexity of defining distributed inference services requiring strict coordination.</li>
</ul>
<p><strong>Related</strong>:</p>
<ul>
<li class="">PR: <a href="https://github.com/volcano-sh/kthena/pull/609" target="_blank" rel="noopener noreferrer" class="">#609</a>, <a href="https://github.com/volcano-sh/kthena/pull/683" target="_blank" rel="noopener noreferrer" class="">#683</a></li>
<li class="">Contributors: <a href="https://github.com/zhiweideren" target="_blank" rel="noopener noreferrer" class="">@zhiweideren</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-level-gang-scheduling--topology-awareness">Role-Level Gang Scheduling &amp; Topology Awareness<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#role-level-gang-scheduling--topology-awareness" class="hash-link" aria-label="Role-Level Gang Scheduling &amp; Topology Awareness的直接链接" title="Role-Level Gang Scheduling &amp; Topology Awareness的直接链接" translate="no">​</a></h3>
<p><strong>Background and Motivation</strong>:
In Prefill-Decode (PD) separation scenarios, the communication overhead between prefill and decode instances is critical. Ensuring these instances are scheduled closer together (e.g., on the same switch or rack) significantly improves performance. Kthena now enables <strong>fine-grained, role-level control</strong> over both gang scheduling and network topology awareness by leveraging Volcano's <code>subGroupPolicy</code>.</p>
<p><strong>Key Capabilities</strong>:</p>
<ul>
<li class=""><strong>Declarative Topology Policies</strong>: Configure distinct network topology constraints for the entire ServingGroup (<code>groupPolicy</code>) and for individual Roles (<code>rolePolicy</code>) directly in the <code>ModelServing</code> spec.</li>
<li class=""><strong>Automatic Pod Grouping</strong>: The controller automatically labels Pods with <code>modelserving.volcano.sh/role</code> and <code>modelserving.volcano.sh/role-id</code>, enabling Volcano to form subGroups for precise topology-aware placement.</li>
<li class=""><strong>Performance Optimization</strong>: Minimizes inter-role communication latency and maximizes bandwidth utilization for intensive distributed inference jobs by co-locating related tasks on network-proximal nodes.</li>
<li class=""><strong>Role-Level Gang Scheduling</strong>: The <code>subGroupPolicy</code> also enforces <strong>gang scheduling at the role level</strong>, ensuring that all Pods belonging to a specific role (e.g., all <code>prefill-0</code> Pods) are scheduled together as an atomic unit. This guarantees that partial deployments of a role do not occur, which is critical for correctness in distributed inference workloads.</li>
</ul>
<p><strong>Note</strong>: This feature requires Volcano v1.14+ for <code>subGroupPolicy</code> support.</p>
<p><strong>Related</strong>:</p>
<ul>
<li class="">Proposal: <a href="https://github.com/volcano-sh/kthena/blob/main/docs/proposal/network-topology.md" target="_blank" rel="noopener noreferrer" class="">Network Topology</a></li>
<li class="">PR: <a href="https://github.com/volcano-sh/kthena/pull/587" target="_blank" rel="noopener noreferrer" class="">#587</a></li>
<li class="">Contributors: <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modelserving-partition-revision-control">ModelServing Partition Revision Control<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#modelserving-partition-revision-control" class="hash-link" aria-label="ModelServing Partition Revision Control的直接链接" title="ModelServing Partition Revision Control的直接链接" translate="no">​</a></h3>
<p><strong>Background and Motivation</strong>:
The partition field in a Kthena ModelServing defines a boundary for rolling updates, allowing you to partition the update process so that only a subset of ServingGroups are updated while others remain on the previous version. It is primarily used for canary deployments, phased rollouts, and staging updates in stateful applications where strict control over update order is necessary.</p>
<p><strong>Key Capabilities</strong>:</p>
<ul>
<li class=""><strong>Revision Tracking</strong>: Automatically tracks changes to ModelServing configurations.</li>
<li class=""><strong>Partition Protection</strong>: Supports partition-based updates to ensure service continuity during rollouts.</li>
<li class=""><strong>Rollback</strong>: Easily revert to a previous stable revision.</li>
</ul>
<p><strong>Related</strong>:</p>
<ul>
<li class="">PR: <a href="https://github.com/volcano-sh/kthena/pull/590" target="_blank" rel="noopener noreferrer" class="">#590</a>, <a href="https://github.com/volcano-sh/kthena/pull/653" target="_blank" rel="noopener noreferrer" class="">#653</a>, <a href="https://github.com/volcano-sh/kthena/pull/671" target="_blank" rel="noopener noreferrer" class="">#671</a></li>
<li class="">Contributors: <a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>, <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="router-observability--debugging">Router Observability &amp; Debugging<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#router-observability--debugging" class="hash-link" aria-label="Router Observability &amp; Debugging的直接链接" title="Router Observability &amp; Debugging的直接链接" translate="no">​</a></h3>
<p><strong>Background and Motivation</strong>:
Deep visibility into the inference router is essential for diagnosing latency issues and ensuring SLA compliance. The new observability framework and debug port provide the necessary tools for operators.</p>
<p><strong>Key Capabilities</strong>:</p>
<ul>
<li class=""><strong>Debug Port</strong>: A dedicated port (default <code>15000</code>) for real-time inspection of routing tables and upstream health.</li>
<li class=""><strong>Comprehensive Metrics</strong>: Detailed documentation and setup for monitoring request latency, throughput, and error rates.</li>
<li class=""><strong>E2E Testing</strong>: A robust E2E test framework covering most routing scenarios ensures reliability.</li>
</ul>
<p><strong>Related</strong>:</p>
<ul>
<li class="">PR: <a href="https://github.com/volcano-sh/kthena/pull/599" target="_blank" rel="noopener noreferrer" class="">#599</a>, <a href="https://github.com/volcano-sh/kthena/pull/622" target="_blank" rel="noopener noreferrer" class="">#622</a></li>
<li class="">Contributors: <a href="https://github.com/yashisrani" target="_blank" rel="noopener noreferrer" class="">@yashisrani</a>, <a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-notable-changes">Other Notable Changes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#other-notable-changes" class="hash-link" aria-label="Other Notable Changes的直接链接" title="Other Notable Changes的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="features-and-improvements">Features and Improvements<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#features-and-improvements" class="hash-link" aria-label="Features and Improvements的直接链接" title="Features and Improvements的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>[ModelServing]</strong> Support <code>maxUnavailable</code> in modelserving rolling update <a href="https://github.com/volcano-sh/kthena/pull/640" target="_blank" rel="noopener noreferrer" class="">#640</a> (<a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>)</li>
<li class=""><strong>[ModelServing]</strong> Implement extension plugin framework <a href="https://github.com/volcano-sh/kthena/pull/588" target="_blank" rel="noopener noreferrer" class="">#588</a> (<a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>)</li>
<li class=""><strong>[ModelServing]</strong> Support vLLM data parallel deployment and Expert Parallel modes</li>
<li class=""><strong>[CLI]</strong> Add templates for PD disaggregation use cases <a href="https://github.com/volcano-sh/kthena/issues/571" target="_blank" rel="noopener noreferrer" class="">#571</a> (<a href="https://github.com/huntersman" target="_blank" rel="noopener noreferrer" class="">@huntersman</a>)</li>
<li class=""><strong>[Client]</strong> Make client QPS and Burst customizable <a href="https://github.com/volcano-sh/kthena/pull/686" target="_blank" rel="noopener noreferrer" class="">#686</a> (<a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>)</li>
<li class=""><strong>[Webhooks]</strong> Enable ModelServing webhooks by default in Helm charts <a href="https://github.com/volcano-sh/kthena/pull/694" target="_blank" rel="noopener noreferrer" class="">#694</a> (<a href="https://github.com/VanderChen" target="_blank" rel="noopener noreferrer" class="">@VanderChen</a>)</li>
<li class=""><strong>[Infra]</strong> One-click deploy from source via <code>hack/local-up-kthena.sh</code> <a href="https://github.com/volcano-sh/kthena/pull/613" target="_blank" rel="noopener noreferrer" class="">#613</a> (<a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#bug-fixes" class="hash-link" aria-label="Bug Fixes的直接链接" title="Bug Fixes的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>[Scheduler]</strong> Fix divide-by-zero in LeastRequest scoring <a href="https://github.com/volcano-sh/kthena/pull/723" target="_blank" rel="noopener noreferrer" class="">#723</a> (<a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>)</li>
<li class=""><strong>[Controller]</strong> Fix role status transition to Running to restore scale-down protection <a href="https://github.com/volcano-sh/kthena/pull/706" target="_blank" rel="noopener noreferrer" class="">#706</a> (<a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>)</li>
<li class=""><strong>[Controller]</strong> Fix panic in PD scheduler when no prefill pods are available <a href="https://github.com/volcano-sh/kthena/pull/714" target="_blank" rel="noopener noreferrer" class="">#714</a> (<a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>)</li>
<li class=""><strong>[Controller]</strong> Fix silent recovery of failed pods after ModelServing controller restart <a href="https://github.com/volcano-sh/kthena/pull/697" target="_blank" rel="noopener noreferrer" class="">#697</a> (<a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>)</li>
<li class=""><strong>[Controller]</strong> Fix recovering headless services after deletion <a href="https://github.com/volcano-sh/kthena/pull/598" target="_blank" rel="noopener noreferrer" class="">#598</a> (<a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>)</li>
<li class=""><strong>[Controller]</strong> Fix validate gangpolicy minRoleReplicas <a href="https://github.com/volcano-sh/kthena/pull/699" target="_blank" rel="noopener noreferrer" class="">#699</a> (<a href="https://github.com/VanderChen" target="_blank" rel="noopener noreferrer" class="">@VanderChen</a>)</li>
<li class=""><strong>[Controller]</strong> Fix controllerrevision data warping <a href="https://github.com/volcano-sh/kthena/pull/698" target="_blank" rel="noopener noreferrer" class="">#698</a> (<a href="https://github.com/VanderChen" target="_blank" rel="noopener noreferrer" class="">@VanderChen</a>)</li>
<li class=""><strong>[Controller]</strong> Fix modelserving controller panic <a href="https://github.com/volcano-sh/kthena/pull/688" target="_blank" rel="noopener noreferrer" class="">#688</a> (<a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>)</li>
<li class=""><strong>[Controller]</strong> Fix restart during modelserving create: pod number mismatch <a href="https://github.com/volcano-sh/kthena/pull/689" target="_blank" rel="noopener noreferrer" class="">#689</a> (<a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>)</li>
<li class=""><strong>[Controller]</strong> Check role.Name in ModelServing validator <a href="https://github.com/volcano-sh/kthena/pull/684" target="_blank" rel="noopener noreferrer" class="">#684</a> (<a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>)</li>
<li class=""><strong>[Controller]</strong> Fix bug where role deletion did not trigger reconstruction <a href="https://github.com/volcano-sh/kthena/pull/629" target="_blank" rel="noopener noreferrer" class="">#629</a> (<a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>)</li>
<li class=""><strong>[Router]</strong> Protect Headless Services Created by ModelServing <a href="https://github.com/volcano-sh/kthena/pull/598" target="_blank" rel="noopener noreferrer" class="">#598</a> (<a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contributors">Contributors<a href="https://kthena.volcano.sh/zh-Hans/blog/release-v0.3.0#contributors" class="hash-link" aria-label="Contributors的直接链接" title="Contributors的直接链接" translate="no">​</a></h2>
<p>Thank you to all contributors who made this release possible:</p>
<p><a href="https://github.com/hzxuzhonghu" target="_blank" rel="noopener noreferrer" class="">@hzxuzhonghu</a>, <a href="https://github.com/LiZhenCheng9527" target="_blank" rel="noopener noreferrer" class="">@LiZhenCheng9527</a>, <a href="https://github.com/YaoZengzeng" target="_blank" rel="noopener noreferrer" class="">@YaoZengzeng</a>, <a href="https://github.com/git-malu" target="_blank" rel="noopener noreferrer" class="">@git-malu</a>, <a href="https://github.com/FAUST-BENCHOU" target="_blank" rel="noopener noreferrer" class="">@FAUST-BENCHOU</a>, <a href="https://github.com/katara-Jayprakash" target="_blank" rel="noopener noreferrer" class="">@katara-Jayprakash</a>, <a href="https://github.com/zhiweideren" target="_blank" rel="noopener noreferrer" class="">@zhiweideren</a>, <a href="https://github.com/aaradhychinche-alt" target="_blank" rel="noopener noreferrer" class="">@aaradhychinche-alt</a>, <a href="https://github.com/WHOIM1205" target="_blank" rel="noopener noreferrer" class="">@WHOIM1205</a>, <a href="https://github.com/yashisrani" target="_blank" rel="noopener noreferrer" class="">@yashisrani</a>, <a href="https://github.com/huntersman" target="_blank" rel="noopener noreferrer" class="">@huntersman</a>, <a href="https://github.com/VanderChen" target="_blank" rel="noopener noreferrer" class="">@VanderChen</a></p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Kthena Router Supports Gateway API and Inference Extension]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support</guid>
            <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#introduction" class="hash-link" aria-label="Introduction的直接链接" title="Introduction的直接链接" translate="no">​</a></h2>
<p>As Kubernetes becomes the de facto standard for deploying AI/ML workloads, the need for standardized, interoperable traffic management APIs has become increasingly important. The <a href="https://gateway-api.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Gateway API</a> represents a significant evolution from the traditional Ingress API, providing a more expressive, role-oriented, and extensible model for managing north-south traffic in Kubernetes clusters.</p>
<p>Building on top of Gateway API, the <a href="https://gateway-api-inference-extension.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">Gateway API Inference Extension</a> introduces specialized resources and capabilities designed specifically for AI/ML inference workloads. This extension standardizes how inference services are exposed and routed through gateway implementations, enabling seamless integration across different gateway providers.</p>
<p>Kthena Router now supports both Gateway API and Gateway API Inference Extension, providing users with flexible routing options while maintaining compatibility with industry standards. This blog post explores why these APIs matter, how to enable them, and demonstrates practical usage examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-gateway-api-and-gateway-api-inference-extension">What is Gateway API and Gateway API Inference Extension?<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#what-is-gateway-api-and-gateway-api-inference-extension" class="hash-link" aria-label="What is Gateway API and Gateway API Inference Extension?的直接链接" title="What is Gateway API and Gateway API Inference Extension?的直接链接" translate="no">​</a></h2>
<p>Gateway API is a Kubernetes project that provides a standardized, role-oriented API for managing service networking. It separates concerns into distinct roles (Infrastructure Provider, Cluster Operator, and Application Developer) and supports advanced routing capabilities including cross-namespace routing, multiple protocols, and traffic splitting. Gateway API Inference Extension builds upon Gateway API to provide inference-specific capabilities for AI/ML workloads. It introduces specialized resources like InferencePool and InferenceObjective, enabling model-aware routing and OpenAI API compatibility for standardized inference service exposure and routing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-support-gateway-api-and-inference-extension">Why Support Gateway API and Inference Extension?<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#why-support-gateway-api-and-inference-extension" class="hash-link" aria-label="Why Support Gateway API and Inference Extension?的直接链接" title="Why Support Gateway API and Inference Extension?的直接链接" translate="no">​</a></h2>
<p>There are several compelling reasons why Kthena Router should support these APIs:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-resolving-global-modelname-conflicts">1. Resolving Global ModelName Conflicts<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#1-resolving-global-modelname-conflicts" class="hash-link" aria-label="1. Resolving Global ModelName Conflicts的直接链接" title="1. Resolving Global ModelName Conflicts的直接链接" translate="no">​</a></h3>
<p>In traditional routing configurations, the <code>modelName</code> field in <code>ModelRoute</code> resources is global. When multiple <code>ModelRoute</code> resources use the same <code>modelName</code>, conflicts occur, leading to undefined routing behavior. This limitation becomes problematic in multi-tenant environments where different teams or applications might want to use the same model name for different purposes.</p>
<p>Gateway API solves this by introducing the concept of <strong>Gateway</strong> resources that define independent routing spaces. Each Gateway can listen on different ports, and ModelRoutes bound to different Gateways are completely isolated, even if they share the same <code>modelName</code>. This enables:</p>
<ul>
<li class=""><strong>Multi-tenant isolation</strong>: Different teams can use the same model names without conflicts</li>
<li class=""><strong>Environment separation</strong>: Separate routing configurations for dev, staging, and production</li>
<li class=""><strong>Port-based routing</strong>: Different applications can access different backends through different ports</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-industry-standard-compatibility">2. Industry Standard Compatibility<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#2-industry-standard-compatibility" class="hash-link" aria-label="2. Industry Standard Compatibility的直接链接" title="2. Industry Standard Compatibility的直接链接" translate="no">​</a></h3>
<p>Gateway API is becoming the industry standard for Kubernetes service networking. By supporting Gateway API, Kthena Router:</p>
<ul>
<li class=""><strong>Improves interoperability</strong>: Works seamlessly with other Gateway API-compatible tools and infrastructure</li>
<li class=""><strong>Reduces vendor lock-in</strong>: Users can migrate between different gateway implementations more easily</li>
<li class=""><strong>Leverages ecosystem</strong>: Benefits from the broader Gateway API community and tooling</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-supporting-gateway-api-inference-extension">3. Supporting Gateway API Inference Extension<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#3-supporting-gateway-api-inference-extension" class="hash-link" aria-label="3. Supporting Gateway API Inference Extension的直接链接" title="3. Supporting Gateway API Inference Extension的直接链接" translate="no">​</a></h3>
<p>Gateway API Inference Extension provides a standardized way to expose AI/ML inference services. By supporting this extension, Kthena Router:</p>
<ul>
<li class=""><strong>Enables standardized inference routing</strong>: Works with InferencePool and InferenceObjective resources</li>
<li class=""><strong>Facilitates multi-gateway deployments</strong>: Can work alongside other gateway implementations using the same API</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-flexible-deployment-options">4. Flexible Deployment Options<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#4-flexible-deployment-options" class="hash-link" aria-label="4. Flexible Deployment Options的直接链接" title="4. Flexible Deployment Options的直接链接" translate="no">​</a></h3>
<p>With Gateway API support, users can choose between:</p>
<ul>
<li class=""><strong>Native ModelRoute/ModelServer</strong>: Kthena's custom CRDs that provide advanced features like PD disaggregation, weighted routing, and sophisticated scheduling algorithms</li>
<li class=""><strong>Gateway API + Inference Extension</strong>: Standard Kubernetes APIs that provide interoperability and compatibility with other gateway implementations</li>
</ul>
<p>This flexibility allows users to select the approach that best fits their specific requirements and infrastructure constraints.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-gateway-api-support">Enabling Gateway API Support<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#enabling-gateway-api-support" class="hash-link" aria-label="Enabling Gateway API Support的直接链接" title="Enabling Gateway API Support的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#prerequisites" class="hash-link" aria-label="Prerequisites的直接链接" title="Prerequisites的直接链接" translate="no">​</a></h3>
<p>Before enabling Gateway API support, ensure you have:</p>
<ul>
<li class="">Kubernetes cluster with Kthena installed (see <a class="" href="https://kthena.volcano.sh/zh-Hans/docs/getting-started/installation">Installation Guide</a>)</li>
<li class="">Basic understanding of Kubernetes Gateway API concepts</li>
<li class=""><code>kubectl</code> configured to access your cluster</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#configuration" class="hash-link" aria-label="Configuration的直接链接" title="Configuration的直接链接" translate="no">​</a></h3>
<p>Enable Gateway API support by setting the <code>--enable-gateway-api=true</code> parameter when deploying Kthena Router:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Configure during Helm installation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">helm install kthena \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --set networking.kthenaRouter.gatewayAPI.enabled=true \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --version v0.2.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  oci://ghcr.io/volcano-sh/charts/kthena</span><br></span></code></pre></div></div>
<p>Or modify the configuration in an already deployed Kthena Router:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl edit deployment kthena-router -n kthena-system</span><br></span></code></pre></div></div>
<p>Ensure the container arguments include <code>--enable-gateway-api=true</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="default-gateway">Default Gateway<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#default-gateway" class="hash-link" aria-label="Default Gateway的直接链接" title="Default Gateway的直接链接" translate="no">​</a></h3>
<p>When Gateway API support is enabled, Kthena Router automatically creates a default Gateway with the following characteristics:</p>
<ul>
<li class=""><strong>Name</strong>: <code>default</code></li>
<li class=""><strong>Namespace</strong>: Same as the Kthena Router's namespace (typically <code>kthena-system</code>)</li>
<li class=""><strong>GatewayClass</strong>: <code>kthena-router</code></li>
<li class=""><strong>Listening Port</strong>: Kthena Router's default service port (defaults to 8080)</li>
<li class=""><strong>Protocol</strong>: HTTP</li>
</ul>
<p>View the default Gateway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Example output:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># NAME      CLASS           ADDRESS   PROGRAMMED   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># default   kthena-router             True         5m</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-gateway-api-with-native-modelroutemodelserver">Using Gateway API with Native ModelRoute/ModelServer<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#using-gateway-api-with-native-modelroutemodelserver" class="hash-link" aria-label="Using Gateway API with Native ModelRoute/ModelServer的直接链接" title="Using Gateway API with Native ModelRoute/ModelServer的直接链接" translate="no">​</a></h2>
<p>This example demonstrates how to use Gateway API with Kthena's native <code>ModelRoute</code> and <code>ModelServer</code> CRDs, resolving the modelName conflict problem.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-deploy-mock-model-servers">Step 1: Deploy Mock Model Servers<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-1-deploy-mock-model-servers" class="hash-link" aria-label="Step 1: Deploy Mock Model Servers的直接链接" title="Step 1: Deploy Mock Model Servers的直接链接" translate="no">​</a></h3>
<p>Deploy mock LLM services and their corresponding ModelServer resources:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Deploy DeepSeek 1.5B mock service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://raw.githubusercontent.com/volcano-sh/kthena/main/examples/kthena-router/LLM-Mock-ds1.5b.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Deploy DeepSeek 7B mock service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://raw.githubusercontent.com/volcano-sh/kthena/main/examples/kthena-router/LLM-Mock-ds7b.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Create ModelServer for DeepSeek 1.5B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://raw.githubusercontent.com/volcano-sh/kthena/main/examples/kthena-router/ModelServer-ds1.5b.yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Create ModelServer for DeepSeek 7B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://raw.githubusercontent.com/volcano-sh/kthena/main/examples/kthena-router/ModelServer-ds7b.yaml</span><br></span></code></pre></div></div>
<p>Wait for the pods to be ready:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl wait --for=condition=ready pod -l app=deepseek-r1-1-5b --timeout=300s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl wait --for=condition=ready pod -l app=deepseek-r1-7b --timeout=300s</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-create-a-new-gateway">Step 2: Create a New Gateway<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-2-create-a-new-gateway" class="hash-link" aria-label="Step 2: Create a New Gateway的直接链接" title="Step 2: Create a New Gateway的直接链接" translate="no">​</a></h3>
<p>Create and apply a new Gateway listening on a different port:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: gateway.networking.k8s.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: kthena-gateway-8081</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  namespace: default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gatewayClassName: kthena-router</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  listeners:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    port: 8081  # Using a different port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    protocol: HTTP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Verify Gateway status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get gateway kthena-gateway-8081 -n default</span><br></span></code></pre></div></div>
<p><strong>Important Note</strong>: The newly created Gateway listens on port 8081, but you need to manually configure the Kthena Router's Service to expose this port:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Edit the kthena-router Service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl edit service kthena-router -n kthena-system</span><br></span></code></pre></div></div>
<p>Add the new port in <code>spec.ports</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">81</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Add new port</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">81</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8081</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-create-modelroutes-bound-to-different-gateways">Step 3: Create ModelRoutes Bound to Different Gateways<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-3-create-modelroutes-bound-to-different-gateways" class="hash-link" aria-label="Step 3: Create ModelRoutes Bound to Different Gateways的直接链接" title="Step 3: Create ModelRoutes Bound to Different Gateways的直接链接" translate="no">​</a></h3>
<p>Create and apply a ModelRoute bound to the default Gateway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: networking.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: ModelRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: deepseek-default-route</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  namespace: default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  modelName: "deepseek-r1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parentRefs:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: "default"      # Bind to the default Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    namespace: "kthena-system"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kind: "Gateway"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  rules:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: "default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    targetModels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - modelServerName: "deepseek-r1-1-5b"  # Backend ModelServer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<p>Create and apply another ModelRoute using the <strong>same modelName</strong> but bound to the new Gateway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: networking.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: ModelRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: deepseek-route-8081</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  namespace: default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  modelName: "deepseek-r1"  # Same modelName as the default Gateway's ModelRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parentRefs:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: "kthena-gateway-8081"  # Bind to the new Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    namespace: "default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kind: "Gateway"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  rules:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: "default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    targetModels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - modelServerName: "deepseek-r1-7b"  # Using a different backend</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<p><strong>Note</strong>: When Gateway API is enabled, the <code>parentRefs</code> field is required. ModelRoutes without <code>parentRefs</code> will be ignored and will not route any traffic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-verify-the-configuration">Step 4: Verify the Configuration<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-4-verify-the-configuration" class="hash-link" aria-label="Step 4: Verify the Configuration的直接链接" title="Step 4: Verify the Configuration的直接链接" translate="no">​</a></h3>
<p>Now you have two independent routing configurations:</p>
<ol>
<li class="">
<p><strong>Default Gateway (Port 8080)</strong></p>
<ul>
<li class="">ModelRoute: <code>deepseek-default-route</code></li>
<li class="">ModelName: <code>deepseek-r1</code></li>
<li class="">Backend: <code>deepseek-r1-1-5b</code> (DeepSeek-R1-Distill-Qwen-1.5B)</li>
</ul>
</li>
<li class="">
<p><strong>New Gateway (Port 8081)</strong></p>
<ul>
<li class="">ModelRoute: <code>deepseek-route-8081</code></li>
<li class="">ModelName: <code>deepseek-r1</code> (same modelName)</li>
<li class="">Backend: <code>deepseek-r1-7b</code> (DeepSeek-R1-Distill-Qwen-7B)</li>
</ul>
</li>
</ol>
<p>Test the default Gateway (port 8080):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Get the kthena-router IP or hostname</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROUTER_IP=$(kubectl get service kthena-router -n kthena-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># If LoadBalancer is not available, use NodePort or port-forward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># kubectl port-forward -n kthena-system service/kthena-router 80:80 81:81</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Test the default port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl http://${ROUTER_IP}:80/v1/completions \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "model": "deepseek-r1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "prompt": "What is Kubernetes?",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "max_tokens": 100,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "temperature": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Expected output from deepseek-r1-1-5b:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># {"choices":[{"finish_reason":"length","index":0,"logprobs":null,"text":"This is simulated message from deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B!"}],...}</span><br></span></code></pre></div></div>
<p>Test the new Gateway (port 8081):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Test port 81</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl http://${ROUTER_IP}:81/v1/completions \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "model": "deepseek-r1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "prompt": "What is Kubernetes?",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "max_tokens": 100,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "temperature": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Expected output from deepseek-r1-7b:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># {"choices":[{"finish_reason":"length","index":0,"logprobs":null,"text":"This is simulated message from deepseek-ai/DeepSeek-R1-Distill-Qwen-7B!"}],...}</span><br></span></code></pre></div></div>
<p>Although both requests use the same <code>modelName</code> (<code>deepseek-r1</code>), they are routed to different backend model services because they access through different ports (corresponding to different Gateways). This demonstrates how Gateway API resolves the global modelName conflict problem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-gateway-api-with-inference-extension">Using Gateway API with Inference Extension<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#using-gateway-api-with-inference-extension" class="hash-link" aria-label="Using Gateway API with Inference Extension的直接链接" title="Using Gateway API with Inference Extension的直接链接" translate="no">​</a></h2>
<p>This example demonstrates how to use Gateway API Inference Extension with Kthena Router, providing a standardized way to expose and route inference services.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-install-the-inference-extension-crds">Step 1: Install the Inference Extension CRDs<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-1-install-the-inference-extension-crds" class="hash-link" aria-label="Step 1: Install the Inference Extension CRDs的直接链接" title="Step 1: Install the Inference Extension CRDs的直接链接" translate="no">​</a></h3>
<p>Install the Gateway API Inference Extension CRDs in your cluster:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/latest/download/manifests.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-deploy-sample-model-server">Step 2: Deploy Sample Model Server<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-2-deploy-sample-model-server" class="hash-link" aria-label="Step 2: Deploy Sample Model Server的直接链接" title="Step 2: Deploy Sample Model Server的直接链接" translate="no">​</a></h3>
<p>Deploy a model that will serve as the backend for the Gateway Inference Extension. Follow the <a class="" href="https://kthena.volcano.sh/zh-Hans/docs/getting-started/quick-start">Quick Start</a> guide to deploy a model in the <code>default</code> namespace and ensure it's in <code>Active</code> state.</p>
<p>After deployment, identify the labels of your model pods:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Get the model pods and their labels</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods -l workload.serving.volcano.sh/managed-by=workload.serving.volcano.sh --show-labels</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Example output shows labels like:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># modelserving.volcano.sh/name=demo-backend1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># modelserving.volcano.sh/group-name=demo-backend1-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># modelserving.volcano.sh/role=leader</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># workload.serving.volcano.sh/model-name=demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># workload.serving.volcano.sh/backend-name=backend1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># workload.serving.volcano.sh/managed-by=workload.serving.volcano.sh</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-deploy-the-inferencepool">Step 3: Deploy the InferencePool<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-3-deploy-the-inferencepool" class="hash-link" aria-label="Step 3: Deploy the InferencePool的直接链接" title="Step 3: Deploy the InferencePool的直接链接" translate="no">​</a></h3>
<p>Kthena Router natively supports Gateway Inference Extension and does not require the Endpoint Picker Extension. Create an InferencePool resource that selects your Kthena model endpoints:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: inference.networking.k8s.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: InferencePool</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: kthena-demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  targetPorts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - number: 8000  # Adjust based on your model server port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  selector:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    matchLabels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      workload.serving.volcano.sh/model-name: demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  # Kthena Router natively supports Gateway Inference Extension and does not require the Endpoint Picker Extension.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  # It's just a placeholder for API validation.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  endpointPickerRef:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name: kthena-demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    port:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      number: 8000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-enable-gateway-api-inference-extension-in-kthena-router">Step 4: Enable Gateway API Inference Extension in Kthena Router<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-4-enable-gateway-api-inference-extension-in-kthena-router" class="hash-link" aria-label="Step 4: Enable Gateway API Inference Extension in Kthena Router的直接链接" title="Step 4: Enable Gateway API Inference Extension in Kthena Router的直接链接" translate="no">​</a></h3>
<p>Enable the Gateway API Inference Extension flag in your Kthena Router deployment:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl patch deployment kthena-router -n kthena-system --type='json' -p='[</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "op": "add",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "path": "/spec/template/spec/containers/0/args/-",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "value": "--enable-gateway-api=true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "op": "add",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "path": "/spec/template/spec/containers/0/args/-",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "value": "--enable-gateway-api-inference-extension=true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">]'</span><br></span></code></pre></div></div>
<p>Wait for the deployment to roll out:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl rollout status deployment/kthena-router -n kthena-system</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-deploy-the-gateway-and-httproute">Step 5: Deploy the Gateway and HTTPRoute<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-5-deploy-the-gateway-and-httproute" class="hash-link" aria-label="Step 5: Deploy the Gateway and HTTPRoute的直接链接" title="Step 5: Deploy the Gateway and HTTPRoute的直接链接" translate="no">​</a></h3>
<p>Create a Gateway resource that uses the <code>kthena-router</code> GatewayClass:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: gateway.networking.k8s.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: inference-gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gatewayClassName: kthena-router</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  listeners:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    port: 8080</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    protocol: HTTP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<p>Create and apply the HTTPRoute configuration that connects the gateway to your InferencePool:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kubectl apply -f -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apiVersion: gateway.networking.k8s.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kind: HTTPRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: kthena-demo-route</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parentRefs:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - group: gateway.networking.k8s.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kind: Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name: inference-gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  rules:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - backendRefs:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - group: inference.networking.k8s.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      kind: InferencePool</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name: kthena-demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    matches:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - path:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        type: PathPrefix</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value: /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    timeouts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      request: 300s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-verify-and-test">Step 6: Verify and Test<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#step-6-verify-and-test" class="hash-link" aria-label="Step 6: Verify and Test的直接链接" title="Step 6: Verify and Test的直接链接" translate="no">​</a></h3>
<p>Confirm that the Gateway was assigned an IP address and reports a <code>Programmed=True</code> status:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get gateway inference-gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Expected output:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># NAME                CLASS           ADDRESS         PROGRAMMED   AGE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># inference-gateway   kthena-router   &lt;GATEWAY_IP&gt;    True         30s</span><br></span></code></pre></div></div>
<p>Verify that all components are properly configured:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Check Gateway status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get gateway inference-gateway -o yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Check HTTPRoute status - should show Accepted=True and ResolvedRefs=True</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get httproute kthena-demo-route -o yaml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Check InferencePool status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl get inferencepool kthena-demo -o yaml</span><br></span></code></pre></div></div>
<p>Test inference through the gateway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Get the kthena-router IP or hostname</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ROUTER_IP=$(kubectl get service kthena-router -n kthena-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># If LoadBalancer is not available, use NodePort or port-forward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># kubectl port-forward -n kthena-system service/kthena-router 80:80</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Test the completions endpoint</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl http://${ROUTER_IP}:80/v1/completions \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "model": "Qwen2.5-0.5B-Instruct",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "prompt": "Write as if you were a critic: San Francisco",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "max_tokens": 100,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "temperature": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="native-modelroutemodelserver-advanced-features">Native ModelRoute/ModelServer: Advanced Features<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#native-modelroutemodelserver-advanced-features" class="hash-link" aria-label="Native ModelRoute/ModelServer: Advanced Features的直接链接" title="Native ModelRoute/ModelServer: Advanced Features的直接链接" translate="no">​</a></h2>
<p>While Gateway API and Gateway API Inference Extension provide standardized, interoperable routing capabilities, Kthena's native <code>ModelRoute</code> and <code>ModelServer</code> CRDs offer more experimental and advanced features specifically designed for AI/ML inference workloads:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefill-decode-pd-disaggregation">Prefill-Decode (PD) Disaggregation<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#prefill-decode-pd-disaggregation" class="hash-link" aria-label="Prefill-Decode (PD) Disaggregation的直接链接" title="Prefill-Decode (PD) Disaggregation的直接链接" translate="no">​</a></h3>
<p>Native ModelRoute/ModelServer supports PD disaggregation, where the compute-intensive prefill phase is separated from the token generation decode phase. This enables:</p>
<ul>
<li class=""><strong>Hardware optimization</strong>: Use specialized hardware for each phase</li>
<li class=""><strong>Better resource utilization</strong>: Match workload characteristics to hardware capabilities</li>
<li class=""><strong>Reduced latency</strong>: Optimize each phase independently</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="weighted-based-routing">Weighted-Based Routing<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#weighted-based-routing" class="hash-link" aria-label="Weighted-Based Routing的直接链接" title="Weighted-Based Routing的直接链接" translate="no">​</a></h3>
<p>Native ModelRoute supports sophisticated weighted routing across multiple ModelServers, enabling:</p>
<ul>
<li class=""><strong>Traffic splitting</strong>: Distribute traffic across backends based on weights</li>
<li class=""><strong>A/B testing</strong>: Gradually shift traffic between different model versions</li>
<li class=""><strong>Capacity-based routing</strong>: Route based on backend capacity and availability</li>
</ul>
<p>These advanced features make native ModelRoute/ModelServer ideal for production environments that require sophisticated traffic management and optimization strategies. However, Gateway API and Gateway API Inference Extension provide better interoperability and compatibility with other gateway implementations, making them suitable for multi-gateway deployments and standardized infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://kthena.volcano.sh/zh-Hans/blog/gateway-api-support#conclusion" class="hash-link" aria-label="Conclusion的直接链接" title="Conclusion的直接链接" translate="no">​</a></h2>
<p>Kthena Router's support for Gateway API and Gateway API Inference Extension provides users with flexible routing options that balance standardization and advanced capabilities. Gateway API resolves the modelName conflict problem and enables multi-tenant isolation, while Gateway API Inference Extension provides standardized inference routing capabilities.</p>
<p>Users can choose between:</p>
<ul>
<li class=""><strong>Gateway API + Inference Extension</strong>: For standardized, interoperable routing that works across different gateway implementations</li>
<li class=""><strong>Native ModelRoute/ModelServer</strong>: For advanced features like PD disaggregation, weighted routing, and sophisticated scheduling algorithms</li>
</ul>
<p>Both approaches are fully supported and can be used together in the same cluster, providing maximum flexibility for different use cases and requirements.</p>
<p>For more information, please refer to the <a class="" href="https://kthena.volcano.sh/zh-Hans/docs/user-guide/gateway-api-support">Gateway API Support Guide</a> and <a class="" href="https://kthena.volcano.sh/zh-Hans/docs/user-guide/gateway-inference-extension-support">Gateway Inference Extension Support Guide</a>. All example files referenced in this blog are available in the <a href="https://github.com/volcano-sh/kthena/tree/main/examples/kthena-router" target="_blank" rel="noopener noreferrer" class="">kthena/examples/kthena-router</a> directory.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Deep Dive into the Kthena Router]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/router-blog-post</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/router-blog-post</guid>
            <pubDate>Tue, 21 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[1. Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-introduction">1. Introduction<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#1-introduction" class="hash-link" aria-label="1. Introduction的直接链接" title="1. Introduction的直接链接" translate="no">​</a></h2>
<p>As Large Language Models (LLMs) become increasingly central to modern applications, the infrastructure supporting them must evolve to meet demanding performance, scalability, and cost requirements. Deploying LLMs in production presents unique challenges: models are resource-intensive, inference workloads vary significantly, and users expect low latency with high throughput. Traditional load balancers and API gateways, while excellent for conventional web services, lack the awareness needed to intelligently route AI inference traffic.</p>
<p><strong>Kthena Router</strong> addresses these challenges head-on. It is a Kubernetes-native, standalone inference router purpose-built for LLM serving workloads. Unlike generic proxies or load balancers, Kthena Router is model-aware, making intelligent routing decisions based on real-time metrics from inference engines. This enables sophisticated traffic management strategies that significantly improve throughput, reduce latency, and lower operational costs.</p>
<p>The router seamlessly integrates with existing API gateway infrastructure while providing advanced capabilities specifically designed for AI workloads:</p>
<ul>
<li class=""><strong>Model-Aware Routing</strong>: Leverages real-time metrics from inference engines (vLLM, SGLang, TGI) to make intelligent routing decisions</li>
<li class=""><strong>LoRA-Aware Load Balancing</strong>: Intelligently route to pods that have already loaded the desired LoRA adapter to reduce adapter swap latency from hundreds of milliseconds to near-zero</li>
<li class=""><strong>Advanced Scheduling Algorithms</strong>: Includes Prefix Cache Aware, KV Cache Aware and Fairness Scheduling, etc.</li>
<li class=""><strong>Prefill-Decode Disaggregation</strong>: Native support for xPyD (x-prefill/y-decode) deployment patterns</li>
</ul>
<p>Kthena Router is deployed as a standalone binary with minimal dependencies, ensuring lightweight operation and straightforward deployment. It continuously monitors inference engine metrics to obtain real-time information about model status, including currently loaded LoRA adapters, KV cache utilization, request queue lengths, and latency metrics (TTFT/TPOT). This real-time awareness enables the router to make optimal routing decisions that traditional load balancers simply cannot achieve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-architecture">2. Architecture<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#2-architecture" class="hash-link" aria-label="2. Architecture的直接链接" title="2. Architecture的直接链接" translate="no">​</a></h2>
<p>Kthena Router implements a clean, modular architecture designed for performance and extensibility. The system consists of several core components working together to provide intelligent request routing.</p>
<p><img decoding="async" loading="lazy" alt="Kthena Router Architecture" src="https://kthena.volcano.sh/zh-Hans/assets/images/kthena-router-arch-00665cbff34e5b58930eebda9f098115.svg" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-core-components-overview">2.1 Core Components Overview<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#21-core-components-overview" class="hash-link" aria-label="2.1 Core Components Overview的直接链接" title="2.1 Core Components Overview的直接链接" translate="no">​</a></h3>
<p><strong>Router</strong>: The core execution framework responsible for receiving, processing, and forwarding requests. It orchestrates the interaction between all other components and maintains the request lifecycle from initial reception to final response.</p>
<p><strong>Listener</strong>: Manages HTTP/HTTPS listeners and handles incoming traffic on specified ports. It provides flexible configuration for different protocols and can bind to multiple addresses to serve various types of requests. The listener ensures efficient connection handling and supports both streaming and non-streaming request patterns.</p>
<p><strong>Controller</strong>: A Kubernetes-native component that synchronizes and processes Pods and Custom Resources (CRs) such as <code>ModelRoute</code> and <code>ModelServer</code>. The controller watches for changes in the cluster and updates the router's internal state accordingly, ensuring routing decisions are always based on current cluster topology.</p>
<p><strong>Filters</strong>: Contains two critical sub-modules that process requests before they reach the backend:</p>
<ul>
<li class=""><strong>Auth</strong>: Handles traffic authentication and authorization, supporting API Key, JWT</li>
<li class=""><strong>RateLimit</strong>: Manages comprehensive rate limiting strategies including input tokens and output tokens limiting</li>
</ul>
<p><strong>Backend</strong>: Provides an abstraction layer for accessing various inference engines. It masks differences in metrics interface access methods and metric naming conventions across frameworks like vLLM, SGLang, and TGI, presenting a unified interface to the scheduler.</p>
<p><strong>Metrics Fetcher</strong>: Continuously collects real-time metrics from inference engine endpoints running on model pods. It gathers critical performance data including:</p>
<ul>
<li class="">KV cache utilization</li>
<li class="">Current LoRA model status</li>
<li class="">Request queue lengths</li>
<li class="">Latency metrics (TTFT - Time To First Token, TPOT - Time Per Output Token)</li>
</ul>
<p><strong>Datastore</strong>: A unified data storage layer that provides efficient access to ModelServer-to-Pod associations, Base Model/LoRA configurations, and runtime metrics. It serves as the central repository for all routing-relevant information and supports callbacks for real-time updates.</p>
<p><strong>Scheduler</strong>: The brain of the router, implementing sophisticated traffic scheduling algorithms. It consists of a scheduling framework and various pluggable scheduling algorithm plugins. The framework integrates and runs different scheduling plugins to filter and score pod collections corresponding to <code>ModelServers</code>, selecting the globally optimal pod as the final access target.</p>
<p><img decoding="async" loading="lazy" alt="Kthena Router Components" src="https://kthena.volcano.sh/zh-Hans/assets/images/kthena-router-components-9e2e8b96fbca503a070d45da0ccbaecb.svg" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-router-api">3. Router API<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#3-router-api" class="hash-link" aria-label="3. Router API的直接链接" title="3. Router API的直接链接" translate="no">​</a></h2>
<p>Kthena Router's routing behavior is controlled by two key Custom Resource Definitions (CRDs): <strong>ModelServer</strong> and <strong>ModelRoute</strong>. These declarative APIs allow you to define sophisticated routing strategies using familiar Kubernetes patterns.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-modelroute">3.1 ModelRoute<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#31-modelroute" class="hash-link" aria-label="3.1 ModelRoute的直接链接" title="3.1 ModelRoute的直接链接" translate="no">​</a></h3>
<p><strong>ModelRoute</strong> defines traffic routing rules based on request characteristics. It determines which ModelServer(s) should handle requests based on model names, LoRA adapters, HTTP headers, and other criteria.</p>
<p>Key fields include:</p>
<ul>
<li class=""><strong>ModelName</strong>: The model name to match in incoming requests</li>
<li class=""><strong>LoRAAdapters</strong>: List of LoRA adapter names this route supports</li>
<li class=""><strong>Rules</strong>: An ordered list of routing rules, each containing:<!-- -->
<ul>
<li class=""><strong>ModelMatch</strong>: Conditions for matching requests (headers, URIs, etc.)</li>
<li class=""><strong>TargetModels</strong>: List of ModelServers to route to, with optional weights</li>
</ul>
</li>
<li class=""><strong>RateLimit</strong>: Token-based rate limiting configuration</li>
</ul>
<p>More details about <code>ModelRoute</code> can be found in the <a href="https://github.com/volcano-sh/kthena/blob/main/charts/kthena/charts/networking/crds/networking.serving.volcano.sh_modelroutes.yaml" target="_blank" rel="noopener noreferrer" class="">definition</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-modelserver">3.2 ModelServer<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#32-modelserver" class="hash-link" aria-label="3.2 ModelServer的直接链接" title="3.2 ModelServer的直接链接" translate="no">​</a></h3>
<p><strong>ModelServer</strong> defines an inference service instance and its access policies. It identifies the pods running your models, specifies the inference framework being used, and defines how traffic should be handled.</p>
<p>Key fields include:</p>
<ul>
<li class=""><strong>WorkloadSelector</strong>: Identifies pods via labels and supports PD (Prefill-Decode) group specifications</li>
<li class=""><strong>Model</strong>: Specifies the base model name that the server hosts</li>
<li class=""><strong>InferenceFramework</strong>: Indicates the inference engine (vLLM, SGLang, TGI, etc.)</li>
<li class=""><strong>WorkloadPort</strong>: Defines the port on which the inference service listens</li>
<li class=""><strong>TrafficPolicy</strong>: Configures timeout, retry policies, and other traffic handling behaviors</li>
<li class=""><strong>KVConnector</strong>: Specifies the KV connector type for PD disaggregated deployments (HTTP, Nixl, LMCache, Mooncake)</li>
</ul>
<p>More details about <code>ModelServer</code> can be found in the <a href="https://github.com/volcano-sh/kthena/blob/main/charts/kthena/charts/networking/crds/networking.serving.volcano.sh_modelservers.yaml" target="_blank" rel="noopener noreferrer" class="">definition</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-example-header-based-multi-model-routing">3.3 Example: Header-Based Multi-Model Routing<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#33-example-header-based-multi-model-routing" class="hash-link" aria-label="3.3 Example: Header-Based Multi-Model Routing的直接链接" title="3.3 Example: Header-Based Multi-Model Routing的直接链接" translate="no">​</a></h3>
<p>For tiered service offerings, route users to different model sizes based on headers:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ModelRoute</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">multi</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">models</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">modelName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deepseek-multi-models"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"premium"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">modelMatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">headers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">user-type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">exact</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> premium</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetModels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">modelServerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deepseek-r1-7b"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetModels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">modelServerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deepseek-r1-1-5b"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ModelServer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">r1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">7b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">r1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">7b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">inferenceEngine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vLLM"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trafficPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ModelServer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">r1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">5b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">r1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">5b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">inferenceEngine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vLLM"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trafficPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10s</span><br></span></code></pre></div></div>
<p><strong>Traffic Flow</strong>:</p>
<ol>
<li class="">Request arrives with model name "deepseek-multi-models"</li>
<li class="">Router checks if <code>user-type: premium</code> header exists</li>
<li class="">Premium users → routed to larger 7B model for better quality</li>
<li class="">Regular users → routed to smaller 1.5B model for cost efficiency</li>
</ol>
<p>Testing premium routing:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://$ROUTER_IP/v1/completions \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -H "user-type: premium" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -d '{"model": "deepseek-multi-models", "prompt": "Explain quantum computing"}'</span><br></span></code></pre></div></div>
<p>This example demonstrates how <code>ModelRoute</code> and <code>ModelServer</code> CRDs provide flexible, declarative control over sophisticated routing strategies, all managed through standard Kubernetes APIs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-core-features">4. Core Features<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#4-core-features" class="hash-link" aria-label="4. Core Features的直接链接" title="4. Core Features的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-intelligent-scheduling-plugins">4.1 Intelligent Scheduling Plugins<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#41-intelligent-scheduling-plugins" class="hash-link" aria-label="4.1 Intelligent Scheduling Plugins的直接链接" title="4.1 Intelligent Scheduling Plugins的直接链接" translate="no">​</a></h3>
<p>What truly differentiates Kthena Router from traditional load balancers is its suite of model-aware scheduling plugins. These plugins leverage real-time inference engine metrics to make intelligent routing decisions that dramatically improve performance.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="411-prefix-cache-aware-scheduling">4.1.1 Prefix Cache Aware Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#411-prefix-cache-aware-scheduling" class="hash-link" aria-label="4.1.1 Prefix Cache Aware Scheduling的直接链接" title="4.1.1 Prefix Cache Aware Scheduling的直接链接" translate="no">​</a></h4>
<p>Modern inference engines like vLLM and SGLang implement prefix caching, where commonly used prompt prefixes are cached to avoid redundant computation. The Prefix Cache Aware plugin maximizes cache hit rates by routing requests with similar prefixes to the same pods.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">Extracts prompt prefixes from incoming requests</li>
<li class="">Maintains a mapping of prefixes to pods that have processed them</li>
<li class="">Routes new requests with matching prefixes to pods likely to have cached KV states</li>
<li class="">Significantly reduces Time To First Token (TTFT) for repeated or similar prompts</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="412-kv-cache-aware-scheduling">4.1.2 KV Cache Aware Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#412-kv-cache-aware-scheduling" class="hash-link" aria-label="4.1.2 KV Cache Aware Scheduling的直接链接" title="4.1.2 KV Cache Aware Scheduling的直接链接" translate="no">​</a></h4>
<p>The KV Cache Aware plugin (<code>kvcache-aware</code>) routes requests to pods that are most likely to have matching KV cache entries, using token-block based matching with Redis-based distributed coordination. This maximizes cache hits and reduces redundant prefill computation.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">The Kthena Runtime sidecar subscribes to vLLM ZMQ kv-events and writes token block hashes into Redis</li>
<li class="">The router tokenizes incoming prompts, divides them into fixed-size blocks, and hashes each block</li>
<li class="">Redis is queried to find which pods have cached each token block</li>
<li class="">Pods are scored based on consecutive block matches from the beginning of the prompt</li>
<li class="">Requires Redis and the Kthena Runtime sidecar deployed alongside vLLM pods</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="413-lora-affinity-scheduling">4.1.3 LoRA Affinity Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#413-lora-affinity-scheduling" class="hash-link" aria-label="4.1.3 LoRA Affinity Scheduling的直接链接" title="4.1.3 LoRA Affinity Scheduling的直接链接" translate="no">​</a></h4>
<p>LoRA (Low-Rank Adaptation) adapters enable fine-tuned model behavior without redeploying base models. However, loading and unloading adapters introduces latency. The LoRA Affinity plugin minimizes this overhead.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">Tracks which LoRA adapters are currently loaded on each pod</li>
<li class="">Routes requests requiring a specific LoRA to pods that already have it loaded</li>
<li class="">Falls back to pods with available adapter slots if no pods have the adapter cached</li>
<li class="">Reduces adapter swap latency from hundreds of milliseconds to near-zero</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="414-least-latency-scheduling">4.1.4 Least Latency Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#414-least-latency-scheduling" class="hash-link" aria-label="4.1.4 Least Latency Scheduling的直接链接" title="4.1.4 Least Latency Scheduling的直接链接" translate="no">​</a></h4>
<p>The Least Latency plugin routes requests to the fastest available pods based on real-time latency metrics.</p>
<p><strong>Metrics considered</strong>:</p>
<ul>
<li class=""><strong>TTFT (Time To First Token)</strong>: Important for streaming responses and user-perceived latency</li>
<li class=""><strong>TPOT (Time Per Output Token)</strong>: Critical for overall generation speed</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="415-least-request-scheduling">4.1.5 Least Request Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#415-least-request-scheduling" class="hash-link" aria-label="4.1.5 Least Request Scheduling的直接链接" title="4.1.5 Least Request Scheduling的直接链接" translate="no">​</a></h4>
<p>The Least Request plugin considers the number of requests waiting to be processed and the number of requests running to route to the least busy pods.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">Monitors the <code>num_requests_running</code> and <code>num_requests_waiting</code> metrics from inference engines</li>
<li class="">Calculates total pending work for each pod</li>
<li class="">Routes new requests to the least busy pod</li>
<li class="">Prevents hot-spotting and ensures even load distribution</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="416-plugin-configurations">4.1.6 Plugin Configurations<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#416-plugin-configurations" class="hash-link" aria-label="4.1.6 Plugin Configurations的直接链接" title="4.1.6 Plugin Configurations的直接链接" translate="no">​</a></h4>
<p>These plugins work together through the scheduler framework. You can configure which plugins are enabled and their relative weights through the router configuration.</p>
<p>The scheduler framework runs enabled plugins in sequence:</p>
<ol>
<li class=""><strong>Filtering</strong>: Plugins eliminate unsuitable pods (e.g., insufficient cache, wrong LoRA)</li>
<li class=""><strong>Scoring</strong>: Plugins score remaining pods based on their criteria</li>
<li class=""><strong>Selection</strong>: The highest-scoring pod(s) are selected for the request</li>
</ol>
<p>This composable architecture allows you to tailor routing behavior to your specific workload requirements.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-fairness-scheduling">4.2 Fairness Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#42-fairness-scheduling" class="hash-link" aria-label="4.2 Fairness Scheduling的直接链接" title="4.2 Fairness Scheduling的直接链接" translate="no">​</a></h3>
<p>The Fairness Scheduling ensures equitable resource allocation across users based on token consumption history.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">Tracks cumulative token usage (input + output) per user per model</li>
<li class="">Assigns request priority inversely proportional to historical usage</li>
<li class="">Queues requests and processes them in priority order</li>
<li class="">Prevents any single user from monopolizing resources</li>
</ul>
<p><strong>Use cases</strong>:</p>
<ul>
<li class="">Multi-tenant platforms with shared infrastructure</li>
<li class="">Research clusters with fair-share policies</li>
<li class="">SLA-driven systems requiring usage-based throttling</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-prefill-decode-disaggregation-support">4.3 Prefill-Decode Disaggregation Support<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#43-prefill-decode-disaggregation-support" class="hash-link" aria-label="4.3 Prefill-Decode Disaggregation Support的直接链接" title="4.3 Prefill-Decode Disaggregation Support的直接链接" translate="no">​</a></h3>
<p>For advanced deployment patterns, Kthena Router natively supports prefill-decode disaggregation (xPyD), where the compute-intensive prefill phase is separated from the token generation decode phase.</p>
<p><strong>How it works</strong>:</p>
<ul>
<li class="">Identifies PD group configurations from ModelServer CRDs</li>
<li class="">Routes prefill requests to prefill-optimized pods</li>
<li class="">Transfers KV cache state via configurable connectors (HTTP, Redis, etc.)</li>
<li class="">Routes decode requests to decode-optimized pods</li>
<li class="">Coordinates the two-phase process transparently to the client</li>
</ul>
<p><strong>Benefits</strong>:</p>
<ul>
<li class="">Optimizes hardware utilization by matching workload characteristics to hardware</li>
<li class="">Reduces latency by using specialized hardware for each phase</li>
<li class="">Improves cost-efficiency through better resource allocation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="44-token-based-rate-limiting">4.4 Token-Based Rate Limiting<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#44-token-based-rate-limiting" class="hash-link" aria-label="4.4 Token-Based Rate Limiting的直接链接" title="4.4 Token-Based Rate Limiting的直接链接" translate="no">​</a></h3>
<p>Kthena Router provides comprehensive rate limiting capabilities to protect your inference infrastructure from overload and ensure fair resource allocation across users.</p>
<ul>
<li class=""><strong>Input Token Limits</strong>: Control the rate of incoming prompt tokens per user or API key</li>
<li class=""><strong>Output Token Limits</strong>: Limit generated tokens to manage compute costs</li>
<li class=""><strong>Local Rate Limits</strong>: Enforces a limit on a per-router-instance basis.</li>
<li class=""><strong>Global Rate Limits</strong>: Enforces a shared limit across all router instances, using a central store like Redis.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="45-observability">4.5 Observability<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#45-observability" class="hash-link" aria-label="4.5 Observability的直接链接" title="4.5 Observability的直接链接" translate="no">​</a></h3>
<p>Kthena Router provides comprehensive observability capabilities designed for production LLM serving:</p>
<ul>
<li class=""><strong>Metrics</strong>: Exposes detailed metrics including request latency, token consumption, scheduler plugin performance, and rate limiting statistics at <code>/metrics</code> endpoint</li>
<li class=""><strong>Structured Access Logs</strong>: Records complete request lifecycle with routing decisions, timing breakdowns, and token tracking in JSON or text format</li>
<li class=""><strong>Debug Endpoints</strong>: Provides <code>/debug/config_dump/*</code> APIs to inspect internal state, ModelRoute/ModelServer configurations, and real-time pod metrics</li>
<li class=""><strong>Standard Integration</strong>: Seamlessly works with Prometheus, Grafana, ELK, and other observability stacks for monitoring, alerting, and troubleshooting</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-performance">5. Performance<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#5-performance" class="hash-link" aria-label="5. Performance的直接链接" title="5. Performance的直接链接" translate="no">​</a></h2>
<p>The <strong>ScorePlugin</strong> module in <strong>Kthena Router</strong> leverages a configurable, pluggable architecture to enable multi-dimensional scoring and intelligent routing of inference requests.To demonstrate the impact of intelligent scheduling, we construct a standardized benchmarking environment based on the <strong>DeepSeek-R1-Distill-Qwen-7B</strong> model to evaluate the performance of different scheduling strategies under both long and short system prompt scenarios.</p>
<p>Experimental results demonstrate that in <strong>long system prompt scenarios</strong>, the <strong>KVCacheAware Plugin + Least Request Plugin</strong> combination achieves <strong>2.73× higher throughput</strong> and reduces <strong>TTFT latency by 73.5%</strong>, significantly optimizing overall inference service performance and validating the core value of cache-aware scheduling for large-scale model inference.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-experimental-setup">5.1 Experimental Setup<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#51-experimental-setup" class="hash-link" aria-label="5.1 Experimental Setup的直接链接" title="5.1 Experimental Setup的直接链接" translate="no">​</a></h3>
<p>A standardized benchmarking environment was built using the <strong>DeepSeek-R1-Distill-Qwen-7B</strong> model to evaluate the performance of different scheduling strategies.</p>
<p><strong>Table 1: Experimental Environment Configuration</strong></p>
<table><thead><tr><th style="text-align:left">Parameter</th><th style="text-align:left">Value</th></tr></thead><tbody><tr><td style="text-align:left">Model</td><td style="text-align:left">deepseek-ai/DeepSeek-R1-Distill-Qwen-7B</td></tr><tr><td style="text-align:left">Block size</td><td style="text-align:left">128</td></tr><tr><td style="text-align:left">Max model length</td><td style="text-align:left">32,768</td></tr><tr><td style="text-align:left">Max batch token count</td><td style="text-align:left">65,536</td></tr><tr><td style="text-align:left">Replicas</td><td style="text-align:left">3</td></tr><tr><td style="text-align:left">GPU memory utilization</td><td style="text-align:left">0.9</td></tr><tr><td style="text-align:left">Max sequence count</td><td style="text-align:left">256</td></tr><tr><td style="text-align:left">Dataset</td><td style="text-align:left">generated-shared-prefix</td></tr><tr><td style="text-align:left">Request groups</td><td style="text-align:left">256</td></tr><tr><td style="text-align:left">Requests per group</td><td style="text-align:left">32</td></tr><tr><td style="text-align:left">Request rate</td><td style="text-align:left">800 req/s</td></tr><tr><td style="text-align:left">Max concurrency</td><td style="text-align:left">300</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-long-system-prompt-scenario-4096-tokens">5.2 Long System Prompt Scenario (4096 tokens)<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#52-long-system-prompt-scenario-4096-tokens" class="hash-link" aria-label="5.2 Long System Prompt Scenario (4096 tokens)的直接链接" title="5.2 Long System Prompt Scenario (4096 tokens)的直接链接" translate="no">​</a></h3>
<p><strong>Table 2: Performance Metrics – Long Prompt</strong></p>
<table><thead><tr><th style="text-align:left">Plugin Configuration</th><th style="text-align:center">Runs</th><th style="text-align:center">Success Rate (%)</th><th style="text-align:center">Throughput (req/s)</th><th style="text-align:center">Latency (s)</th><th style="text-align:center">TTFT (s)</th></tr></thead><tbody><tr><td style="text-align:left">Least Request + KVCacheAware</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center"><strong>32.22</strong></td><td style="text-align:center"><strong>9.22</strong></td><td style="text-align:center"><strong>0.57</strong></td></tr><tr><td style="text-align:left">Least Request + Prefix Cache</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">23.87</td><td style="text-align:center">12.47</td><td style="text-align:center">0.83</td></tr><tr><td style="text-align:left">Random</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">11.81</td><td style="text-align:center">25.23</td><td style="text-align:center">2.15</td></tr><tr><td style="text-align:left">Least Request</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.86</td><td style="text-align:center">30.13</td><td style="text-align:center">12.46</td></tr><tr><td style="text-align:left">GPU Usage</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.56</td><td style="text-align:center">30.92</td><td style="text-align:center">13.14</td></tr><tr><td style="text-align:left">Least Latency</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.47</td><td style="text-align:center">31.44</td><td style="text-align:center">11.07</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-conclusion">6. Conclusion<a href="https://kthena.volcano.sh/zh-Hans/blog/router-blog-post#6-conclusion" class="hash-link" aria-label="6. Conclusion的直接链接" title="6. Conclusion的直接链接" translate="no">​</a></h2>
<p>Kthena Router represents a significant leap forward in LLM serving infrastructure. By moving beyond simple load balancing to model-aware, metrics-driven routing, it unlocks substantial performance improvements and cost savings that were previously unattainable.</p>
<p>It is open source and available today. The <a href="https://volcano-sh.github.io/kthena/" target="_blank" rel="noopener noreferrer" class="">documentation</a> provides comprehensive guides for installation, configuration, and deployment. The <a href="https://github.com/volcano-sh/kthena/tree/main/examples/kthena-router" target="_blank" rel="noopener noreferrer" class="">examples directory</a> contains ready-to-use configurations for common scenarios.</p>
<p>Whether you're running a single model or managing a complex multi-tenant LLM platform, Kthena Router provides the intelligent routing capabilities needed to maximize performance, minimize costs, and deliver excellent user experiences.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Deep Dive into Kthena's ModelServing]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post</guid>
            <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#introduction" class="hash-link" aria-label="Introduction的直接链接" title="Introduction的直接链接" translate="no">​</a></h2>
<p>As large models continue to grow exponentially in parameter size, the resource limits of a single virtual or physical machine can no longer meet their demands. To address this challenge, the industry has introduced innovative strategies such as PD-disaggregation deployment and hybrid deployment of large and small models. These approaches have transformed inference execution: instead of a single Pod handling an entire inference task, multiple Pods now often collaborate to complete a single prediction. This multi-Pod collaboration has become a key trend in large model inference deployment.</p>
<p>In practice, inference models may still run within a single Pod (as in traditional single-node scenarios), across a group of identical Pods (for larger models), or among Pods with specialized roles (as in PD-disaggregation deployments). This flexible deployment not only improves resource utilization but also enables more efficient large model inference.</p>
<p><code>ModelServing</code> is a specialized component of <code>Kthena</code> designed to manage and orchestrate the lifecycle of inference model workloads. It can conveniently represent and manage multiple deployment models, such as <code>PD-disaggregation</code>, <code>tensor parallelism</code>, <code>pipeline parallelism</code>, and native model deployment, because of its three-tier architecture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-tier-architecture">Three-tier Architecture<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#three-tier-architecture" class="hash-link" aria-label="Three-tier Architecture的直接链接" title="Three-tier Architecture的直接链接" translate="no">​</a></h2>
<p><code>ModelServing</code> adopts a three-tier architecture <code>ModelServing → ServingGroup → Role</code> to address the limitations of Kubernetes' traditional two-tier architecture (e.g., deployment and statefulSet) in managing diverse inference workload deployment scenarios. The architecture diagram is shown below:</p>
<p><img decoding="async" loading="lazy" alt="ModelServing Architecture" src="https://kthena.volcano.sh/zh-Hans/assets/images/modelServing_architecture-61c47394f1cd25c0df1c9b8fe025149e.svg" class="img_ev3q"></p>
<ul>
<li class=""><strong>ModelServing:</strong> The central component responsible for managing the lifecycle of inference model workloads. It offers a unified interface for deploying and managing inference models, as well as querying their statuses.</li>
<li class=""><strong>ServingGroups:</strong> A <code>ServingGroup</code> is a collection of Roles. Each group can fulfill the whole inference; it includes both Prefill and Decode roles for PD-disaggregation deployment.</li>
<li class=""><strong>Roles:</strong> Each Role within a <code>ServingGroup</code> consists of a group of Pods, which are the actual workloads responsible for executing inference tasks. Each role can be assigned different tasks. For example, in a PD-disaggregation scenario, you can configure a <code>prefill role</code> and a <code>decode role</code>, which is very convenient.</li>
</ul>
<p>For the definition of <code>ModelServing</code>, please refer to the <a href="https://kthena.volcano.sh/docs/next/reference/crd/workload.serving.volcano.sh#modelserving" target="_blank" rel="noopener noreferrer" class="">modelServing CRD reference</a>.</p>
<p>After inference workloads are managed as groups, this approach aligns well with Volcano's gang scheduling and network topology-aware scheduling. However, basic capabilities required for traditional cloud-native workload management—such as rolling updates and scaling—still need to be handled additionally.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gang-scheduling">Gang Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#gang-scheduling" class="hash-link" aria-label="Gang Scheduling的直接链接" title="Gang Scheduling的直接链接" translate="no">​</a></h3>
<p>The Gang scheduling strategy is one of the core scheduling algorithms of the Volcano-Scheduler. It meets the scheduling requirements of “All or nothing” in the scheduling process and avoids the waste of cluster resources caused by arbitrary scheduling of Pod. The Gang scheduler algorithm is to observe whether the scheduled number of Pods meets the minimum number of runs. When the minimum number of runs of Job is satisfied, the scheduling action is executed for all Pods under Job; otherwise, it is not executed.</p>
<p>In Kthena, PodGroups are created based on ModelServing, leveraging Volcano's gang scheduling capabilities through PodGroups. The minTaskMember field specifies the number of pods in each Role that require gang scheduling.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="instance-level-gang-scheduling">Instance-Level Gang Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#instance-level-gang-scheduling" class="hash-link" aria-label="Instance-Level Gang Scheduling的直接链接" title="Instance-Level Gang Scheduling的直接链接" translate="no">​</a></h4>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="creation-process">Creation Process<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#creation-process" class="hash-link" aria-label="Creation Process的直接链接" title="Creation Process的直接链接" translate="no">​</a></h5>
<p>A single PodGroup is created for the entire ServingGroup instance.</p>
<p>This configuration is automatically generated by us, no need to create it manually.</p>
<p><strong>PodGroup Configuration:</strong></p>
<p>Here is a modelServing example:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> workload.serving.volcano.sh/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ModelServing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sample</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schedulerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volcano</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># servingGroup replicas</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restartGracePeriodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">gangPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minRoleReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">prefill</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">decode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prefill</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># ... additional role configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> decode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># ... additional role configuration</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scheduling.volcano.sh/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PodGroup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">modelserving</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">servinggroup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">modelserving</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">modelserving.volcano.sh/name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">modelserving</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">modelserving.volcano.sh/group-name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">modelserving</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">servinggroup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scheduling.k8s.io/group-name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">modelserving</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># MinTaskMember defines minimum pods required for each role replica</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">minTaskMember</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">"prefill-0"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">"decode-0"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># ... additional role replicas</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">minResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Aggregated resource requirements</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ttlSecondsAfterFinished</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">timeout</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Pod Count Calculation:</strong>
If <code>MinRoleReplicas</code> is not configured, the value of <code>minTaskMember</code> is calculated as:</p>
<div class="language-math codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-math codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">minMember = replicas × Σ(role.replicas × (1 + role.workerReplicas))</span><br></span></code></pre></div></div>
<p>Where:</p>
<ul>
<li class=""><code>replicas</code>: Number of ServingGroup instances</li>
<li class=""><code>role.replicas</code>: Number of role instances within each ServingGroup</li>
<li class=""><code>1 + role.workerReplicas</code>: EntryPod + WorkerPods per role instance</li>
</ul>
<p>If <code>MinRoleReplicas</code> is configured, the value of <code>minMember</code> is calculated as:</p>
<p><strong>MinTaskMember Generation Logic:</strong></p>
<ul>
<li class="">For each role specified in MinRoleReplicas map</li>
<li class="">Include role replicas from index 0 up to MinRoleReplicas[roleName] - 1</li>
<li class="">Each role replica entry has value = (1 + role.workerReplicas)</li>
</ul>
<p><strong>Example Configuration:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">gangPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">minRoleReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prefill</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Require at least 2 prefill role replicas</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">decode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># Require at least 1 decode role replica</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rolling-update">Rolling Update<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#rolling-update" class="hash-link" aria-label="Rolling Update的直接链接" title="Rolling Update的直接链接" translate="no">​</a></h3>
<p>Rolling updates represent a critical operational strategy for online services aiming to achieve zero downtime. In the context of LLM inference services, the implementation of rolling updates is important to reduce the risk of service unavailability.</p>
<p>Currently, <code>ModelServing</code> supports rolling upgrades at the <code>ServingGroup</code> level, enabling users to configure <code>Partitions</code> to control the rolling process.</p>
<ul>
<li class="">Partition: Indicates the ordinal at which the <code>ModelServing</code> should be partitioned for updates. During a rolling update, replicas with an ordinal greater than or equal to <code>Partition</code> will be updated. Replicas with an ordinal less than <code>Partition</code> will not be updated.</li>
</ul>
<p>Here's a ModelServing configured with rollout strategy:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rolloutStrategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ServingGroupRollingUpdate</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">rollingUpdateConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">partition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><br></span></code></pre></div></div>
<p>In the following we'll show how rolling update processes for a <code>ModelServing</code> with four replicas. Three Replica status are simulated here:</p>
<ul>
<li class="">✅ Replica has been updated</li>
<li class="">❎ Replica hasn't been updated</li>
<li class="">⏳ Replica is in rolling update</li>
</ul>
<table><thead><tr><th></th><th>R-0</th><th>R-1</th><th>R-2</th><th>R-3</th><th>Note</th></tr></thead><tbody><tr><td>Stage1</td><td>❎</td><td>❎</td><td>❎</td><td>❎</td><td>Before rolling update</td></tr><tr><td>Stage2</td><td>❎</td><td>❎</td><td>❎</td><td>⏳</td><td>Rolling update started, The replica with the highest ordinal (R-3) is updated</td></tr><tr><td>Stage3</td><td>❎</td><td>❎</td><td>⏳</td><td>✅</td><td>R-3 is updated. The next replica (R-2) is now being updated</td></tr><tr><td>Stage4</td><td>❎</td><td>⏳</td><td>✅</td><td>✅</td><td>R-2 is updated. The next replica (R-1) is now being updated</td></tr><tr><td>Stage5</td><td>⏳</td><td>✅</td><td>✅</td><td>✅</td><td>R-1 is updated. The last replica (R-0) is now being updated</td></tr><tr><td>Stage6</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>Update completed. All replicas are on the new version</td></tr></tbody></table>
<p>During a rolling upgrade, the controller deletes and rebuilds the replica with the highest sequence number among the replicas need to be updated. The next replica will not be updated until the new replica is running normally.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scaling">Scaling<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#scaling" class="hash-link" aria-label="Scaling的直接链接" title="Scaling的直接链接" translate="no">​</a></h3>
<p>In cloud-native infrastructure projects, scaling plays a crucial role in resource optimization and cost control, enhancing service availability and quickly response, and simplifying operations management.</p>
<p>In modelServing, as has two layers of resource descriptions, <code>ServingGroup</code> and <code>Role</code>. Therefore, we also support the scale up and scale down of the <code>ServingGroup level</code> and <code>role level</code>.</p>
<p>The handling of scaling and rolling updates at the servingGroup level is similar, with updates applied in reverse order within the replica set.</p>
<p>Role-level scaling enables fine-grained adjustment of replica counts for each Role, such as in PD-disaggregated deployment scenarios. This allows dynamic adjustment of prefill or decode replicas, enabling you to optimize the P/D ratio based on their respective workloads. For example:</p>
<ol>
<li class="">
<p><strong>Long prompt, short output scenarios</strong>: You can increase prefill replicas to handle the computational intensive prompt processing while maintaining fewer decode replicas.</p>
</li>
<li class="">
<p><strong>Short prompt, long output scenarios</strong>: You can increase decode replicas to handle the sequential token generation while maintaining fewer prefill replicas.</p>
</li>
</ol>
<p>This flexible scaling capability ensures optimal resource allocation based on actual workload patterns.</p>
<p>When the <code>role.Replicas</code> is modified, it triggers the Scaling of the role granularity.</p>
<p>When scaling is triggered, the status of the entire <code>ServingGroup</code> is set to scaling, and then the pod creation or deletion process is performed.</p>
<p>After the replicas of pods meets expectations. Then update the status of the ServingGroup based on the status of all the pods in the <code>ServingGroup</code>.</p>
<p>And because the pods in the role are carrying sequential and labeled. All scaling is processed from the last pod.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-scaling-process">Role Scaling Process<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#role-scaling-process" class="hash-link" aria-label="Role Scaling Process的直接链接" title="Role Scaling Process的直接链接" translate="no">​</a></h4>
<table><thead><tr><th></th><th>G-0</th><th>G-1</th><th>G-2</th><th>G-3</th><th>Note</th></tr></thead><tbody><tr><td>Stage1</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>Before scaling up/down</td></tr><tr><td>Stage2</td><td>❎</td><td>❎</td><td>❎</td><td>⏳</td><td>Scaling up/down started, The replica with the highest ordinal (G-3) is start. Creating/Deleting roles in the (G-3)</td></tr><tr><td>Stage3</td><td>❎</td><td>❎</td><td>⏳</td><td>✅</td><td>G-3 is scaled. The roles in next replica (G-2) is now scaling</td></tr><tr><td>Stage4</td><td>❎</td><td>⏳</td><td>✅</td><td>✅</td><td>G-2 is scaled. The roles in next replica (G-1) is now scaling</td></tr><tr><td>Stage5</td><td>⏳</td><td>✅</td><td>✅</td><td>✅</td><td>G-1 is scaled. The roles in last replica (G-0) is now scaling</td></tr><tr><td>Stage6</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>Scale completed.</td></tr></tbody></table>
<p>The overall processing flowchart is shown in the figure.</p>
<p><img decoding="async" loading="lazy" alt="Role Scaling Processing " src="https://kthena.volcano.sh/zh-Hans/assets/images/role_scaling-aadfc9e634ea07bd2b899d34b48a5d8d.svg" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="restart-policy">Restart Policy<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#restart-policy" class="hash-link" aria-label="Restart Policy的直接链接" title="Restart Policy的直接链接" translate="no">​</a></h3>
<p>In <code>ModelServing</code>, the concept of grouping pods is emphasized. As a result, when an error occurs in one pod within a group, the entire group is typically restarted together. However, in production environments, restarting a whole group of pods can require significant resources and time. To address this, <code>ModelServing</code> also provides a restart policy that allows for individual pod restarts.</p>
<ul>
<li class=""><strong>ServingGroupRecreate:</strong> When an error occurs in pods within a group, the entire group is restarted.</li>
<li class=""><strong>RoleRecreate:</strong> When an error occurs in pods within a group, the status of the group is updated to <code>progressing</code> and only the affected pod is restarted. If the <code>serviceGroup</code> remains in the <code>progressing</code> state for a certain period of time, the entire servingGroup will be deleted and recreated.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prospect">Prospect<a href="https://kthena.volcano.sh/zh-Hans/blog/modelserving-blog-post#prospect" class="hash-link" aria-label="Prospect的直接链接" title="Prospect的直接链接" translate="no">​</a></h2>
<p>The current ModelServing is generally able to meet the basic requirements for model workload management and scheduling. However, support for PD-separated scenarios is still limited—for example, features such as PD instance upgrades are not yet fully supported. In future development, we plan to introduce more features specifically for PD-separated scenarios.</p>
<p>If you are interested, we welcome you to join the Kthena community and help build our open-source ecosystem together.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kthena Router ScorePlugin Architecture and Benchmark Analysis]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post</guid>
            <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Abstract]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="abstract">Abstract<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#abstract" class="hash-link" aria-label="Abstract的直接链接" title="Abstract的直接链接" translate="no">​</a></h2>
<p>This paper analyzes the system design and implementation of the <strong>ScorePlugin</strong> module in <strong>Kthena Router</strong>, which leverages a configurable, pluggable architecture to enable multi-dimensional scoring and intelligent routing of inference requests. We provide a detailed examination of the six currently implemented <strong>ScorePlugins</strong>, and construct a standardized benchmarking environment based on the <strong>DeepSeek-R1-Distill-Qwen-7B</strong> model to evaluate the performance of different scheduling strategies under both long and short system prompt scenarios.</p>
<p>Experimental results demonstrate that in <strong>long system prompt scenarios</strong>, the <strong>KVCacheAware Plugin + Least Request Plugin</strong> combination achieves <strong>2.73× higher throughput</strong> and reduces <strong>TTFT latency by 73.5%</strong>, significantly optimizing overall inference service performance and validating the core value of cache-aware scheduling for large-scale model inference.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-introduction">1. Introduction<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#1-introduction" class="hash-link" aria-label="1. Introduction的直接链接" title="1. Introduction的直接链接" translate="no">​</a></h2>
<p>In <strong>LLM inference services</strong>, intelligent request scheduling strategies have a decisive impact on overall system performance. Kthena Router adopts a <strong>score-based scheduling framework</strong> that enables multi-strategy load balancing through an <strong>extensible plugin system</strong>. This paper systematically analyzes the architectural design, core algorithms, and performance characteristics of this scheduling system.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-system-architecture">2. System Architecture<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#2-system-architecture" class="hash-link" aria-label="2. System Architecture的直接链接" title="2. System Architecture的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-core-interface-design">2.1 Core Interface Design<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#21-core-interface-design" class="hash-link" aria-label="2.1 Core Interface Design的直接链接" title="2.1 Core Interface Design的直接链接" translate="no">​</a></h3>
<p>The scheduling system in Kthena Router is built around a unified <strong>ScorePlugin</strong> interface:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> ScorePlugin </span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Score</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pods </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">datastore</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodInfo</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">datastore</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodInfo</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Each plugin generates a <strong>normalized score in the range [0, 100]</strong> for candidate Pods, where higher scores indicate better suitability for the incoming inference request.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-scheduling-execution-pipeline">2.2 Scheduling Execution Pipeline<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#22-scheduling-execution-pipeline" class="hash-link" aria-label="2.2 Scheduling Execution Pipeline的直接链接" title="2.2 Scheduling Execution Pipeline的直接链接" translate="no">​</a></h3>
<p>The scheduler uses a <strong>multi-stage pipeline architecture</strong> consisting of the following steps:</p>
<ol>
<li class=""><strong>Filtering Phase</strong> - Executes resource constraint checks and availability validation through Filter Plugins</li>
<li class=""><strong>Scoring Phase</strong> - Multiple Score Plugins calculate Pod suitability scores in parallel</li>
<li class=""><strong>Weighted Aggregation</strong> - Combines multi-plugin results according to configurable weights</li>
<li class=""><strong>Selection Decision</strong> - Selects the top-N Pods based on the final aggregated score</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-scoreplugin-implementations">3. ScorePlugin Implementations<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#3-scoreplugin-implementations" class="hash-link" aria-label="3. ScorePlugin Implementations的直接链接" title="3. ScorePlugin Implementations的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-gpu-cache-usage-plugin">3.1 GPU Cache Usage Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#31-gpu-cache-usage-plugin" class="hash-link" aria-label="3.1 GPU Cache Usage Plugin的直接链接" title="3.1 GPU Cache Usage Plugin的直接链接" translate="no">​</a></h3>
<p>A resource-aware scheduling strategy based on <strong>GPU cache utilization</strong>.</p>
<p><strong>Algorithm Principles:</strong></p>
<ul>
<li class="">Monitors the <strong>GPU cache usage rate</strong> (<code>GPUCacheUsage</code>) of each Pod in real time</li>
<li class="">Scoring function:<!-- -->
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Score = (1.0 - GPUCacheUsage) × 100</span><br></span></code></pre></div></div>
</li>
<li class="">Prioritizes Pods with <strong>lower GPU cache utilization</strong>, reducing the risk of memory overflow</li>
</ul>
<p><strong>Use Case:</strong> Environments with limited GPU memory availability.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-least-request-plugin">3.2 Least Request Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#32-least-request-plugin" class="hash-link" aria-label="3.2 Least Request Plugin的直接链接" title="3.2 Least Request Plugin的直接链接" translate="no">​</a></h3>
<p>A load-balancing strategy based on <strong>active request queue length</strong>.</p>
<p><strong>Algorithm Principles:</strong></p>
<ul>
<li class=""><strong>Metrics:</strong>
<ul>
<li class="">Running request count: <code>RequestRunningNum</code></li>
<li class="">Waiting queue length: <code>RequestWaitingNum</code></li>
</ul>
</li>
<li class=""><strong>Base load calculation:</strong>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">base = RequestRunningNum + 100 × RequestWaitingNum</span><br></span></code></pre></div></div>
</li>
<li class=""><strong>Normalized score:</strong>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">score = ((maxScore - baseScores[info]) / maxScore) × 100</span><br></span></code></pre></div></div>
</li>
</ul>
<p><strong>Key Design Details:</strong></p>
<ul>
<li class="">Waiting queue weight factor set to <strong>100</strong>, strongly penalizing Pods with backlog accumulation</li>
<li class="">Enables <strong>dynamic load-aware balancing</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-least-latency-plugin">3.3 Least Latency Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#33-least-latency-plugin" class="hash-link" aria-label="3.3 Least Latency Plugin的直接链接" title="3.3 Least Latency Plugin的直接链接" translate="no">​</a></h3>
<p>A performance-oriented scheduling strategy driven by <strong>inference latency metrics</strong>.</p>
<p><strong>Algorithm Principles:</strong></p>
<ul>
<li class=""><strong>Metrics Monitored:</strong>
<ul>
<li class=""><strong>TTFT</strong> (<em>Time To First Token</em>)</li>
<li class=""><strong>TPOT</strong> (<em>Time Per Output Token</em>)</li>
</ul>
</li>
<li class=""><strong>Normalization:</strong>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ScoreTTFT = (MaxTTFT - CurrentTTFT) / (MaxTTFT - MinTTFT) × 100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ScoreTPOT = (MaxTPOT - CurrentTPOT) / (MaxTPOT - MinTPOT) × 100</span><br></span></code></pre></div></div>
</li>
<li class=""><strong>Final weighted score:</strong>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Score = α × ScoreTTFT + (1 - α) × ScoreTPOT</span><br></span></code></pre></div></div>
</li>
</ul>
<p><strong>Configuration:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">TTFTTPOTWeightFactor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># TTFT weight α</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="34-kvcacheaware-plugin">3.4 KVCacheAware Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#34-kvcacheaware-plugin" class="hash-link" aria-label="3.4 KVCacheAware Plugin的直接链接" title="3.4 KVCacheAware Plugin的直接链接" translate="no">​</a></h3>
<p>An advanced <strong>cache-aware scheduling strategy</strong> leveraging <strong>KV cache hit rates</strong>.</p>
<p><strong>Technical Highlights:</strong></p>
<ul>
<li class=""><strong>Token-level semantic matching</strong> with model-specific tokenizers</li>
<li class=""><strong>Distributed cache coordination</strong> via Redis for cross-Pod state synchronization</li>
<li class=""><strong>Optimized contiguous block matching algorithm</strong> to maximize cache hits</li>
</ul>
<p><strong>Algorithm Workflow:</strong></p>
<ol>
<li class="">
<p><strong>Tokenization Stage</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Input → Model-specific Tokenizer → Token Sequence [t₁, t₂, ..., tₙ]</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Block Segmentation</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Token Sequence → Fixed-size Blocks [B₁, B₂, ..., Bₘ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Block size: 128 tokens (configurable)</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Hash Generation</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">For each Bᵢ: Hash(Bᵢ) = SHA256(Bᵢ) → hᵢ</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Distributed Cache Query</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Redis pipeline query:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For each hᵢ → {Pod₁: timestamp₁, Pod₂: timestamp₂, ...}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Contiguous Matching Score</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Score = (Number of contiguous matching blocks / Total blocks) × 100</span><br></span></code></pre></div></div>
</li>
</ol>
<p><strong>Configuration Example:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">blockSizeToHash</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">128</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Token block size</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">maxBlocksToMatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">128</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># Maximum blocks to process</span><br></span></code></pre></div></div>
<p><strong>Redis Key Structure:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Key Pattern: "matrix:kv:block:{model}@{hash}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Value Structure:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "pod-name-1.namespace": "1703123456",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "pod-name-2.namespace": "1703123789"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="35-prefix-cache-plugin">3.5 Prefix Cache Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#35-prefix-cache-plugin" class="hash-link" aria-label="3.5 Prefix Cache Plugin的直接链接" title="3.5 Prefix Cache Plugin的直接链接" translate="no">​</a></h3>
<p>A <strong>prefix-based cache-aware scheduling strategy</strong>.</p>
<p><strong>Architecture Design:</strong></p>
<ul>
<li class=""><strong>Three-level mapping</strong>: <code>Model → Hash → Pod</code></li>
<li class=""><strong>LRU-based cache eviction</strong> for efficient memory management</li>
<li class=""><strong>Top-K prefix matching strategy</strong> to return the top Pods with the longest prefix matches</li>
</ul>
<p><strong>Key Features:</strong></p>
<ul>
<li class="">Byte-level prefix matching algorithm</li>
<li class="">Optimized in-memory LRU implementation</li>
<li class="">Configurable cache capacity and candidate size</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="36-random-plugin">3.6 Random Plugin<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#36-random-plugin" class="hash-link" aria-label="3.6 Random Plugin的直接链接" title="3.6 Random Plugin的直接链接" translate="no">​</a></h3>
<p>A <strong>lightweight random load-balancing strategy</strong>.</p>
<p><strong>Implementation:</strong></p>
<ul>
<li class="">Generates uniformly distributed random scores:<!-- -->
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Score ~ Uniform(0, 100)</span><br></span></code></pre></div></div>
</li>
<li class="">Thread-safe independent random number generator</li>
<li class="">Stateless design ensures long-term balancing behavior</li>
</ul>
<p><strong>Use Cases:</strong></p>
<ul>
<li class="">Mixed workloads without clear patterns</li>
<li class="">Lightweight deployments avoiding complex scheduling overhead</li>
<li class="">Establishing baseline performance comparisons</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-experimental-design-and-performance-evaluation">4. Experimental Design and Performance Evaluation<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#4-experimental-design-and-performance-evaluation" class="hash-link" aria-label="4. Experimental Design and Performance Evaluation的直接链接" title="4. Experimental Design and Performance Evaluation的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-experimental-setup">4.1 Experimental Setup<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#41-experimental-setup" class="hash-link" aria-label="4.1 Experimental Setup的直接链接" title="4.1 Experimental Setup的直接链接" translate="no">​</a></h3>
<p>A standardized benchmarking environment was built using the <strong>DeepSeek-R1-Distill-Qwen-7B</strong> model to evaluate the performance of different scheduling strategies.</p>
<p><strong>Table 1: Experimental Environment Configuration</strong></p>
<table><thead><tr><th style="text-align:left">Parameter</th><th style="text-align:left">Value</th></tr></thead><tbody><tr><td style="text-align:left">Model</td><td style="text-align:left">deepseek-ai/DeepSeek-R1-Distill-Qwen-7B</td></tr><tr><td style="text-align:left">Block size</td><td style="text-align:left">128</td></tr><tr><td style="text-align:left">Max model length</td><td style="text-align:left">32,768</td></tr><tr><td style="text-align:left">Max batch token count</td><td style="text-align:left">65,536</td></tr><tr><td style="text-align:left">Replicas</td><td style="text-align:left">3</td></tr><tr><td style="text-align:left">GPU memory utilization</td><td style="text-align:left">0.9</td></tr><tr><td style="text-align:left">Max sequence count</td><td style="text-align:left">256</td></tr><tr><td style="text-align:left">Dataset</td><td style="text-align:left">generated-shared-prefix</td></tr><tr><td style="text-align:left">Request groups</td><td style="text-align:left">256</td></tr><tr><td style="text-align:left">Requests per group</td><td style="text-align:left">32</td></tr><tr><td style="text-align:left">Request rate</td><td style="text-align:left">800 req/s</td></tr><tr><td style="text-align:left">Max concurrency</td><td style="text-align:left">300</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-long-system-prompt-scenario-4096-tokens">4.2 Long System Prompt Scenario (4096 tokens)<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#42-long-system-prompt-scenario-4096-tokens" class="hash-link" aria-label="4.2 Long System Prompt Scenario (4096 tokens)的直接链接" title="4.2 Long System Prompt Scenario (4096 tokens)的直接链接" translate="no">​</a></h3>
<p><strong>Table 2: Performance Metrics – Long Prompt</strong></p>
<table><thead><tr><th style="text-align:left">Plugin Configuration</th><th style="text-align:center">Runs</th><th style="text-align:center">Success Rate (%)</th><th style="text-align:center">Throughput (req/s)</th><th style="text-align:center">Latency (s)</th><th style="text-align:center">TTFT (s)</th></tr></thead><tbody><tr><td style="text-align:left">Least Request + KVCacheAware</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center"><strong>32.22</strong></td><td style="text-align:center"><strong>9.22</strong></td><td style="text-align:center"><strong>0.57</strong></td></tr><tr><td style="text-align:left">Least Request + Prefix Cache</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">23.87</td><td style="text-align:center">12.47</td><td style="text-align:center">0.83</td></tr><tr><td style="text-align:left">Random</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">11.81</td><td style="text-align:center">25.23</td><td style="text-align:center">2.15</td></tr><tr><td style="text-align:left">Least Request</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.86</td><td style="text-align:center">30.13</td><td style="text-align:center">12.46</td></tr><tr><td style="text-align:left">GPU Usage</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.56</td><td style="text-align:center">30.92</td><td style="text-align:center">13.14</td></tr><tr><td style="text-align:left">Least Latency</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">9.47</td><td style="text-align:center">31.44</td><td style="text-align:center">11.07</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-short-system-prompt-scenario-256-tokens">4.3 Short System Prompt Scenario (256 tokens)<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#43-short-system-prompt-scenario-256-tokens" class="hash-link" aria-label="4.3 Short System Prompt Scenario (256 tokens)的直接链接" title="4.3 Short System Prompt Scenario (256 tokens)的直接链接" translate="no">​</a></h3>
<p><strong>Table 3: Performance Metrics – Short Prompt</strong></p>
<table><thead><tr><th style="text-align:left">Plugin Configuration</th><th style="text-align:center">Runs</th><th style="text-align:center">Success Rate (%)</th><th style="text-align:center">Throughput (req/s)</th><th style="text-align:center">Latency (s)</th><th style="text-align:center">TTFT (s)</th></tr></thead><tbody><tr><td style="text-align:left">Least Request + Prefix Cache</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">8.30</td><td style="text-align:center">35.84</td><td style="text-align:center">11.00</td></tr><tr><td style="text-align:left">Random</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">8.21</td><td style="text-align:center">36.25</td><td style="text-align:center">4.54</td></tr><tr><td style="text-align:left">Least Request + KVCacheAware</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">8.08</td><td style="text-align:center">36.67</td><td style="text-align:center">12.19</td></tr><tr><td style="text-align:left">Least Request</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">7.98</td><td style="text-align:center">37.27</td><td style="text-align:center">13.88</td></tr><tr><td style="text-align:left">GPU Usage</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">7.77</td><td style="text-align:center">38.15</td><td style="text-align:center">15.03</td></tr><tr><td style="text-align:left">Least Latency</td><td style="text-align:center">3</td><td style="text-align:center">100.0</td><td style="text-align:center">7.09</td><td style="text-align:center">41.91</td><td style="text-align:center">15.46</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="44-visualization-of-improvements">4.4 Visualization of Improvements<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#44-visualization-of-improvements" class="hash-link" aria-label="4.4 Visualization of Improvements的直接链接" title="4.4 Visualization of Improvements的直接链接" translate="no">​</a></h3>
<p><strong>Table 4: Performance Gains vs. Baseline (Random Plugin)</strong></p>
<table><thead><tr><th style="text-align:left">Plugin Configuration</th><th style="text-align:center">Throughput Gain</th><th style="text-align:center">TTFT Improvement</th><th style="text-align:center">Latency Reduction</th></tr></thead><tbody><tr><td style="text-align:left">Least Request + KVCacheAware</td><td style="text-align:center"><strong>+173%</strong></td><td style="text-align:center"><strong>-73.5%</strong></td><td style="text-align:center"><strong>-63.5%</strong></td></tr><tr><td style="text-align:left">Least Request + Prefix Cache</td><td style="text-align:center">+102%</td><td style="text-align:center">-61.4%</td><td style="text-align:center">-50.6%</td></tr></tbody></table>
<p>The <strong>KVCacheAware combination strategy</strong> shows <strong>significant superiority</strong> in long prefix scenarios, especially for throughput and TTFT metrics.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-results-and-discussion">5. Results and Discussion<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#5-results-and-discussion" class="hash-link" aria-label="5. Results and Discussion的直接链接" title="5. Results and Discussion的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-advantages-of-cache-aware-strategies">5.1 Advantages of Cache-Aware Strategies<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#51-advantages-of-cache-aware-strategies" class="hash-link" aria-label="5.1 Advantages of Cache-Aware Strategies的直接链接" title="5.1 Advantages of Cache-Aware Strategies的直接链接" translate="no">​</a></h3>
<p>Results clearly demonstrate the performance benefits of cache-aware scheduling for long prompts:</p>
<ul>
<li class=""><strong>Peak throughput</strong> of 32.22 req/s with <strong>KVCacheAware + Least Request</strong>, a <strong>173% improvement</strong> over the Random baseline</li>
<li class=""><strong>TTFT reduction</strong> from 2.15s to 0.57s (<strong>73.5% decrease</strong>)</li>
<li class=""><strong>End-to-end latency</strong> reduced from 25.23s to 9.22s (<strong>63.5% improvement</strong>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-scenario-adaptability">5.2 Scenario Adaptability<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#52-scenario-adaptability" class="hash-link" aria-label="5.2 Scenario Adaptability的直接链接" title="5.2 Scenario Adaptability的直接链接" translate="no">​</a></h3>
<p><strong>Long Prefix Scenario (4096 tokens):</strong></p>
<ul>
<li class="">Cache-aware strategies significantly outperform traditional balancing methods</li>
<li class="">Token-level block matching maximizes cache utilization</li>
<li class="">Distributed cache coordination prevents redundant computations across Pods</li>
</ul>
<p><strong>Short Prefix Scenario (256 tokens):</strong></p>
<ul>
<li class="">Performance differences between strategies are minimal</li>
<li class="">Limited prefix length restricts cache hit opportunities</li>
<li class="">Traditional strategies provide stable results</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="53-design-trade-offs">5.3 Design Trade-Offs<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#53-design-trade-offs" class="hash-link" aria-label="5.3 Design Trade-Offs的直接链接" title="5.3 Design Trade-Offs的直接链接" translate="no">​</a></h3>
<p><strong>Computation Overhead vs. Performance Gains:</strong></p>
<ul>
<li class="">KVCacheAware introduces additional overhead from <strong>tokenization</strong> and <strong>Redis queries</strong></li>
<li class="">In high cache-hit environments, performance gains far outweigh the added cost</li>
<li class="">Recommends <strong>adaptive strategy selection</strong> based on workload characteristics</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-deployment-recommendations">6. Deployment Recommendations<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#6-deployment-recommendations" class="hash-link" aria-label="6. Deployment Recommendations的直接链接" title="6. Deployment Recommendations的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-high-cache-hit-scenarios">6.1 High Cache Hit Scenarios<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#61-high-cache-hit-scenarios" class="hash-link" aria-label="6.1 High Cache Hit Scenarios的直接链接" title="6.1 High Cache Hit Scenarios的直接链接" translate="no">​</a></h3>
<p><strong>Recommended Configuration:</strong> <code>KVCacheAware Plugin + Least Request Plugin</code></p>
<p><strong>Use Cases:</strong></p>
<ul>
<li class="">Customer service chatbots, code generation, and similar structured workloads</li>
<li class="">Multi-turn conversations with long system prompts</li>
<li class="">Template-based content generation services</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-general-load-balancing-scenarios">6.2 General Load-Balancing Scenarios<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#62-general-load-balancing-scenarios" class="hash-link" aria-label="6.2 General Load-Balancing Scenarios的直接链接" title="6.2 General Load-Balancing Scenarios的直接链接" translate="no">​</a></h3>
<p><strong>Recommended Configuration:</strong> <code>Least Request Plugin + Least Latency Plugin</code></p>
<p><strong>Use Cases:</strong></p>
<ul>
<li class="">General-purpose inference services with diverse request patterns</li>
<li class="">Multi-tenant environments requiring fair resource distribution</li>
<li class="">Real-time interactive applications</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="63-resource-constrained-environments">6.3 Resource-Constrained Environments<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#63-resource-constrained-environments" class="hash-link" aria-label="6.3 Resource-Constrained Environments的直接链接" title="6.3 Resource-Constrained Environments的直接链接" translate="no">​</a></h3>
<p><strong>Recommended Configuration:</strong> <code>GPU Cache Usage Plugin</code></p>
<p><strong>Use Cases:</strong></p>
<ul>
<li class="">Edge deployments with limited GPU memory</li>
<li class="">Cost-sensitive cloud environments</li>
<li class="">Scenarios where multiple models share GPU resources</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-conclusion">7. Conclusion<a href="https://kthena.volcano.sh/zh-Hans/blog/scoreplugin-benchmark-blog-post#7-conclusion" class="hash-link" aria-label="7. Conclusion的直接链接" title="7. Conclusion的直接链接" translate="no">​</a></h2>
<p>This paper presents a comprehensive analysis of the Kthena Router ScorePlugin architecture and its performance characteristics. The experimental results validate the effectiveness of cache-aware scheduling strategies, particularly in scenarios with long system prompts where the <strong>KVCacheAware Plugin + Least Request Plugin</strong> combination achieves substantial performance improvements.</p>
<p>Key findings include:</p>
<ol>
<li class=""><strong>Cache-aware strategies provide significant performance benefits</strong> in long prompt scenarios, with up to 173% throughput improvement</li>
<li class=""><strong>Adaptive strategy selection</strong> based on workload characteristics is crucial for optimal performance</li>
<li class=""><strong>The pluggable architecture</strong> enables flexible deployment configurations tailored to specific use cases</li>
</ol>
<p>Future work will focus on developing adaptive scheduling algorithms that can automatically select optimal plugin combinations based on real-time workload analysis and system conditions.</p>
<hr>
<p><em>Document generated on: September 9, 2025</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Volcano Community Launches Kthena Sub-project: Redefining Intelligent LLM Inference]]></title>
            <link>https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post</link>
            <guid>https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post</guid>
            <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we’re excited to announce to global developers and MLOps engineers the arrival of a new sub-project in the Volcano community: Kthena.]]></description>
            <content:encoded><![CDATA[<p>Today, we’re excited to announce to global developers and MLOps engineers the arrival of a new sub-project in the Volcano community: <strong>Kthena</strong>.</p>
<p>Kthena is a cloud-native, high-performance LLM inference routing, orchestration, and scheduling system designed specifically for Kubernetes.
It aims to solve the core challenges of deploying and serving LLMs at scale in production environments. Through its unique features such as <strong>KV Cache-aware scheduling</strong> and <strong>Prefill/Decode separation routing</strong>, Kthena significantly improves GPU resource utilization, reduces inference latency, and provides enterprises with unprecedented flexibility and control.</p>
<p>As a sub-project of Volcano, Kthena is dedicated to helping Volcano expand its boundaries beyond AI training, creating a complete integrated solution for both training and inference.</p>
<p><a href="https://github.com/volcano-sh/kthena" target="_blank" rel="noopener noreferrer" class=""><strong>Project Address</strong></a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-last-mile-challenge-of-production-llm-serving">The "Last Mile" Challenge of Production LLM Serving<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#the-last-mile-challenge-of-production-llm-serving" class="hash-link" aria-label="The &quot;Last Mile&quot; Challenge of Production LLM Serving的直接链接" title="The &quot;Last Mile&quot; Challenge of Production LLM Serving的直接链接" translate="no">​</a></h2>
<p>Large Language Models (LLMs) are reshaping industries at an unprecedented pace, but deploying them efficiently and cost-effectively in production environments—especially on cloud-native platforms based on Kubernetes—remains fraught with difficulties. Developers generally face the following challenges:</p>
<ol>
<li class=""><strong>Low Resource Utilization</strong>: LLM inference, particularly its unique KV Cache mechanism, consumes dynamic and massive amounts of GPU memory. Traditional load balancing typically uses Round-Robin algorithms, which are unaware of these load characteristics, leading to high costs where GPU resources sit idle while requests are queued.</li>
<li class=""><strong>Difficulty Balancing Latency and Throughput</strong>: LLM inference consists of two phases: <strong>Prefill</strong> (processing input prompts) and <strong>Decode</strong> (generating tokens). The former is compute-intensive, while the latter is memory-bound. Scheduling them together often prevents targeted optimization, affecting overall service response speed and throughput. Consequently, Prefill/Decode (PD) separation has become mainstream, but efficient routing and scheduling remains a challenge.</li>
<li class=""><strong>Complex Multi-tenant and Multi-model Management</strong>: In enterprise environments, it is often necessary to serve multiple business units, different model versions, or LoRA-fine-tuned models simultaneously. Implementing fair scheduling, priority management, and dynamic routing is a complex engineering problem; some industry solutions even map AI gateways one-to-one with large models.</li>
<li class=""><strong>Lack of Native Kubernetes Integration</strong>: Many existing solutions are either external systems disconnected from the Kubernetes ecosystem or overly complex, failing to meet the simplicity and operational flexibility required for production-grade use.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kthena-the-intelligent-brain-of-cloud-native-llm-inference">Kthena: The Intelligent Brain of Cloud-Native LLM Inference<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#kthena-the-intelligent-brain-of-cloud-native-llm-inference" class="hash-link" aria-label="Kthena: The Intelligent Brain of Cloud-Native LLM Inference的直接链接" title="Kthena: The Intelligent Brain of Cloud-Native LLM Inference的直接链接" translate="no">​</a></h2>
<p>To overcome these challenges, Kthena was born. It is not intended to replace existing LLM serving frameworks (such as vLLM or SGLang), but rather to serve as an intelligent <strong>traffic hub</strong> and <strong>scheduling center</strong> above them, deeply integrated into Kubernetes.</p>
<div style="text-align:center"><div style="cursor:pointer;max-width:100%;height:auto;display:block"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="710" height="490" style="cursor:pointer;max-width:100%;height:auto" viewBox="0 0 710 490" role="img" aria-label="Kthena Architecture"><g data-cell-id="0"><g data-cell-id="1"><rect width="710" height="490" fill="none" data-cell-id="A46PPQ1vJah-tsPQLF0c-1" pointer-events="all" rx="73.5" ry="73.5" transform="translate(.5 .5)"></rect><g fill="#fff" stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-1" pointer-events="all"><path d="M363 338h267v110H363Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="M358 333h267v110H358Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="M353 328h267v110H353Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><path fill="#fff" stroke="#000" d="M392 47h190v240H392z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-2" pointer-events="all" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><g fill="#fff" stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-3" pointer-events="all"><path d="M40 329h300v120H40Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="M35 324h300v120H35Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="M30 319h300v120H30Z" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><rect width="160" height="210" x="110" y="70" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="8 8" data-cell-id="eg_l4AwgF5NDo5iZh6fF-4" pointer-events="all" rx="24" ry="24" style="fill:light-dark(#d5e8d4,#1f2f1e);stroke:light-dark(#82b366,#446e2c)" transform="translate(.5 .5)"></rect><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-5"><path fill="none" d="M190 50v54.45" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m190 109.7-3.5-7 3.5 1.75 3.5-1.75Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-6"><path fill="none" d="M191.5 40.5h70v30h-70z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:55px;margin-left:226px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap">Request</div></div></div></foreignObject><text x="226" y="59" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Request</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-7"><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-8"><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-9"><path fill="#fff2cc" stroke="#d6b656" d="M41 325h120v60H41z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-10" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><path fill="#e1d5e7" stroke="#9673a6" d="M41 385h120v30H41z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-11" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path></g></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-12"><path fill="#fff2cc" stroke="#d6b656" d="M49 337h120v60H49z" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:367px;margin-left:50px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Prefill Worker</div></div></div></foreignObject><text x="109" y="371" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Prefill Worker</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-13"><path fill="#e1d5e7" stroke="#9673a6" d="M49 397h120v30H49z" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:412px;margin-left:50px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">runtime<div>（metrics, kv event）</div></div></div></div></foreignObject><text x="109" y="416" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">runtime...</text></switch></g></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-14"><path fill="none" d="M582.5 98.5h90v30h-90z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:113px;margin-left:627px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap"><font style="font-size:10px">ModelBooster</font><span style="font-size:10px;background-color:transparent;color:light-dark(#000,#fff)"></span></div></div></div></foreignObject><text x="627" y="117" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">ModelBooster&nbsp;</text></switch></g><g stroke="#000" data-cell-id="eg_l4AwgF5NDo5iZh6fF-15" pointer-events="all" transform="translate(.5 .5)"><ellipse cx="170" cy="40.23" fill="#fff" rx="5" ry="4.228" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)"></ellipse><path fill="none" stroke-miterlimit="10" d="M170 44.45v14.1m0-11.28h-10m10 0h10m-10 11.28-10 11.27m10-11.27 10 11.27" style="stroke:light-dark(#000,#fff)"></path></g><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-17"><path fill="none" d="m190 251.18-76.63 81.19" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m109.77 336.19 2.26-7.5 1.34 3.68 3.75 1.13Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-29" pointer-events="all"><path fill="#fff" d="M623.82 54.03c-.44.02-.88.13-1.26.33l-17.19 8.19c-.9.44-1.56 1.26-1.78 2.22l-4.25 18.45c-.19.85-.03 1.76.44 2.5.08.08.14.16.19.27l11.9 14.78c.63.76 1.59 1.23 2.58 1.23h19.08c.98 0 1.94-.47 2.57-1.23L648 85.96c.6-.76.85-1.78.63-2.74l-4.25-18.45c-.22-.96-.88-1.78-1.78-2.22l-17.19-8.19c-.49-.25-1.04-.36-1.59-.33" style="fill:light-dark(#fff,#121212)" transform="translate(.5 .5)"></path><path fill="#2875e2" d="M623.83 55.47c-.41.02-.82.12-1.18.3l-16.16 7.71c-.85.41-1.47 1.18-1.67 2.09l-4 17.34c-.18.8-.02 1.65.41 2.34.08.08.13.16.18.26L612.6 99.4c.59.72 1.49 1.16 2.42 1.16h17.93c.93 0 1.83-.44 2.43-1.16l11.18-13.91c.57-.73.8-1.68.59-2.58l-3.99-17.34c-.21-.91-.83-1.68-1.68-2.09l-16.15-7.71c-.47-.23-.98-.33-1.5-.3" style="fill:light-dark(#2875e2,#5597f5)" transform="translate(.5 .5)"></path><path fill="#fff" d="M637.37 77.31h-2.06v-5.48c0-1.51-1.23-2.74-2.74-2.74h-5.48v-2.06c0-1.89-1.54-3.43-3.43-3.43s-3.43 1.54-3.43 3.43v2.06h-5.49c-1.5 0-2.73 1.23-2.73 2.74v5.21h2.05c2.04.01 3.69 1.66 3.7 3.7 0 2.04-1.66 3.7-3.7 3.7H612v5.22c0 1.5 1.24 2.74 2.74 2.74h5.21v-2.06c.01-2.04 1.66-3.7 3.71-3.7 2.04 0 3.69 1.66 3.7 3.7v2.06h5.21a2.75 2.75 0 0 0 2.74-2.74v-5.49h2.06a3.43 3.43 0 1 0 0-6.86" style="fill:light-dark(#fff,#121212)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-30"><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-31"><path fill="#fff2cc" stroke="#d6b656" d="M190 325h120v60H190z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-32" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><path fill="#e1d5e7" stroke="#9673a6" d="M190 385h120v30H190z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-33" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path></g><path fill="#fff2cc" stroke="#d6b656" d="M195 330h120v60H195z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-34" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><path fill="#e1d5e7" stroke="#9673a6" d="M195 390h120v30H195z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-35" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-36"><path fill="#fff2cc" stroke="#d6b656" d="M200 335h120v60H200z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-37" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><path fill="#e1d5e7" stroke="#9673a6" d="M200 395h120v30H200z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-38" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-39"><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-40"><path fill="#fff2cc" stroke="#d6b656" d="M205 340h120v60H205z" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:370px;margin-left:206px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Decode Worker</div></div></div></foreignObject><text x="265" y="374" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Decode Worker</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-41"><path fill="#e1d5e7" stroke="#9673a6" d="M205 400h120v30H205z" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:415px;margin-left:206px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">runtime<div>（metrics, kv event）</div></div></div></div></foreignObject><text x="265" y="419" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">runtime...</text></switch></g></g></g></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-42"><path fill="none" d="M169 367h19.63" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m193.88 367-7 3.5 1.75-3.5-1.75-3.5Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-43"><path fill="none" d="m190 251.18 69.81 81.27" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m263.23 336.43-7.21-3.03 3.79-.95 1.52-3.61Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-44"><path fill="none" d="M190.5 76.32h110v30h-110z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:91px;margin-left:245px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap"><font style="font-size:14px">Kthena-router</font></div></div></div></foreignObject><text x="245" y="94" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Kthena-router</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-45"><rect width="141" height="40" x="416.5" y="93" fill="#f8cecc" stroke="#b85450" pointer-events="all" rx="6" ry="6" style="fill:light-dark(#f8cecc,#512d2b);stroke:light-dark(#b85450,#d7817e)" transform="translate(.5 .5)"></rect><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:139px;height:1px;padding-top:113px;margin-left:418px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">model-booster<div>controller</div></div></div></div></foreignObject><text x="487" y="117" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">model-booster...</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-46"><rect width="141" height="40" x="416.5" y="161" fill="#f8cecc" stroke="#b85450" pointer-events="all" rx="6" ry="6" style="fill:light-dark(#f8cecc,#512d2b);stroke:light-dark(#b85450,#d7817e)" transform="translate(.5 .5)"></rect><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:139px;height:1px;padding-top:181px;margin-left:418px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">model-autoscaler</div></div></div></foreignObject><text x="487" y="185" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">model-autoscaler</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-47"><rect width="140" height="40" x="416.5" y="230" fill="#f8cecc" stroke="#b85450" pointer-events="all" rx="6" ry="6" style="fill:light-dark(#f8cecc,#512d2b);stroke:light-dark(#b85450,#d7817e)" transform="translate(.5 .5)"></rect><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:138px;height:1px;padding-top:250px;margin-left:418px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">model-serving<div>controller</div></div></div></div></foreignObject><text x="487" y="254" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">model-serving...</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-48"><path fill="none" d="M392.5 53.5h190v30h-190z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:68px;margin-left:487px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap"><font style="font-size:14px">Kthena-controller-manager</font></div></div></div></foreignObject><text x="487" y="72" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Kthena-controller-manager</text></switch></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-49"><path fill="none" d="m392 287-51.66 33.53" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m335.94 323.39 3.96-6.75.44 3.89 3.37 1.99Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-50"><path fill="none" d="m487 287 60.13 48.03" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m551.24 338.3-7.66-1.63 3.55-1.64.82-3.83Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-51"><path fill="none" d="m487 287-38.46 47.07" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m445.22 338.13 1.72-7.63 1.6 3.57 3.82.86Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-52"><path fill="#fff" stroke="#000" d="M130 110.82h120v35.09H130z" pointer-events="all" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:128px;margin-left:131px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal"><font style="font-size:10px">Token RateLimit</font></div></div></div></foreignObject><text x="190" y="132" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Token RateLimit</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-53"><path fill="#fff" stroke="#000" d="M130 163.45h120v35.09H130z" pointer-events="all" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:181px;margin-left:131px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal"><font style="font-size:10px">Fairness Scheduling</font></div></div></div></foreignObject><text x="190" y="185" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Fairness Scheduling</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-54"><path fill="#fff" stroke="#000" d="M130 216.09h120v35.09H130z" pointer-events="all" style="fill:light-dark(#fff,var(--ge-dark-color, #121212));stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:234px;margin-left:131px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal"><font style="font-size:10px">Load Balancing</font></div></div></div></foreignObject><text x="190" y="237" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Load Balancing</text></switch></g><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-57"><path fill="none" d="M189.9 145.91v11.63" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m189.9 162.79-3.5-7 3.5 1.75 3.5-1.75Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-58"><path fill="none" d="M189.9 198.54v11.63" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m189.9 215.42-3.5-7 3.5 1.75 3.5-1.75Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-59"><path fill="none" d="M582.5 234.5h90v30h-90z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:249px;margin-left:627px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap"><font style="font-size:10px">ModelServing</font><span style="font-size:10px;background-color:transparent;color:light-dark(#000,#fff)"></span></div></div></div></foreignObject><text x="627" y="253" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">ModelServing&nbsp;</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-60"><path fill="#fff2cc" stroke="#d6b656" d="M492.11 339h120v60h-120z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-61" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-62"><path fill="#e1d5e7" stroke="#9673a6" d="M492.11 399h120v30h-120z" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:414px;margin-left:493px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">runtime<div>（metrics, kv event）</div></div></div></div></foreignObject><text x="552" y="418" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">runtime...</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-63"><ellipse cx="524.61" cy="374" fill="#ffe6cc" stroke="#d79b00" pointer-events="all" rx="17.5" ry="15" style="fill:light-dark(#ffe6cc,#36210a);stroke:light-dark(#d79b00,#996500)" transform="translate(.5 .5)"></ellipse><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:33px;height:1px;padding-top:374px;margin-left:508px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Lora2</div></div></div></foreignObject><text x="525" y="378" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Lora2</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-64"><ellipse cx="574.61" cy="374" fill="#f5f5f5" stroke="#666" pointer-events="all" rx="17.5" ry="15" style="fill:light-dark(#f5f5f5,#1a1a1a);stroke:light-dark(#666,#959595)" transform="translate(.5 .5)"></ellipse><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:33px;height:1px;padding-top:374px;margin-left:558px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#333"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#333,#c1c1c1);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Lora4</div></div></div></foreignObject><text x="575" y="378" fill="#333" font-family="Helvetica" font-size="12" text-anchor="middle">Lora4</text></switch></g></g><path fill="#fff2cc" stroke="#d6b656" d="M360 339h120v60H360z" data-cell-id="eg_l4AwgF5NDo5iZh6fF-65" pointer-events="all" style="fill:light-dark(#fff2cc,#281d00);stroke:light-dark(#d6b656,#6d5100)" transform="translate(.5 .5)"></path><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-66"><path fill="#e1d5e7" stroke="#9673a6" d="M360 399h120v30H360z" pointer-events="all" style="fill:light-dark(#e1d5e7,#392f3f);stroke:light-dark(#9673a6,#9577a3)" transform="translate(.5 .5)"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:118px;height:1px;padding-top:414px;margin-left:361px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">runtime<div>（metrics, kv event）</div></div></div></div></foreignObject><text x="420" y="418" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">runtime...</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-67"><ellipse cx="392.5" cy="374" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" rx="17.5" ry="15" style="fill:light-dark(#dae8fc,#1d293b);stroke:light-dark(#6c8ebf,#5c79a3)" transform="translate(.5 .5)"></ellipse><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:33px;height:1px;padding-top:374px;margin-left:376px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Lora1</div></div></div></foreignObject><text x="393" y="378" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Lora1</text></switch></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-68"><ellipse cx="442.5" cy="374" fill="#d5e8d4" stroke="#82b366" pointer-events="all" rx="17.5" ry="15" style="fill:light-dark(#d5e8d4,#1f2f1e);stroke:light-dark(#82b366,#446e2c)" transform="translate(.5 .5)"></ellipse><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:33px;height:1px;padding-top:374px;margin-left:426px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:normal;word-wrap:normal">Lora3</div></div></div></foreignObject><text x="443" y="378" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Lora3</text></switch></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-69"><path fill="none" d="M589.02 113h-25.15" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m558.62 113 7-3.5-1.75 3.5 1.75 3.5Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-70"><path fill="none" d="M588.5 180.76h-24.63" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m558.62 180.76 7-3.5-1.75 3.5 1.75 3.5Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g data-cell-id="eg_l4AwgF5NDo5iZh6fF-71"><path fill="none" d="M582.5 165.5h100v30h-100z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:1px;height:1px;padding-top:180px;margin-left:632px"><div style="box-sizing:border-box;font-size:0;text-align:center;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;white-space:nowrap"><span style="font-size:10px">AutoScalingPolicy</span></div></div></div></foreignObject><text x="632" y="184" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">AutoScalingPolicy</text></switch></g><g stroke="#000" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-72"><path fill="none" d="M588.5 249.76h-24.63" pointer-events="stroke" style="stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path><path d="m558.62 249.76 7-3.5-1.75 3.5 1.75 3.5Z" pointer-events="all" style="fill:light-dark(#000,#fff);stroke:light-dark(#000,#fff)" transform="translate(.5 .5)"></path></g><g stroke="#388f05" stroke-miterlimit="10" data-cell-id="eg_l4AwgF5NDo5iZh6fF-73"><path fill="none" d="m190 250 184.83 109.98" pointer-events="stroke" style="stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path><path fill="#388f05" d="m379.35 362.67-7.81-.57 3.29-2.12.29-3.9Z" pointer-events="all" style="fill:light-dark(#388f05,#446e2c);stroke:light-dark(#388f05,#446e2c)" transform="translate(.5 .5)"></path></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"></g><a xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" transform="translate(0 -5)"><text x="50%" y="100%" font-size="10" text-anchor="middle">Text is not SVG - cannot display</text></a></switch></svg></div></div>
<p>Kthena consists of two major components:</p>
<ol>
<li class="">
<p><strong>Kthena Router</strong>: An independent, high-performance multi-model router responsible for receiving inference requests and intelligently distributing them to backend <code>ModelServer</code> instances based on <code>ModelRoute</code> rules.</p>
</li>
<li class="">
<p><strong>Kthena Controller Manager</strong>: A controller in the Kubernetes control plane, composed of multiple controllers responsible for orchestration and lifecycle management of LLM workloads. It continuously reconciles and links multiple CRDs (such as <code>ModelBooster</code>, <code>ModelServing</code>, <code>AutoScalingPolicy</code>/<code>AutoScalingPolicyBinding</code>, and <code>ModelRoute</code>/<code>ModelServer</code>) to transform declarative APIs into runtime resources.</p>
</li>
</ol>
<p>The <code>ModelServing</code> controller orchestrates <code>ServingGroup</code> and <code>Prefill/Decode</code> role groupings; supports topology-aware scheduling, Gang scheduling, rolling upgrades, and fault recovery; and implements elastic scaling based on <code>AutoScalingPolicy</code>.</p>
<p>This architecture makes Kthena a highly programmable bridge connecting user requests with LLM inference backends.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-features-and-advantages">Core Features and Advantages<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#core-features-and-advantages" class="hash-link" aria-label="Core Features and Advantages的直接链接" title="Core Features and Advantages的直接链接" translate="no">​</a></h2>
<p>Kthena’s strength lies in its core capabilities specifically designed for LLM inference scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-production-grade-inference-orchestration-modelserving">1) Production-Grade Inference Orchestration (ModelServing)<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#1-production-grade-inference-orchestration-modelserving" class="hash-link" aria-label="1) Production-Grade Inference Orchestration (ModelServing)的直接链接" title="1) Production-Grade Inference Orchestration (ModelServing)的直接链接" translate="no">​</a></h3>
<div style="text-align:center"><div style="cursor:pointer;max-width:100%;height:auto;display:block"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1070" height="800" style="cursor:pointer;max-width:100%;height:auto" viewBox="-0.5 -0.5 1070 800" role="img" aria-label="Kthena Model Serving Orchestration diagram"><g data-cell-id="0"><g data-cell-id="1"><path fill="none" d="M0 0h1070v800H0z" data-cell-id="ZhhZtuA4D7QY7-U0jjTq-78" pointer-events="all"></path><g data-cell-id="2"><path fill="none" d="M190 595h225v146H190z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M211 595h203v125H211V595" data-cell-id="3" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M200 605h203v125H200V605" data-cell-id="4" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M190 616h203v125H190V616" data-cell-id="5" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="6"><path fill="none" d="M190 266h225v146H190z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M211 266h203v125H211V266" data-cell-id="7" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M200 276h203v125H200V276" data-cell-id="8" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M190 287h203v125H190V287" data-cell-id="9" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="10"><path fill="#fee599" d="M360 97h250V35H360z" pointer-events="all" style="fill:light-dark(#fee599,#3e2900)"></path><g data-cell-id="11"><path fill="none" d="M361.41 35h247.18v62H361.41z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:249px;height:1px;padding-top:66px;margin-left:360px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:247px;max-height:62px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:25.4px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Model Serving<br></font></p></div></div></div></div></foreignObject><text x="485" y="70" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Model Serving
</text></switch></g></g><g data-cell-id="12"><path fill="#fee599" d="M160 231h250v-62H160z" pointer-events="all" style="fill:light-dark(#fee599,#3e2900)"></path><g data-cell-id="13"><path fill="none" d="M161.41 169h247.18v62H161.41z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:249px;height:1px;padding-top:200px;margin-left:160px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:247px;max-height:62px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:22.58px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Group 0<br></font></p></div></div></div></div></foreignObject><text x="285" y="204" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Group 0
</text></switch></g></g><g data-cell-id="14"><path fill="none" d="M247 334h100v-40H247z" pointer-events="all"></path><g data-cell-id="15"><path fill="none" d="M248.41 294h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:314px;margin-left:247px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role A<br></font></p></div></div></div></div></foreignObject><text x="297" y="318" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role A
</text></switch></g></g><g data-cell-id="16"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M195 390h86v-46h-86v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="17"><path fill="none" d="M196.41 343.94h83.55V390h-83.55z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:86px;height:1px;padding-top:367px;margin-left:195px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:84px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry<br>pod<br></font></p></div></div></div></div></foreignObject><text x="238" y="371" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry...</text></switch></g></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="71"><path fill="none" d="M182.76 339H60V199" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m187.76 339-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="72"><path fill="none" d="M182.76 518H60V339" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m187.76 518-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="73"><path fill="none" d="M182.76 685H60V489" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m187.76 685-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="74"><path fill="none" d="m480 97-181.24 69.41" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m294.09 168.2 3.77-4.12 1.79 4.67Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="75"><path fill="none" d="m482 97 211.13 69.73" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m697.88 168.3-5.53.8 1.56-4.74Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g data-cell-id="18"><path fill="#d7e3bf" stroke="#000" stroke-dasharray="3 3" stroke-miterlimit="10" d="M306 390h77v-46h-77v46" pointer-events="all" style="fill:light-dark(#d7e3bf,#293314);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="19"><path fill="none" d="M307.41 343.94h74.96V390h-74.96z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:77px;height:1px;padding-top:367px;margin-left:306px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:75px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">worker<br>pod<br></font></p></div></div></div></div></foreignObject><text x="345" y="371" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">worker...</text></switch></g></g><g data-cell-id="20"><path fill="#d7e3bf" stroke="#000" stroke-dasharray="3 3" stroke-miterlimit="10" d="M308 728h76v-46h-76v46" pointer-events="all" style="fill:light-dark(#d7e3bf,#293314);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="21"><path fill="none" d="M309.41 681.94h73.18V728h-73.18z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:75px;height:1px;padding-top:705px;margin-left:308px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:73px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">worker<br>pod<br></font></p></div></div></div></div></foreignObject><text x="346" y="709" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">worker...</text></switch></g></g><g data-cell-id="22"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M211 728h84v-46h-84v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="23"><path fill="none" d="M212.41 681.94h81.58V728h-81.58z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:84px;height:1px;padding-top:705px;margin-left:211px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:82px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry<br>pod<br></font></p></div></div></div></div></foreignObject><text x="253" y="709" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry...</text></switch></g></g><g data-cell-id="24"><path fill="none" d="M190 429h225v146H190z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M211 429h203v125H211V429" data-cell-id="25" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M200 439h203v125H200V439" data-cell-id="26" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M190 450h203v125H190V450" data-cell-id="27" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="28"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M211 564h172v-46H211v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="29"><path fill="none" d="M212.41 517.94H382.1V564H212.41z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:172px;height:1px;padding-top:541px;margin-left:211px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:170px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry pod<br></font></p></div></div></div></div></foreignObject><text x="297" y="545" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry pod
</text></switch></g></g><g data-cell-id="30"><path fill="none" d="M247 501h100v-40H247z" pointer-events="all"></path><g data-cell-id="31"><path fill="none" d="M248.41 461h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:481px;margin-left:247px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role B<br></font></p></div></div></div></div></foreignObject><text x="297" y="485" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role B
</text></switch></g></g><g data-cell-id="32"><path fill="none" d="M247 666h100v-40H247z" pointer-events="all"></path><g data-cell-id="33"><path fill="none" d="M248.41 626h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:646px;margin-left:247px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role N<br></font></p></div></div></div></div></foreignObject><text x="297" y="650" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role N
</text></switch></g></g><g data-cell-id="34"><path fill="none" d="M629 596h225v146H629z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M650 596h203v125H650V596" data-cell-id="35" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M639 606h203v125H639V606" data-cell-id="36" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M629 617h203v125H629V617" data-cell-id="37" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="38"><path fill="none" d="M629 267h225v146H629z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M650 267h203v125H650V267" data-cell-id="39" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M639 277h203v125H639V277" data-cell-id="40" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M629 288h203v125H629V288" data-cell-id="41" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="42"><path fill="#fee599" d="M599 233h250v-62H599z" pointer-events="all" style="fill:light-dark(#fee599,#3e2900)"></path><g data-cell-id="43"><path fill="none" d="M600.41 171h247.18v62H600.41z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:249px;height:1px;padding-top:202px;margin-left:599px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:247px;max-height:62px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:22.58px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Group 1<br></font></p></div></div></div></div></foreignObject><text x="724" y="206" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Group 1
</text></switch></g></g><g data-cell-id="44"><path fill="none" d="M686 335h100v-40H686z" pointer-events="all"></path><g data-cell-id="45"><path fill="none" d="M687.41 295h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:315px;margin-left:686px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role A<br></font></p></div></div></div></div></foreignObject><text x="736" y="319" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role A
</text></switch></g></g><g data-cell-id="46"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M634 391h86v-46h-86v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="47"><path fill="none" d="M635.41 344.94h83.55V391h-83.55z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:86px;height:1px;padding-top:368px;margin-left:634px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:84px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry<br>pod<br></font></p></div></div></div></div></foreignObject><text x="677" y="372" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry...</text></switch></g></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="76"><path fill="none" d="M621.76 341H499V201" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m626.76 341-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="77"><path fill="none" d="M621.76 519H499V341" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m626.76 519-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g stroke="#000" stroke-miterlimit="10" stroke-width="2" data-cell-id="78"><path fill="none" d="M621.76 686H499V491" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path d="m626.76 686-5 2.5v-5Z" pointer-events="all" style="fill:light-dark(#000,#ededed);stroke:light-dark(#000,#ededed)"></path></g><g data-cell-id="48"><path fill="#d7e3bf" stroke="#000" stroke-dasharray="3 3" stroke-miterlimit="10" d="M745 391h77v-46h-77v46" pointer-events="all" style="fill:light-dark(#d7e3bf,#293314);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="49"><path fill="none" d="M746.41 344.94h74.96V391h-74.96z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:77px;height:1px;padding-top:368px;margin-left:745px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:75px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">worker<br>pod<br></font></p></div></div></div></div></foreignObject><text x="784" y="372" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">worker...</text></switch></g></g><g data-cell-id="50"><path fill="#d7e3bf" stroke="#000" stroke-dasharray="3 3" stroke-miterlimit="10" d="M747 729h76v-46h-76v46" pointer-events="all" style="fill:light-dark(#d7e3bf,#293314);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="51"><path fill="none" d="M748.41 682.94h73.18V729h-73.18z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:75px;height:1px;padding-top:706px;margin-left:747px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:73px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">worker<br>pod<br></font></p></div></div></div></div></foreignObject><text x="785" y="710" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">worker...</text></switch></g></g><g data-cell-id="52"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M650 729h84v-46h-84v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="53"><path fill="none" d="M651.41 682.94h81.58V729h-81.58z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:84px;height:1px;padding-top:706px;margin-left:650px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:82px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry<br>pod<br></font></p></div></div></div></div></foreignObject><text x="692" y="710" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry...</text></switch></g></g><g data-cell-id="54"><path fill="none" d="M629 430h225v146H629z" pointer-events="all"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M650 430h203v125H650V430" data-cell-id="55" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M639 440h203v125H639V440" data-cell-id="56" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path><path fill="#fee599" stroke="#101843" stroke-miterlimit="10" d="M629 451h203v125H629V451" data-cell-id="57" pointer-events="all" style="fill:light-dark(#fee599,#3e2900);stroke:light-dark(#101843,#d0d6fb)"></path></g><g data-cell-id="58"><path fill="#b7dde8" stroke="#000" stroke-miterlimit="10" d="M650 565h172v-46H650v46" pointer-events="all" style="fill:light-dark(#b7dde8,#1b3c45);stroke:light-dark(#000,#ededed)"></path><g data-cell-id="59"><path fill="none" d="M651.41 518.94H821.1V565H651.41z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:172px;height:1px;padding-top:542px;margin-left:650px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:170px;max-height:46px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:16.93px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">entry pod<br></font></p></div></div></div></div></foreignObject><text x="736" y="546" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">entry pod
</text></switch></g></g><g data-cell-id="60"><path fill="none" d="M686 502h100v-40H686z" pointer-events="all"></path><g data-cell-id="61"><path fill="none" d="M687.41 462h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:482px;margin-left:686px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role B<br></font></p></div></div></div></div></foreignObject><text x="736" y="486" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role B
</text></switch></g></g><g data-cell-id="62"><path fill="none" d="M686 667h100v-40H686z" pointer-events="all"></path><g data-cell-id="63"><path fill="none" d="M687.41 627h97.47v40h-97.47z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:99px;height:1px;padding-top:647px;margin-left:686px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:97px;max-height:40px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:19.76px;font-family:&amp;quot;color:light-dark(#000,#ededed);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">Role N<br></font></p></div></div></div></div></foreignObject><text x="736" y="651" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">Role N
</text></switch></g></g><g data-cell-id="64"><path fill="none" d="M578 97h326v57H578z" pointer-events="all"></path><g data-cell-id="65"><path fill="none" d="M578 96.85h326.97V154H578z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:329px;height:1px;padding-top:125px;margin-left:577px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:327px;max-height:57px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0 1;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:14.11px;font-family:&amp;quot;color:light-dark(#191919,#d8d8d8);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">modelServing.spec.replicas=2,InferGroup</font><font style="font-size:14.11px;font-family:&amp;quot;color:light-dark(#191919,#d8d8d8);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">replicas<br></font></p></div></div></div></div></foreignObject><text x="741" y="129" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">modelServing.spec.replicas=2,InferGroup replicas
</text></switch></g></g><g data-cell-id="66"><path fill="none" d="M865 314h180v76H865z" pointer-events="all"></path><switch><foreignObject width="100%" height="100%" pointer-events="none" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow:visible;text-align:left"><div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:unsafe center;justify-content:unsafe center;width:182px;height:1px;padding-top:352px;margin-left:864px"><div style="box-sizing:border-box;font-size:0;text-align:center;width:180px;max-height:76px;overflow:hidden;color:#000"><div style="display:inline-block;font-size:12px;font-family:Helvetica;color:light-dark(#000,#fff);line-height:1.2;pointer-events:all;width:100%;white-space:normal;word-wrap:normal"><div style="font-size:1px"><p style="text-align:center;margin:0 1;text-indent:0;vertical-align:middle;direction:ltr"><font style="font-size:14.11px;font-family:&amp;quot;color:light-dark(#191919,#d8d8d8);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">inferGroupTemplate.spec.roles.replicas=3,role</font><font style="font-size:14.11px;font-family:&amp;quot;color:light-dark(#191919,#d8d8d8);direction:ltr;letter-spacing:0;line-height:120%;opacity:1">replicas<br></font></p></div></div></div></div></foreignObject><text x="955" y="356" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12" text-anchor="middle">inferGroupTemplate.spec.roles....</text></switch></g><path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2" d="M160 199H60" data-cell-id="68" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path><path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2" d="M599 201H499" data-cell-id="70" pointer-events="stroke" style="stroke:light-dark(#000,#ededed)"></path></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"></g><a xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" transform="translate(0 -5)"><text x="50%" y="100%" font-size="10" text-anchor="middle">Text is not SVG - cannot display</text></a></switch></svg></div></div>
<ul>
<li class=""><strong>Three-layer LLM workload model</strong>: <code>ModelServing -&gt; ServingGroup -&gt; Role</code>. A single API supports multiple deployment forms, including native LLM deployment, PD separation, and large-scale EP (Expert Parallelism).</li>
<li class=""><strong>Prefill-Decode Separation Deployment</strong>: Schedules compute-intensive Prefill instances onto nodes with high compute capability, and memory-bound Decode instances onto nodes with high-bandwidth memory, enabling better resource matching and lower end-to-end latency. Prefill and Decode can scale independently to adapt to mixed traffic patterns.</li>
<li class=""><strong>Multiple Parallel Paradigms</strong>: Flexible configuration of TP/PP/DP/EP to maximize utilization and meet SLO targets.</li>
<li class=""><strong>Topology-aware + Gang Scheduling</strong>: Gang scheduling ensures atomic placement of related Pods (ServingGroup/Role), reducing tail latency and avoiding wasted fragmented resources; topology-aware scheduling improves parallel communication efficiency.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-out-of-the-box-model-onboarding-modelbooster">2) Out-of-the-Box Model Onboarding (ModelBooster)<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#2-out-of-the-box-model-onboarding-modelbooster" class="hash-link" aria-label="2) Out-of-the-Box Model Onboarding (ModelBooster)的直接链接" title="2) Out-of-the-Box Model Onboarding (ModelBooster)的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Provides deployment templates for mainstream models, including PD separation.</li>
<li class="">Automatically generates routing policies and lifecycle resources such as <code>ModelRoute</code>, <code>ModelServer</code>, <code>ModelServing</code>, and <code>Autoscaling</code>.</li>
<li class="">Covers common deployment scenarios while allowing fine-grained customization via <code>ModelServing</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-intelligent-model-aware-routing-kthena-router">3) Intelligent, Model-Aware Routing (Kthena Router)<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#3-intelligent-model-aware-routing-kthena-router" class="hash-link" aria-label="3) Intelligent, Model-Aware Routing (Kthena Router)的直接链接" title="3) Intelligent, Model-Aware Routing (Kthena Router)的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>Multi-model routing</strong>: OpenAI API compatible; routes based on headers or request content.</li>
<li class=""><strong>Pluggable scheduling</strong>: Least Request, Minimum Latency, KV Cache-aware, Prefix Cache-aware, LoRA affinity, GPU utilization-aware, Fair Scheduling, and more.</li>
<li class=""><strong>Hot-pluggable LoRA without interruption</strong>: Detects adapters loaded by inference engines and routes without downtime.</li>
<li class=""><strong>Traffic governance</strong>: weight-based routing, canary release, token-level rate limiting, and failover.</li>
<li class=""><strong>All-in-one routing architecture</strong>: no need to deploy Envoy Gateway; natively supports PD-separated traffic and consolidates multi-layer routing for simpler operations.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-cost-driven-auto-scaling-autoscaler">4) Cost-Driven Auto-Scaling (Autoscaler)<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#4-cost-driven-auto-scaling-autoscaler" class="hash-link" aria-label="4) Cost-Driven Auto-Scaling (Autoscaler)的直接链接" title="4) Cost-Driven Auto-Scaling (Autoscaler)的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>Homogeneous scaling</strong>: stable and burst modes, scaling by business metrics (CPU/GPU/Memory/custom).</li>
<li class=""><strong>Heterogeneous deployment optimization</strong>: cost-capability greedy placement across multiple inference engines and heterogeneous accelerators.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-support-for-mainstream-inference-engines-and-heterogeneous-hardware">5) Support for Mainstream Inference Engines and Heterogeneous Hardware<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#5-support-for-mainstream-inference-engines-and-heterogeneous-hardware" class="hash-link" aria-label="5) Support for Mainstream Inference Engines and Heterogeneous Hardware的直接链接" title="5) Support for Mainstream Inference Engines and Heterogeneous Hardware的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Supports vLLM, SGLang, Triton/TGI, etc. with unified API abstraction and standardized metrics.</li>
<li class="">Supports hybrid deployments across GPU/NPU, working with heterogeneous autoscaling to balance cost and SLO.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-built-in-traffic-control-and-fair-scheduling">6) Built-in Traffic Control and Fair Scheduling<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#6-built-in-traffic-control-and-fair-scheduling" class="hash-link" aria-label="6) Built-in Traffic Control and Fair Scheduling的直接链接" title="6) Built-in Traffic Control and Fair Scheduling的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>Fair scheduling</strong>: based on priority and historical token consumption; prevents starvation.</li>
<li class=""><strong>Rate limiting</strong>: fine-grained controls by user, model, and token length.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="extreme-performance-improvements">Extreme Performance Improvements<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#extreme-performance-improvements" class="hash-link" aria-label="Extreme Performance Improvements的直接链接" title="Extreme Performance Improvements的直接链接" translate="no">​</a></h2>
<p>Based on the scheduling plugin architecture of Kthena Router, in scenarios with long system prompts (e.g., 4096 tokens), the <strong>KV Cache-aware + Least Request</strong> strategy compared to a random baseline:</p>
<ul>
<li class="">Throughput can be increased by approximately <strong>2.73×</strong>.</li>
<li class="">TTFT (Time to First Token) is reduced by approximately <strong>73.5%</strong>.</li>
<li class="">End-to-end latency is reduced by more than <strong>60%</strong>.</li>
</ul>
<table><thead><tr><th>Plugin Configuration</th><th style="text-align:right">Throughput (req/s)</th><th style="text-align:right">TTFT (s)</th><th style="text-align:right">End-to-End Latency (s)</th></tr></thead><tbody><tr><td>Least Request + KVCacheAware</td><td style="text-align:right"><strong>32.22</strong></td><td style="text-align:right"><strong>9.22</strong></td><td style="text-align:right"><strong>0.57</strong></td></tr><tr><td>Least Request + Prefix Cache</td><td style="text-align:right">23.87</td><td style="text-align:right">12.47</td><td style="text-align:right">0.83</td></tr><tr><td>Random</td><td style="text-align:right">11.81</td><td style="text-align:right">25.23</td><td style="text-align:right">2.15</td></tr></tbody></table>
<p>The gap in short-prompt scenarios converges with prompt length, but in multi-turn conversations, templated generation, and business scenarios with highly similar prefixes, KV Cache-aware routing delivers significant gains. Actual improvements depend on model size, prompt length, and hardware, but the “mix-and-match, scenario-based selection” approach has proven effective.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-roadmap">Future Roadmap<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#future-roadmap" class="hash-link" aria-label="Future Roadmap的直接链接" title="Future Roadmap的直接链接" translate="no">​</a></h2>
<p>Kthena received attention and support from community users in its early planning and development stages, but this is only the beginning. We plan to support more efficient scheduling algorithms, broader best practices for large model deployment, and will continue to focus on large-scale deployment and performance optimization for LLM inference.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="start-exploring-kthena-now">Start Exploring Kthena Now<a href="https://kthena.volcano.sh/zh-Hans/blog/launch-blog-post#start-exploring-kthena-now" class="hash-link" aria-label="Start Exploring Kthena Now的直接链接" title="Start Exploring Kthena Now的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>GitHub Repository</strong>: <a href="https://github.com/volcano-sh/kthena" target="_blank" rel="noopener noreferrer" class="">https://github.com/volcano-sh/kthena</a></li>
<li class=""><strong>Official Website</strong>: <a href="https://kthena.volcano.sh/" target="_blank" rel="noopener noreferrer" class="">https://kthena.volcano.sh/</a></li>
<li class=""><strong>Community (Slack)</strong>: <a href="https://cloud-native.slack.com/archives/C011GJDQS0N" target="_blank" rel="noopener noreferrer" class="">https://cloud-native.slack.com/archives/C011GJDQS0N</a></li>
</ul>
<p>Let’s work together to give LLMs cloud-native wings and release the full potential of AI.</p>]]></content:encoded>
        </item>
    </channel>
</rss>