Releases: volcano-sh/kthena
Release list
v1.0.0-rc.0
This release includes the following artifacts:
- Helm Chart:
kthena.tgz(OCI artifact pushed to GHCR) - Installation YAML:
kthena-install.yaml - CLI Binaries: Pre-built binaries for Linux (amd64/arm64), macOS (amd64/arm64), and Windows (amd64)
Documentation
Release notes are automatically generated from commits.
What's Changed
Exciting New Features 🎉
- add doc about kv cache aware scheduler plugin by @YaoZengzeng in #910
- test: add scheduler plugin coverage by @krrishrastogi05 in #988
- feat: add CLI support for ModelRoute and ModelServer resources by @anirudh240 in #981
- feat: add STATUS and READY columns to kthena get output by @anirudh240 in #978
- test: add unit tests for ModelRouteController and GatewayController by @anirudh240 in #992
- add a debug port which can dump configuration of servingGroup and role by @LiZhenCheng9527 in #900
- add debugPort flag into charts by @LiZhenCheng9527 in #1032
- test: add tests for tokenizer package by @anirudh240 in #1046
- feat: add pprof endpoint for router by @StLeoX in #1057
- test: add unit tests for JWT claim validation functions by @anirudh240 in #1098
- change he main functions name and add more detailed comments by @LiZhenCheng9527 in #894
- test: add unit tests for gateway-scoped MatchModelServer routing by @anirudh240 in #1104
- test: add missing E2E tests for updating and deleting ModelBooster by @pm-ju in #1000
- feat: Implemented e2e test for SGLang PD router coverage by @katara-Jayprakash in #994
- feat: add tolerations fields to ModelWorker by @Abirdcfly in #1141
- Add SGLang tokenizer support for KV-cache-aware scheduling by @blenbot in #997
- [Feature] AutoScaler supports fetch metrics from the Prometheus server by @LiZhenCheng9527 in #1127
- feat: honor HTTPRoute hostnames and matched rule selection by @zhy76 in #1174
- Fix router graceful shutdown and expose router active-requests metric by @nXtCyberNet in #1169
- Request-cost-aware router fairness priority by @JagjeevanAK in #897
- fix:- ModelServer's configure WorkloadPort instead of hardcode Defaults by @verma-garv in #1205
- feat: comprehensive upgrade to Go 1.26.4 by @nabrahma in #1244
- merge autoscalingpolicybinding to autoscalingpolicy by @LiZhenCheng9527 in #1203
- router: add observability metrics for prefix-cache and kvcache-aware score plugins by @kube-gopher in #1194
- Role rollingupdate support maxUnavailable settings by @hzxuzhonghu in #1239
- Implementation of PD disaggregation auto-scaler by @LiZhenCheng9527 in #1258
- session boost queue to optimize multi conversation scenario by @YaoZengzeng in #1183
Bug fixes 🐛
- Replace the
kubeclient.Updatemethod inautoScalerwithkubeclient.Patchby @LiZhenCheng9527 in #915 - test: wait for router webhook readiness by @acsoto in #930
- fix(autoscaler): use maximum sliding window for scale-down stabilization by @kube-gopher in #946
- fix(nixl): rebuild prefill/decode request bodies on every Proxy call by @Sanchit2662 in #947
- fix: replace testify/assert/yaml with sigs.k8s.io/yaml in scheduler p… by @anirudh240 in #967
- fix: use GetGauge() instead of GetCounter() for sglang metrics by @anirudh240 in #976
- fix(router): retry sends empty body to fallback pods in aggregated proxy path by @Sanchit2662 in #1031
- fix(autoscaler/metric_collector): exit decode loop on non-EOF error by @Kernel-9 in #952
- fix: require bearer scheme for JWT auth by @pm-ju in #1035
- fix: reject empty router model requests by @pm-ju in #1036
- test/e2e: fix flaky TestKthenaRouterValidatingWebhook caused by webhook race after pod restart by @nXtCyberNet in #1065
- model-booster: fix data race and concurrent-map-write panic in ModelBoosterController by @kube-gopher in #1085
- fix: use controller owner refs for modelbooster children by @pm-ju in #1054
- fix(autoscaler/metric_collector): Use the target-referenced namespace first by @Kernel-9 in #1068
- remove unused GetModelRoutesByGateway by @anirudh240 in #1078
- fix: support ipv6 pod backend URLs by @pm-ju in #1071
- Fix HTTPRoute PathPrefix matching by @Monti-27 in #1119
- fix(router): return mid-stream and copy errors from proxyRequest by @Sanchit2662 in #1049
- metrics: check HTTP status before parsing response by @Sri-Varshith in #1142
- test(e2e): add self-healing coverage for ModelBooster by @katara-Jayprakash in #1143
- fix(model-booster): wire ModelWorker.Affinity to pod spec templates by @Abirdcfly in #1146
- Fix concurrent graceMap check/store race in handleErrorPod by @nXtCyberNet in #1157
- fix: guard PodInfo access against data races by @zhy76 in #1167
- Fix router auth panic when JWKS cache is empty by @avinxshKD in #1219
- Validate ModelRoute rule fields by @avinxshKD in #1201
- fix: remove unnecessary goroutine in ModelPrefixStore LRU eviction callback by @nabrahma in #1243
- fix(scheduler): treat zero TTFT/TPOT as uninitialized in least-latency plugin by @Sanchit2662 in #1040
- fix: aggregate labeled autoscaler metrics by @pm-ju in #1064
- Fix stale KV cache ownership by @avinxshKD in #1224
- fix(router): respect Gateway allowedRoutes by @avinxshKD in #1263
- fix: parallelize pod metrics scraping loop with bounded concurrency by @nabrahma in #1255
- Fixed an issue where a PG was created by mistake when scaling up a Se… by @LiZhenCheng9527 in #1268
Documentation Updates 📚
- change kthena installation command by @LiZhenCheng9527 in #898
- Archive the documentation for v0.4.0 by @LiZhenCheng9527 in #908
- add kthena v0.4.0 release note by @LiZhenCheng9527 in #887
- [Docs] Fix inaccurate descriptions in autoscaler user guide by @Abirdcfly in #906
- docs: fix typos in router comments by @acsoto in #925
- Add deepseek-v4 example for model serving by @VanderChen in #936
- Create ConfigMap for deepseekv4 model serving by @VanderChen in #937
- Update docs by @hzxuzhonghu in #933
- doc(proposal): Session Sticky (Session Affinity) for the Model Router in infer-gateway by @FAUST-BENCHOU in #873
- docs: refresh modelbooster webhook readme by @pm-ju in #1011
- update proposal with podGroup crd update by @LiZhenCheng9527 in #726
- add Prometheus Metrics Source for Autoscaler proposal by @LiZhenCheng9527 in #931
- Proposal of merge
autoscalingPolicybingdingintoautoscalingPolicyby @LiZhenCheng9527 in #1172
Other Changes 🔄
- modelServering enable volcano queue by @jiahuat in #902
- feat: Introducing Dynamo Mocker instead of Flask Mocker by @FAUST-BENCHOU in #896
- doc: Add Ask DeepWiki badge to README by @JagjeevanAK in #911
- Add KEDA aut...
Kthena v0.4.0
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!
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.
Improved Observability
Role Status Visibility
To minimize kube-apiserver load, Kthena's ModelServing utilizes a local store to cache the status of ServingGroups and Roles. While highly efficient, we realized this limited our observability during debugging.
In v0.4.0, we've broken the black box. We now expose role status directly via Kubernetes Events, dramatically enhancing the observability of ModelServing. Looking ahead, we plan to directly embed this crucial Role information into the ModelServing Status, giving you complete, transparent control over your deployments.
Comprehensive Access Logging
Router observability is now easier than ever. The Router now generates a detailed access log, capturing rich routing metadata for every single request. Here is an example of a Router log:
[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)Compared to previous versions, we have introduced the gateway, http_route, and inference_pool fields to provide deeper visibility into Gateway and Gateway Inference Extension traffic.
A Faster, Smarter Router
Deterministic & Efficient Model Selection
Previously, mapping multiple ModelRoute 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.
Kthena v0.4.0 introduces a robust conflict-resolution mechanism. When duplicate ModelRoutes exist, the router deterministically prioritizes the oldest (typically prebuilt) route, treating newer duplicates as lower priority. Predictable, rock-solid routing every time.
Configurable Prefix-Caching
One size doesn't fit all. That's why Kthena replaced hardcoded prefix-cache parameters with a fully configurable prefix-matching system. You now have granular control over prefix-cache behavior with the following parameters:
- Block Size (for hash processing): Controls the granularity of the prefix match. Smaller blocks offer more precise matching but increase CPU overhead, while larger blocks process faster.
- Max Block Limits: 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.
- Cache Capacity: 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.
- Top-K Results: 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.
By fine-tuning these settings, you can tailor Kthena's routing performance to match your specific models and business LLM workloads.
Granular, Resource-Efficient Rolling Updates
Historically, Kthena executed rolling updates at the entire ServingGroup level. For massive LLM applications, completely rebuilding a ServingGroup is an incredibly resource-intensive and time-consuming process.
To solve this, we are introducing role-based rolling updates. You no longer need to update an entire ServingGroup when only a specific Role requires changes (which is also why we introduced RoleRecreate in the recovery policy). Starting from v0.4.0, you can dynamically adjust your rolloutStrategy—drastically cutting down resource consumption, speeding up deployment times.
An Open Ecosystem
We are deeply committed to building Kthena as an open, inclusive, and thriving project alongside the wider open-source community.
ModelScope Support
In v0.4.0, we have extended Kthena's model downloader with ModelScope protocol support. This allows users and operators to choose a model repository that suits their needs.
Support for A Variety of Inference Engines
Furthermore, we are proud that ModelServing is now thoroughly verified to support leading inference engines like vLLM and SGLang.
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!
What's Changed
Exciting New Features 🎉
- e2e test for controller manager restart by @YaoZengzeng in #747
- fix flaky lora e2e test by @FAUST-BENCHOU in #765
- feat: Expose Role Status via Kubernetes Events by @FAUST-BENCHOU in #753
- basic e2e for lws api by @YaoZengzeng in #755
- update role status by @LiZhenCheng9527 in #737
- model-serving: support percentage-based partition in rolling update by @aabhinavvvvvvv in #843
- Fairness scheduling improve proposal by @hzxuzhonghu in #854
- [Feature] Role rollingupdate Implementation by @LiZhenCheng9527 in #805
- feat:support more gateway API information by @FAUST-BENCHOU in #621
- sglang pd disaggregation model-serving example by @YaoZengzeng in #883
- feat: Support native LeaderWorkerSet (LWS) labels in pods generated via LWS API by @FAUST-BENCHOU in #888
- kthena router support sglang pd disaggregation by @YaoZengzeng in #882
- test: add unit tests for pkg/kthena-router and pkg/model-booster-controller package by @lihua871205 in #889
Bug fixes 🐛
- fix table overflow in LWS integration documentation by @thisisharsh7 in #751
- fix: hide navigation on docs lightboxImage by @thisisharsh7 in #750
- fix roling update block by always unavailable servingGroup by @LiZhenCheng9527 in #744
- Fix Prefix Cache Plugin: Candidate Filtering, Score Completeness, and API Refactor by @YaoZengzeng in #783
- fix data race in model serving controller by @YaoZengzeng in #800
- fix controller panic when create modelserving with pod annotations by @VanderChen in #808
- allow partition to be greater than or equal to replicas by @VanderChen in #810
- [bug] Fixed an error where the headless service was not pointing solely to the entry pod by @LiZhenCheng9527 in #821
- [BUG] fix bug about servingGroup partition in role scale up by @LiZhenCheng9527 in #860
- fix: panic when workerTemplate is nil by @anirudh240 in #746
- Bug fix: When deleting a Pod associated with a single Pod role, the role is not recreated by @LiZhenCheng9527 in #891
- test/e2e: fix flake in WaitForModelServingReady by @vyagh in #876
Documentation Updates 📚
- Release note v0.3.0 by @YaoZengzeng in #725
- update helm doc by @LiZhenCheng9527 in #736
- proposal: Expose Role Status via Kubernetes Events by @FAUST-BENCHOU in #676
- release v0.3.0 of doc by @YaoZengzeng in #732
- docs: add mermaid diagram for modelserving plugin framework by @hzxuzhonghu in #774
- add subgroup description in network topology user guide by @LiZhenCheng9527 in #769
- test: add testdata dir under test/e2e/router for E2E tests by @sicaario in #795
- add role based rolling update proposal by @LiZhenCheng9527 in #802
- doc for vllm pd disaggregation (gpu) by @YaoZengzeng in #893
Other Changes 🔄
- fix an erro...
v0.4.0-rc.0
This release includes the following artifacts:
- Helm Chart:
kthena.tgz(OCI artifact pushed to GHCR) - Installation YAML:
kthena-install.yaml - CLI Binaries: Pre-built binaries for Linux (amd64/arm64), macOS (amd64/arm64), and Windows (amd64)
Documentation
Release notes are automatically generated from commits.
What's Changed
Exciting New Features 🎉
- Add scale subresource to modelServing by @LiZhenCheng9527 in #572
- E2E framework for Kthena Router by @YaoZengzeng in #560
- [Docs] add doc generation for helm chart by @git-malu in #577
- Basic E2E test case for Gateway API by @YaoZengzeng in #580
- e2e for gateway inference extension by @YaoZengzeng in #585
- e2e test for duplicate modelname by @YaoZengzeng in #607
- e2e for router that both api configured by @YaoZengzeng in #619
- abstract some cases to be reused by gateway api enabled scenario by @YaoZengzeng in #632
- [test] add e2e test for webhook by @git-malu in #606
- test() add unit tests for model serving functionality in client_test.go by @adity1raut in #643
- add an e2e test example of modelserving by @LiZhenCheng9527 in #652
- feat:modelserving partition revision control by @FAUST-BENCHOU in #590
- Add more CLI templates by @huntersman in #574
- [Feature] Support maxUnavailable in modelserving rollingupdate by @LiZhenCheng9527 in #640
- Implement extension plugin framework by @hzxuzhonghu in #588
- update role or servingGroup status before delete child resource by @LiZhenCheng9527 in #696
- add retry on conflict when updating by @VanderChen in #700
- fix: add a initialSync check in updatePod by @FAUST-BENCHOU in #718
- e2e test for controller manager restart by @YaoZengzeng in #747
- fix flaky lora e2e test by @FAUST-BENCHOU in #765
- feat: Expose Role Status via Kubernetes Events by @FAUST-BENCHOU in #753
- basic e2e for lws api by @YaoZengzeng in #755
- update role status by @LiZhenCheng9527 in #737
- model-serving: support percentage-based partition in rolling update by @aabhinavvvvvvv in #843
- Fairness scheduling improve proposal by @hzxuzhonghu in #854
- [Feature] Role rollingupdate Implementation by @LiZhenCheng9527 in #805
- feat:support more gateway API information by @FAUST-BENCHOU in #621
- sglang pd disaggregation model-serving example by @YaoZengzeng in #883
- feat: Support native LeaderWorkerSet (LWS) labels in pods generated via LWS API by @FAUST-BENCHOU in #888
- kthena router support sglang pd disaggregation by @YaoZengzeng in #882
- test: add unit tests for pkg/kthena-router and pkg/model-booster-controller package by @lihua871205 in #889
Bug fixes 🐛
- change CRD reference link in modelserving blog by @LiZhenCheng9527 in #566
- support which controller to start with a flag --controllers by @LiZhenCheng9527 in #568
- Protect Headless Services Created by ModelServing by @LiZhenCheng9527 in #598
- fix log verbosity issue of router by @YaoZengzeng in #626
- Fixed a bug where role deletion did not trigger reconstruction. by @LiZhenCheng9527 in #629
- add controllerRevision rbac configuration by @LiZhenCheng9527 in #656
- Modified the implementation for creating the controllerRevision name by @LiZhenCheng9527 in #671
- add a update-crd.sh to remove hostAliases map commentary by @LiZhenCheng9527 in #685
- enable modelserving webhook in helm charts by @VanderChen in #694
- Fix silent recovery of failed pods after ModelServing controller restart by @WHOIM1205 in #697
- Additional model serving debug logs have been added and fix a MaxUnavailable bug by @LiZhenCheng9527 in #668
- Not handle sub-resources not created by existing modelServing and also check the resource owners in sync by @LiZhenCheng9527 in #674
- Fix role status transition to Running to restore scale-down protection by @WHOIM1205 in #706
- Fix divide-by-zero in LeastRequest scoring by @WHOIM1205 in #723
- fix table overflow in LWS integration documentation by @thisisharsh7 in #751
- fix: hide navigation on docs lightboxImage by @thisisharsh7 in #750
- fix roling update block by always unavailable servingGroup by @LiZhenCheng9527 in #744
- Fix Prefix Cache Plugin: Candidate Filtering, Score Completeness, and API Refactor by @YaoZengzeng in #783
- fix data race in model serving controller by @YaoZengzeng in #800
- fix controller panic when create modelserving with pod annotations by @VanderChen in #808
- allow partition to be greater than or equal to replicas by @VanderChen in #810
- [bug] Fixed an error where the headless service was not pointing solely to the entry pod by @LiZhenCheng9527 in #821
- [BUG] fix bug about servingGroup partition in role scale up by @LiZhenCheng9527 in #860
- fix: panic when workerTemplate is nil by @anirudh240 in #746
- Bug fix: When deleting a Pod associated with a single Pod role, the role is not recreated by @LiZhenCheng9527 in #891
- test/e2e: fix flake in WaitForModelServingReady by @vyagh in #876
Documentation Updates 📚
- doc for gateway api support by @YaoZengzeng in #541
- remove the "networking-" prefix from svc "kthena-router" by @YaoZengzeng in #553
- [Docs] [v0.2.0] fix by @git-malu in #552
- [Doc] add userguide of binpack scale down feature by @LiZhenCheng9527 in #549
- [Doc] add user guide of network topology aware scheduling by @LiZhenCheng9527 in #559
- blog of Kthena Router support gateway api and inference extension by @YaoZengzeng in #573
- Launching kthena blog by @hzxuzhonghu in #579
- update OWNERS of test package by @YaoZengzeng in #591
- [Docs] small updates by @git-malu in #592
- docs: fix incorrect minTaskMember generation description in multi-node-inference guide by @cr7258 in #618
- Data parallel deployment guide for Kthena by @huntersman in #620
- Release note v0.3.0 by @YaoZengzeng in #725
- update helm doc by @LiZhenCheng9527 in #736
- proposal: Expose Role Status via Kubernetes Events by @FAUST-BENCHOU in #676
- release v0.3.0 of doc by @YaoZengzeng in #732
- docs: add mermaid diagram for modelserving plugin framework by @hzxuzhonghu in #774
- add subgroup description in network topology user guide by @LiZhenCheng9527 in #769
- test: add testdata dir under test/e2e/router for E2E tests by @sicaario in #795
- add role based rolling update proposal by @LiZhenCheng9527 in #802
- doc for vllm pd disaggregation (gpu) by @YaoZengzeng in #893
Other Changes 🔄
- clean up code about podgroup by @LiZhenCheng9527 in #555
- Refactor sync modelse...
Kthena v0.3.0
Summary
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 LeaderWorkerSet, advanced network topology-aware scheduling for PD disaggregation, and a comprehensive Router Observability framework. Additionally, this version brings native ModelServing version control, support for vLLM data parallel deployment, and a complete E2E test suite for the router, ensuring high stability and reliability for production environments.
What's New
Key Features Overview
- LeaderWorkerSet Support: Integration with the LeaderWorkerSet (LWS) API allows for sophisticated management of distributed inference workloads.
- Role-Level Gang Scheduling & Topology Awareness: Leverages Volcano's new
subGroupPolicyfeature to enable fine-grained, role-based gang scheduling and network topology awareness. - ModelServing Partition Revision Control: Introduced a native revision-based version control system for ModelServing.
- Router Observability & Debugging: Comprehensive documentation and framework for router observability, plus a dedicated debug port.
- Enhanced Rolling Updates: Support for
maxUnavailableallows tuning the velocity of updates for faster rollouts. - Plugin Support: Flexible plugin architecture for ModelServing to inject custom configuration logic.
LeaderWorkerSet Support for ModelServing Role
Background and Motivation:
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.
Key Capabilities:
- Direct Integration: ModelServing Roles can now leverage LWS to automatically manage leader-worker groups.
- Simplified Topology: Reduces the complexity of defining distributed inference services requiring strict coordination.
Related:
- PR: #609, #683
- Contributors: @zhiweideren
Role-Level Gang Scheduling & Topology Awareness
Background and Motivation:
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 fine-grained, role-level control over both gang scheduling and network topology awareness by leveraging Volcano's subGroupPolicy.
Key Capabilities:
- Declarative Topology Policies: Configure distinct network topology constraints for the entire ServingGroup (
groupPolicy) and for individual Roles (rolePolicy) directly in theModelServingspec. - Automatic Pod Grouping: The controller automatically labels Pods with
modelserving.volcano.sh/roleandmodelserving.volcano.sh/role-id, enabling Volcano to form subGroups for precise topology-aware placement. - Performance Optimization: Minimizes inter-role communication latency and maximizes bandwidth utilization for intensive distributed inference jobs by co-locating related tasks on network-proximal nodes.
- Role-Level Gang Scheduling: The
subGroupPolicyalso enforces gang scheduling at the role level, ensuring that all Pods belonging to a specific role (e.g., allprefill-0Pods) 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.
Note: This feature requires Volcano v1.14+ for subGroupPolicy support.
Related:
- Proposal: Network Topology
- PR: #587
- Contributors: @LiZhenCheng9527
ModelServing Partition Revision Control
Background and Motivation:
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.
Key Capabilities:
- Revision Tracking: Automatically tracks changes to ModelServing configurations.
- Partition Protection: Supports partition-based updates to ensure service continuity during rollouts.
- Rollback: Easily revert to a previous stable revision.
Related:
- PR: #590, #653, #671
- Contributors: @FAUST-BENCHOU, @LiZhenCheng9527
Router Observability & Debugging
Background and Motivation:
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.
Key Capabilities:
- Debug Port: A dedicated port (default
15000) for real-time inspection of routing tables and upstream health. - Comprehensive Metrics: Detailed documentation and setup for monitoring request latency, throughput, and error rates.
- E2E Testing: A robust E2E test framework covering most routing scenarios ensures reliability.
Related:
- PR: #599, #622
- Contributors: @yashisrani, @FAUST-BENCHOU
Other Notable Changes
Features and Improvements
- [ModelServing] Support
maxUnavailablein modelserving rolling update #640 (@LiZhenCheng9527) - [ModelServing] Implement extension plugin framework #588 (@hzxuzhonghu)
- [ModelServing] Support vLLM data parallel deployment and Expert Parallel modes
- [CLI] Add templates for PD disaggregation use cases #571 (@huntersman)
- [Client] Make client QPS and Burst customizable #686 (@FAUST-BENCHOU)
- [Webhooks] Enable ModelServing webhooks by default in Helm charts #694 (@VanderChen)
- [Infra] One-click deploy from source via
hack/local-up-kthena.sh#613 (@FAUST-BENCHOU)
Bug Fixes
- [Scheduler] Fix divide-by-zero in LeastRequest scoring #723 (@WHOIM1205)
- [Controller] Fix role status transition to Running to restore scale-down protection #706 (@WHOIM1205)
- [Controller] Fix panic in PD scheduler when no prefill pods are available #714 (@WHOIM1205)
- [Controller] Fix silent recovery of failed pods after ModelServing controller restart #697 (@WHOIM1205)
- [Controller] Fix recovering headless services after deletion #598 (@LiZhenCheng9527)
- [Controller] Fix validate gangpolicy minRoleReplicas #699 (@VanderChen)
- [Controller] Fix controllerrevision data warping #698 (@VanderChen)
- [Controller] Fix modelserving controller panic #688 (@LiZhenCheng9527)
- [Controller] Fix restart during modelserving create: pod number mismatch #689 (@hzxuzhonghu)
- [Controller] Check role.Name in ModelServing validator #684 (@FAUST-BENCHOU)
- [Controller] Fix bug where role deletion did not trigger reconstruction #629 (@LiZhenCheng9527)
- [Router] Protect Headless Services Created by ModelServing #598 (@LiZhenCheng9527)
Contributors
Thank you to all contributors who made this release possible:
@hzxuzhonghu, @LiZhenCheng9527, @YaoZengzeng, @git-malu, @FAUST-BENCHOU, @katara-Jayprakash, @zhiweideren, [@aaradhychinche-alt...
Kthena v0.2.0
After a month of dedicated effort from the Kthena community contributors, we are excited to announce the official release of Kthena v0.2.0!
This release brings a range of practical features and significant improvements, specifically designed to empower AI workloads and meet the needs of our users. Notably, Kthena v0.2.0 delivers comprehensive optimizations across its router, modelBooster, and modelserving. These enhancements enable Kthena to foster a richer open source ecosystem and provide users with more diverse services. We sincerely thank all contributors for their hard work and feedback, which have made this release possible.
Key Features and Enhancements
Solve model name conflicts by supporting the gateway api:
Kthena Router supports Kubernetes Gateway API, providing more flexible traffic management and routing capabilities for model inference services.In traditional routing configurations, the modelName field in ModelRoute resources is global. When multiple ModelRoute resources use the same modelName, conflicts occur, leading to undefined routing behavior.
By using Gateway API, you can bind different ModelRoute resources to different Gateway resources. Even if they use the same modelName, there will be no conflicts. Each Gateway can listen on different ports, creating independent routing spaces.
Also gateway API Inference Extension depends on the foundational features of Gateway API. In order to support Gateway API Inference Extension, Kthena Router needs to support Gateway API first.
Router Supports Gateway API Inference Extension:
Gateway Inference Extension provides a standardized way to expose AI/ML inference services through Kubernetes Gateway API. In release v0.1.0, we have already added support for it through third-party projects such as Istio. Now we have native support for it in Kthena Router which means we support both the native ModelRoute/ModelServer and the upstream Gateway API Inference Extension. Users can easily migrate traffic from other Gateway API Inference Extension implementations. Additionally, users could try advanced features offered by ModelRouter/ModelServer, such as PD disaggregation, without needing to restart or redeploy Kthena router. We could manage the traffic of both API simultaneously!
Enhancements of kthena CLI:
The Kthena CLI provides kubectl‑style commands for managing AI inference workloads on Kubernetes, featuring quick deployment via curated templates and optional integration with kubectl‑ai for natural‑language command generation.
AutoScale Supports Scaling PD Instances Proportionally:
A new subTarget field is added to the Autoscaling Policy Binding, which supports Homogeneous Scaling at the granularity of the ModelServing Role. This feature can be used for SLO-based dynamic scaling in the deployment mode where Prefill and Decode are separated.
Network Topology Aware Scheduling:
Kthena leverages Volcano's new subGroupPolicy feature to enable role-based, network topology-aware scheduling. With this enhancement, users can configure sophisticated network topology constraints not only for pods within a ServingGroup, but also for specific Roles. By defining both group policies and role policies, users gain fine-grained control over how workloads are distributed across nodes, ensuring that frequently communicating pods are scheduled closer together and network bandwidth is utilized efficiently. This capability helps optimize performance and resource utilization for large-scale AI inference scenarios.
NOTE: This feature relies on Volcano's new API and requires the Volcano latest image. Even the volcano v1.12.0 is not enough
Support Binpack Scale Down:
Binpack scaling down is designed to maximize available node capacity, helping the cluster efficiently prepare for upcoming resource-intensive tasks. In Kthena, the Binpack Scale Down feature utilizes the controller.kubernetes.io/pod-deletion-cost annotation on each pod to intelligently manage capacity. Kthena evaluates the deletion cost assigned to each group or role based on the value of this annotation, ranks them in order from lowest to highest cost, and selectively removes the group or role with the lowest deletion cost. This targeted approach ensures that cluster resources are freed in a way that minimizes disruption, avoids unnecessary loss of high-priority workloads, and maintains optimal readiness for scaling large AI jobs.
Streamline Model Booster Configuration:
The configuration of Model Booster has been significantly streamlined to align with its goal of efficient and simple deployment. We have removed redundant features such as heterogeneous scaling between backends, routing weights, and dynamic Lora mounting to reduce complexity. Meanwhile, core capabilities like ModelMatch, custom schedulers, and multi-node deployment scenarios (e.g., Ray) are fully retained to ensure robust inference performance.
NOTE: These changes apply exclusively to Model Booster to ensure a streamlined user experience. Advanced features, including heterogeneous backend scaling, routing weights, and dynamic LoRA mounting, remain fully available in Model Serving.
This release includes the following artifacts:
- Helm Chart:
kthena.tgz(OCI artifact pushed to GHCR) - Installation YAML:
kthena-install.yaml - CLI Binaries: Pre-built binaries for Linux (amd64/arm64), macOS (amd64/arm64), and Windows (amd64)
Documentation
Release notes are automatically generated from commits.
What's Changed
Other Changes 🔄
- [release-0.2] [Docs] [v0.2.0] fix by @volcano-sh-bot in #554
Full Changelog: v0.2.0-rc.0...v0.2.0
v0.2.0-rc.0
This release includes the following artifacts:
- Helm Chart:
kthena.tgz(OCI artifact pushed to GHCR) - Installation YAML:
kthena-install.yaml - CLI Binaries: Pre-built binaries for Linux (amd64/arm64), macOS (amd64/arm64), and Windows (amd64)
Documentation
Release notes are automatically generated from commits.
What's Changed
Exciting New Features 🎉
- Revert "Remove ARM64 build to save quota (#305)" by @huntersman in #392
- Rename helm package by @huntersman in #413
- [CI] add go license-lint by @LiZhenCheng9527 in #410
- [CI] add python licenses lint by @LiZhenCheng9527 in #412
- [Docs] update docusaurus version by @git-malu in #428
- [Workflow] Enhances Helm chart workflow for main branch builds by @git-malu in #431
- [Workflow] add dependency between jobs by @git-malu in #436
- [release] [workflow] Simplifies release workflow by @git-malu in #439
- [Docs] update installation doc by @git-malu in #451
- [docs] update installtion doc. Add cert manager to prerequisite by @git-malu in #460
- [HELM] [manual certificate management] make kthena router also use the global cabundle by @git-malu in #461
- 🚀 Speed up docker build by @huntersman in #463
- [HELM] centralized certificate management config option by @git-malu in #492
- add role network topology proposal by @LiZhenCheng9527 in #501
- [Docs] add search bar for doc web page by @git-malu in #505
- [Docs] improve existing documentation for autoscaler by @git-malu in #513
- [feature]: binpack scale down by @LiZhenCheng9527 in #478
- gateway api support for router by @YaoZengzeng in #495
- [Feature] Support Network Topology Aware Scheduling in Group and Role Level by @LiZhenCheng9527 in #510
- [Docs] update model serving documentation by @git-malu in #540
- [Docs] use table to present scaling behaviors in the doc by @git-malu in #544
- gateway inference extension support by @YaoZengzeng in #528
- Streamline booster config by @zhiweideren in #542
Bug fixes 🐛
- fix bug of router blog by @YaoZengzeng in #426
- Add required permissions for CI by @huntersman in #435
- fix wrong labels for release by @huntersman in #441
- [release] [helm] make kthena-install.yaml include crd by @git-malu in #469
- Fix inconsistency between inner cache and cluster resources by @LiZhenCheng9527 in #470
- [BUG] Rename webhook & reenable webook by @git-malu in #480
- [Docs] [BUG] restore missing fields in crd-ref-doc by @git-malu in #491
- Update downloader image references to use the correct repository by @huntersman in #488
- bugfix: fix worker pod schedulerName by @googs1025 in #506
- chore: rename cluster name in e2e cleanup script by @YaoZengzeng in #507
- removed validation restrictions for modelserving schedulerName and added a default value of volcano. by @googs1025 in #504
- [Bug] fix bug about one pod role delete will not recreate by @LiZhenCheng9527 in #518
- fix: wrong order for
gen-docsandgen-copyrightby @huntersman in #537 - fix pod annotation error when scale up after binpack sacle down by @LiZhenCheng9527 in #550
Documentation Updates 📚
- add coc.md and developer user guide by @LiZhenCheng9527 in #396
- Update README.md by @huntersman in #415
- [Docs] update baseUrl to adapt to the new URL kthena.volcano.sh by @git-malu in #420
- Rename URL for documentation and blog by @huntersman in #422
- Blog of deep dive of the Kthena's Router by @YaoZengzeng in #421
- Add badge by @huntersman in #424
- [Governance] update code of conduct content by @kevin-wangzefeng in #432
- [Docs] update doc for v0.1.0 by @git-malu in #437
- Add release badge by @huntersman in #442
- [Doc] Add user-guild/autoscaler.md by @zl-cheng in #447
- fix wrong documentation by @huntersman in #449
- minor fix for documentation by @huntersman in #450
- Fix wrong spelling by @huntersman in #458
- add gie doc to sidebar by @YaoZengzeng in #467
- add binpack scale down proposal by @LiZhenCheng9527 in #473
- doc of Kthena router support GIE by @YaoZengzeng in #548
- [CLI] [Examples] only publish tested CR template by @git-malu in #499
- [Docs] release v0.2.0 by @git-malu in #551
Other Changes 🔄
- Add issue template by @hzxuzhonghu in #5
- Add gateway deployment yaml by @hzxuzhonghu in #1
- Add matrixinfer workload api by @wbc6080 in #6
- add PR template by @LiZhenCheng9527 in #8
- add service account by @YaoZengzeng in #17
- decoupling router and controllers by @hzxuzhonghu in #15
- add function of get metrics from vllm or sglang by @LiZhenCheng9527 in #7
- make infer gateway runnable by @YaoZengzeng in #24
- Least latency plugin implementation by @sgz9527 in #20
- Added port and protocol to ModelServer by @hzxuzhonghu in #23
- Update target port by @hzxuzhonghu in #11
- add ci by @YaoZengzeng in #26
- Add modelinfer controller basic framework by @wbc6080 in #18
- Added pod deletion and status handling in reconcile by @LiZhenCheng9527 in #27
- fix github action by @LiZhenCheng9527 in #28
- Add storage interface and modelinfer preliminary processing function by @wbc6080 in #32
- Prefix cache plugin implementation by @YaoZengzeng in #9
- Golangci lint by @hzxuzhonghu in #43
- add deleteInferGroup handler by @LiZhenCheng9527 in #35
- Add labels and envs to modelInfer api by @hzxuzhonghu in #40
- Add start informers and wait cache sync by @hzxuzhonghu in #44
- Add inferGroup replicas manage function by @wbc6080 in #36
- Add create pod function by @wbc6080 in #47
- Enable filter plugins by @YaoZengzeng in #29
- fix panic when delete no labels pod by @LiZhenCheng9527 in #48
- Fix generate entry-worker pod bug by @wbc6080 in #57
- Add modelinfer example by @wbc6080 in #60
- Add prow bot by @hzxuzhonghu in #61
- update lgtm workflow by @hzxuzhonghu in #63
- implement pd router by @YaoZengzeng in #39
- add samples of infer gateway by @YaoZengzeng in #65
- Add modelinfer Dockerfile and Deployment by @wbc6080 in #59
- Put all example CR to one directory by @huntersman in #67
- Delete blank issue template by @huntersman in https://...
Kthena v0.1.0
Kthena v0.1.0 Release Notes
Thanks to the efforts of all Kthena contributors, we are pleased to announce the official release of Kthena v0.1.0!
Kthena is a Kubernetes-native LLM inference platform designed for efficient deployment and management of Large Language Models in production. It uses declarative model lifecycle management and intelligent request routing for high performance and scalability, enabling cost-effective autoscaling and seamless integration with cloud-native workflows.
Highlights
- Intelligent, model-aware routing purpose-built for LLM serving workloads
- Simplified LLM lifecycle management via Kubernetes-native CRDs
- One-step LLM deployment and autoscaling with ModelBooster
- Ready-to-use templates for popular open LLMs
Intelligent Routing
Kthena Router is a Kubernetes-native, standalone inference router purpose-built for LLM serving workloads. Unlike generic proxies or load balancers, Kthena Router is model-aware and makes 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. The router integrates seamlessly with existing API gateway infrastructure while providing advanced capabilities specifically designed for AI workloads:
- Model-Aware Routing: Leverages real-time metrics from inference engines (vLLM, SGLang, TGI) to make intelligent routing decisions.
- LoRA-Aware Load Balancing: Intelligently routes to pods that have already loaded the desired LoRA adapter to reduce adapter swap latency from hundreds of milliseconds to near-zero.
- Advanced Scheduling Algorithms: Includes Prefix Cache Aware, KV Cache Aware, and Fairness Scheduling strategies.
- Prefill-Decode Disaggregation: Native support for xPyD (x-prefill/y-decode) deployment patterns.
Simplified LLM Management
Kthena introduces the ModelServing custom resource definition (CRD) to represent LLMs with a three-layer architecture: ModelServing → ServingGroup → Role. This structure makes it easy to express and manage various deployment strategies for LLMs, such as PD-disaggregation or native deployments.
- Each ServingGroup represents an LLM and supports gang scheduling and network topology-aware scheduling for the pods within a ServingGroup.
- ModelServing supports rolling updates, scaling, and restart policies at different granularities.
- Enables flexible definition and management of complex model service topologies for efficient resource utilization and seamless operations.
One-Step LLM Deployment
Kthena’s ModelBooster streamlines end-to-end model deployment in Kubernetes:
- Create a ModelBooster CR and let the modelbooster-controller handle the rest.
- The controller automatically creates all required resources—ModelServing, ModelServer, and ModelRoute—to build a complete inference system.
- Built-in autoscaling adjusts resource allocation based on system metrics to maximize efficiency.
- When the ModelBooster’s condition is “Active,” the model is ready to serve.
- Updates and deletes follow the same simple workflow.
Refer to the Quick Start guide to get up and running in minutes.
Getting Started
- Repository: volcano-sh/kthena
- Follow the Quick Start in the repository to deploy your first model with ModelBooster.
New Contributors
- @hzxuzhonghu made their first contribution in #5
- @wbc6080 made their first contribution in #6
- @LiZhenCheng9527 made their first contribution in #8
- @YaoZengzeng made their first contribution in #17
- @sgz9527 made their first contribution in #20
- @huntersman made their first contribution in #67
- @bytebingo made their first contribution in #38
- @zph-awby made their first contribution in #55
- @git-malu made their first contribution in #110
- @jmjn made their first contribution in #160
- @zl-cheng made their first contribution in #192
- @zhiweideren made their first contribution in #193
- @kevin-wangzefeng made their first contribution in #353
- @sceneryback made their first contribution in #399
Full Changelog: https://github.com/volcano-sh/kthena/commits/v0.1.0
Acknowledgements
A big thank you to all contributors and users who provided feedback and helped shape this first official release of Kthena.
v0.1.0-rc.1
What's Changed
Other Changes 🔄
- Add issue template by @hzxuzhonghu in #5
- Add gateway deployment yaml by @hzxuzhonghu in #1
- Add matrixinfer workload api by @wbc6080 in #6
- add PR template by @LiZhenCheng9527 in #8
- add service account by @YaoZengzeng in #17
- decoupling router and controllers by @hzxuzhonghu in #15
- add function of get metrics from vllm or sglang by @LiZhenCheng9527 in #7
- make infer gateway runnable by @YaoZengzeng in #24
- Least latency plugin implementation by @sgz9527 in #20
- Added port and protocol to ModelServer by @hzxuzhonghu in #23
- Update target port by @hzxuzhonghu in #11
- add ci by @YaoZengzeng in #26
- Add modelinfer controller basic framework by @wbc6080 in #18
- Added pod deletion and status handling in reconcile by @LiZhenCheng9527 in #27
- fix github action by @LiZhenCheng9527 in #28
- Add storage interface and modelinfer preliminary processing function by @wbc6080 in #32
- Prefix cache plugin implementation by @YaoZengzeng in #9
- Golangci lint by @hzxuzhonghu in #43
- add deleteInferGroup handler by @LiZhenCheng9527 in #35
- Add labels and envs to modelInfer api by @hzxuzhonghu in #40
- Add start informers and wait cache sync by @hzxuzhonghu in #44
- Add inferGroup replicas manage function by @wbc6080 in #36
- Add create pod function by @wbc6080 in #47
- Enable filter plugins by @YaoZengzeng in #29
- fix panic when delete no labels pod by @LiZhenCheng9527 in #48
- Fix generate entry-worker pod bug by @wbc6080 in #57
- Add modelinfer example by @wbc6080 in #60
- Add prow bot by @hzxuzhonghu in #61
- update lgtm workflow by @hzxuzhonghu in #63
- implement pd router by @YaoZengzeng in #39
- add samples of infer gateway by @YaoZengzeng in #65
- Add modelinfer Dockerfile and Deployment by @wbc6080 in #59
- Put all example CR to one directory by @huntersman in #67
- Delete blank issue template by @huntersman in #68
- Remove merge check to fix check by @wbc6080 in #70
- Add entry pod label by @wbc6080 in #76
- Fix point is nil panic by @wbc6080 in #71
- Add function to get models from pod by @LiZhenCheng9527 in #75
- handle
/v1/chat/completionsby @YaoZengzeng in #77 - Add kubebuilder validation by @hzxuzhonghu in #78
- make stream response timely by @YaoZengzeng in #83
- Add update pod function by @wbc6080 in #84
- add x-request-id when forwarding by @YaoZengzeng in #86
- RecoverPolicy should have omitempty by @huntersman in #89
- add update modelInfer Status function by @LiZhenCheng9527 in #58
- Fix the issue of not displaying when available replica is zero by @LiZhenCheng9527 in #91
- fix panic of infer gateway by @YaoZengzeng in #90
- remove stream fields for prefill req by @YaoZengzeng in #93
- Fix pod panic when delete modelinfer by @wbc6080 in #92
- Skip logging probe /healthz by @hzxuzhonghu in #97
- Model runtime implement by @bytebingo in #38
- implement ratelimit v1 by @zph-awby in #55
- Added Ratelimiton input/output tokens API by @hzxuzhonghu in #82
- more debug log for score plugins by @YaoZengzeng in #104
- Make ratelimiting impl respect the api configuration by @hzxuzhonghu in #106
- fix metric name of
vllm:num_requests_waitingby @YaoZengzeng in #112 - Fix modelinfer controller log by @wbc6080 in #109
- Fixed issue where pod already existed when creating a pod by @LiZhenCheng9527 in #98
- Codegen for model CRD, AutoscalingPolicy CRD, and webhooks by @git-malu in #110
- run datastore by @YaoZengzeng in #118
- Sync pods before model infer by @hzxuzhonghu in #116
- use gauge for metrics by @YaoZengzeng in #124
- Reducing the impact of TPOT and TTFT history on score by @LiZhenCheng9527 in #121
- Fix runningPod duplicate elements by @wbc6080 in #117
- fix panic when deleting modelserver by @YaoZengzeng in #126
- Fix a failed test case by @huntersman in #120
- fix calculation bug of gpu cache usage plugin by @YaoZengzeng in #128
- Separate component crd to make standalone deploy more easily by @hzxuzhonghu in #81
- Add example CR for model by @huntersman in #131
- Fix mis errors by @hzxuzhonghu in #127
- Github Action: use automerge by @hzxuzhonghu in #74
- Fix cache issue by @huntersman in #134
- revert change to the calculation of gpu cache usage score filter by @YaoZengzeng in #144
- Add leader election for model controller by @huntersman in #143
- Support multi arch image build with docker buildx by @hzxuzhonghu in #130
- Add gen-check by @hzxuzhonghu in #147
- remove prow action by @hzxuzhonghu in #146
- add copyright by @hzxuzhonghu in #148
- Support runtime port and url configuration by @huntersman in #149
- add webhook for registry by @git-malu in #132
- add failover handler of ai gateway by @LiZhenCheng9527 in #107
- Refactor(model-controller): no more use deprecated interface by @huntersman in #154
- Use shell script to add copyright by @huntersman in #152
- consider reqs running from
least requestsplugin by @YaoZengzeng in #135 - add modelinfer revision hash and rollupdate function by @wbc6080 in #113
- Changed unwanted error return values in datastore by @LiZhenCheng9527 in #155
- Support PD Disaggregation by @huntersman in #158
- Infer-gateway store perf optimize by @hzxuzhonghu in #153
- Replace controller runtime by @hzxuzhonghu in #162
- add llm mock by @YaoZengzeng in #161
- mark gateway ready after all resources have been handled by @hzxuzhonghu in #166
- Added field for modelInfer status by @LiZhenCheng9527 in #159
- Added tests and fix mis bugs to controller and store by @hzxuzhonghu in #167
- Handle DeletedFinalStateUnknown object by @hzxuzhonghu in #170
- Custom gemini config to update comment_severity_threshold from Medium… by @hzxuzhonghu in #173
- Pod should match the inferGroup revision instead of modelInfer revision by @hzxuzhonghu in #171
- Support Helm by @huntersman in #165
- Supports scheduling algorithm configuration by @zph-awby in #141
- [HELM] Updates registry webhook componen...