Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
9e368cf
feat(global-router): add a crate for types the Global Router componen…
atchernych Oct 26, 2026
008d8f2
refactor(global-router): drop doc comments that restate their items
atchernych Oct 26, 2026
71f89c9
fix(global-router): check a registration's model and correct three do…
atchernych Oct 27, 2026
8e30f3c
fix(global-router): let a client follow any lease the service grants
atchernych Oct 27, 2026
8b6c23e
feat(global-router): name a pool's PoolRelay by every address of its pod
atchernych Oct 27, 2026
c7ee161
test(global-router): drop checks the JSON round trips already make
atchernych Oct 27, 2026
48637b7
feat(global-router): add the pool discovery contract and its stores
atchernych Oct 27, 2026
03eae14
fix(global-router): mark a stale MCS view incomplete and log empty ones
atchernych Oct 27, 2026
36125d9
docs(global-router): say that an MCS watch stream waits for its first…
atchernych Oct 27, 2026
c410173
perf(global-router): read EndpointSlice lists from the API server's c…
atchernych Oct 27, 2026
959e2d5
perf(global-router): list EndpointSlices unpaged, so the cache serves…
atchernych Oct 27, 2026
a962b76
docs(global-router): say that pool Services need a ServiceExport, not…
atchernych Oct 27, 2026
1a1372a
fix(global-router): address the standards review of the discovery stores
atchernych Oct 27, 2026
ce637fc
fix(global-router): address the second review of the discovery stores
atchernych Oct 27, 2026
130aaef
fix(global-router): address the third review of the discovery stores
atchernych Oct 27, 2026
0d55a3c
feat(http-server): copy the reusable HTTP server core from #17178
atchernych Oct 26, 2026
8ae83b1
feat(global-router): add the Global Discovery HTTP service
atchernych Oct 27, 2026
4a70569
feat(global-router): add a container image and manifest for the Globa…
atchernych Oct 27, 2026
a38eb3d
fix(global-router): accept hyphenated pool suffixes and state the man…
atchernych Oct 27, 2026
d0dc8fb
fix(global-router): bound the lease the Global Discovery Service grants
atchernych Oct 27, 2026
f8d3d54
refactor(global-router): pass registrations and listings straight thr…
atchernych Oct 27, 2026
6db71b3
fix(global-router): bound how long the Kubernetes client waits
atchernych Oct 27, 2026
c6efecb
Merge branch 'main' into atchernych/global-common
atchernych Oct 28, 2026
4bb3f61
Merge branch 'atchernych/global-common' into atchernych/global-discov…
atchernych Oct 28, 2026
5d30317
Merge branch 'atchernych/global-discovery-service' into atchernych/gl…
atchernych Oct 28, 2026
7919ee9
Merge branch 'main' into atchernych/global-common
atchernych Oct 29, 2026
4323f2a
refactor(global-router): rename the shared types as reviewers asked
atchernych Oct 29, 2026
5aadafa
refactor(global-router): build the discovery client on the shared types
atchernych Oct 29, 2026
0a33716
Merge branch 'atchernych/global-common' into atchernych/global-discov…
atchernych Oct 29, 2026
69d703e
refactor(global-router): follow the shared types' renames
atchernych Oct 29, 2026
8428c92
Merge branch 'atchernych/global-discovery-service' into atchernych/gl…
atchernych Oct 29, 2026
e3f8acd
refactor(global-router): follow the shared types' renames
atchernych Oct 29, 2026
547d554
Merge branch 'main' into atchernych/global-discovery-service
atchernych Oct 29, 2026
2a80836
docs(global-router): document the stores' watch streams, as the bots …
atchernych Oct 29, 2026
459c03f
fix(global-router): use Karmada's real Service name limit, 55
atchernych Oct 29, 2026
c09f797
Merge branch 'atchernych/global-discovery-service' into atchernych/gl…
atchernych Oct 29, 2026
f5c0508
docs(global-router): word the Karmada name check for any exported Ser…
atchernych Oct 29, 2026
044d6b5
Merge branch 'atchernych/global-discovery-service' into atchernych/gl…
atchernych Oct 29, 2026
fb5ba6c
refactor(global-router): split --store into --pool-discovery and --re…
atchernych Oct 29, 2026
d829bc7
refactor(global-router): tighten the new flags after an adversarial r…
atchernych Oct 29, 2026
06b4f63
docs(global-router): call the discovery implementations backends, not…
atchernych Oct 29, 2026
4bd3635
Merge branch 'atchernych/global-discovery-service' into atchernych/gl…
atchernych Oct 29, 2026
f5d56c8
docs(global-router): document Multi-Cluster Services for the Global R…
estroz Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/codeowners/areas.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ areas:
- lib/llm/src/grpc/protos/
- lib/llm/src/grpc/service.rs
- lib/llm/src/grpc/service/
- lib/http-server/
- lib/llm/src/http.rs
- lib/llm/src/http/
- lib/llm/src/http/service.rs
Expand Down Expand Up @@ -73,10 +74,14 @@ areas:
path_globs:
- lib/global-view-broadcaster/
- components/src/dynamo/pool_relay/
- container/global-discovery-service.yaml
- lib/global-view-receiver/
- docs/fern/pages/developer-guide/knowledge-base/modular-components/router/multi-dc-kv-routing.md
- docs/fern/pages/developer-guide/**/multi-cluster-services-registry.md
- lib/global-*/**
- docs/fern/pages/kubernetes/kv-aware-routing/multi-cluster-services.md
- docs/fern/pages/kubernetes/kv-aware-routing/pool-relay.md
- docs/fern/pages/reference/components/global-discovery-mcs-configuration.md
- docs/fern/pages/reference/components/pool-relay-configuration.md
- lib/bindings/python/rust/llm/pool_relay.rs
- lib/llm/src/pool_relay.rs
Expand Down Expand Up @@ -1085,6 +1090,10 @@ shared:
owners:
- frontend
- observability
- glob: lib/http-server/src/metrics.rs
owners:
- frontend
- observability
- glob: lib/llm/src/kv_router/shared_cache.rs
owners:
- router
Expand Down Expand Up @@ -1284,6 +1293,10 @@ shared:
owners:
- operator
- backend-vllm
- glob: container/Dockerfile.global-discovery-service
owners:
- global-router
- ops
- glob: deploy/operator/Dockerfile
owners:
- operator
Expand Down
7 changes: 7 additions & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
* @ai-dynamo/dynamo-runtime-codeowners

# === frontend (@ai-dynamo/dynamo-frontend-codeowners) ===
/lib/http-server/ @ai-dynamo/dynamo-frontend-codeowners
/examples/chat_templates/ @ai-dynamo/dynamo-frontend-codeowners
/components/src/dynamo/frontend/ @ai-dynamo/dynamo-frontend-codeowners
/components/src/dynamo/frontend/tests/ @ai-dynamo/dynamo-frontend-codeowners
Expand Down Expand Up @@ -94,6 +95,7 @@
/lib/global-view-receiver/ @ai-dynamo/dynamo-global-router-codeowners
/lib/global-view-broadcaster/ @ai-dynamo/dynamo-global-router-codeowners
/components/src/dynamo/pool_relay/ @ai-dynamo/dynamo-global-router-codeowners
/container/global-discovery-service.yaml @ai-dynamo/dynamo-global-router-codeowners

# === backend-vllm (@ai-dynamo/dynamo-backend-vllm-codeowners) ===
/lib/sidecar/vllm/ @ai-dynamo/dynamo-backend-vllm-codeowners
Expand Down Expand Up @@ -600,7 +602,10 @@ requirements.txt
/components/src/dynamo/sglang/request_handlers/image_diffusion/ @ai-dynamo/dynamo-diffusion-codeowners
/recipes/kustomize/components/dynamo-openapi/dynamo-openapi.json @ai-dynamo/dynamo-operator-codeowners
/docs/fern/pages/reference/components/pool-relay-configuration.md @ai-dynamo/dynamo-global-router-codeowners
/docs/fern/pages/developer-guide/**/multi-cluster-services-registry.md @ai-dynamo/dynamo-global-router-codeowners
/docs/fern/pages/kubernetes/kv-aware-routing/multi-cluster-services.md @ai-dynamo/dynamo-global-router-codeowners
/recipes/templates/kustomize/components/dynamo-openapi/dynamo-openapi.json @ai-dynamo/dynamo-operator-codeowners
/docs/fern/pages/reference/components/global-discovery-mcs-configuration.md @ai-dynamo/dynamo-global-router-codeowners
/docs/fern/pages/developer-guide/knowledge-base/modular-components/backends/triton/ @ai-dynamo/dynamo-backend-triton-codeowners
/docs/fern/pages/developer-guide/knowledge-base/modular-components/router/multi-dc-kv-routing.md @ai-dynamo/dynamo-global-router-codeowners

Expand Down Expand Up @@ -663,6 +668,7 @@ requirements.txt
/examples/diffusers/Dockerfile @ai-dynamo/dynamo-diffusion-codeowners @ai-dynamo/dynamo-ops-codeowners
/lib/kvbm-logical/src/metrics/ @ai-dynamo/dynamo-kv-memory-codeowners @ai-dynamo/dynamo-observability-codeowners
/tests/serve/test_vllm_omni.py @ai-dynamo/dynamo-runtime-codeowners @ai-dynamo/dynamo-backend-vllm-codeowners
/lib/http-server/src/metrics.rs @ai-dynamo/dynamo-frontend-codeowners @ai-dynamo/dynamo-observability-codeowners
/tests/test_kustomize_matrix.py @ai-dynamo/dynamo-runtime-codeowners @ai-dynamo/dynamo-ops-codeowners
/.github/workflows/fern-docs.yml @ai-dynamo/dynamo-ops-codeowners @ai-dynamo/dynamo-docs-codeowners
/examples/deployments/**/vllm/** @ai-dynamo/dynamo-operator-codeowners @ai-dynamo/dynamo-backend-vllm-codeowners
Expand Down Expand Up @@ -758,6 +764,7 @@ requirements.txt
/components/src/dynamo/vllm/multimodal_utils/ @ai-dynamo/dynamo-backend-vllm-codeowners @ai-dynamo/dynamo-multimodal-codeowners
/deploy/inference-gateway/ext-proc/Dockerfile @ai-dynamo/dynamo-epp-codeowners @ai-dynamo/dynamo-router-codeowners @ai-dynamo/dynamo-ops-codeowners
/components/src/dynamo/trtllm/encode_helper.py @ai-dynamo/dynamo-backend-trtllm-codeowners @ai-dynamo/dynamo-multimodal-codeowners
/container/Dockerfile.global-discovery-service @ai-dynamo/dynamo-global-router-codeowners @ai-dynamo/dynamo-ops-codeowners
/container/templates/sglang_runtime.Dockerfile @ai-dynamo/dynamo-ops-codeowners @ai-dynamo/dynamo-backend-sglang-codeowners
/container/templates/trtllm_runtime.Dockerfile @ai-dynamo/dynamo-ops-codeowners @ai-dynamo/dynamo-backend-trtllm-codeowners
/tests/router/test_router_e2e_with_vllm_xpu.py @ai-dynamo/dynamo-router-codeowners @ai-dynamo/dynamo-xpu-codeowners @ai-dynamo/dynamo-backend-vllm-codeowners
Expand Down
42 changes: 42 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ members = [
"lib/kv-hashing",
"lib/mocker",
"lib/kv-router",
"lib/http-server",
"lib/global-common",
"lib/global-discovery-client",
"lib/global-discovery-service",
Expand Down Expand Up @@ -73,6 +74,7 @@ dynamo-truthy = { path = "lib/truthy", version = "1.7.0" }
dynamo-data-gen = { path = "lib/data-gen", version = "1.7.0" }
dynamo-kv-hashing = { path = "lib/kv-hashing", version = "1.7.0" }
dynamo-global-common = { path = "lib/global-common", version = "1.7.0" }
dynamo-http-server = { path = "lib/http-server", version = "1.7.0" }
dynamo-memory = { path = "lib/memory", version = "1.7.0" }
dynamo-mocker = { path = "lib/mocker", version = "1.7.0" }
dynamo-kv-router = { path = "lib/kv-router", version = "1.7.0" }
Expand Down
26 changes: 26 additions & 0 deletions container/Dockerfile.global-discovery-service
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# syntax=docker/dockerfile:1.10.0
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# CPU-only image for the Global Discovery Service, which serves pool discovery
# for the Global Router over HTTP; see global-discovery-service.yaml. Build it
# from the repository root:
# docker build -f container/Dockerfile.global-discovery-service -t global-discovery-service .
FROM rust:1.96.1-trixie AS builder
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential cmake pkg-config protobuf-compiler libclang-dev libssl-dev curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
COPY . .
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
--mount=type=cache,target=/usr/local/cargo/git,sharing=locked \
cargo build --locked --release -p dynamo-global-discovery-service --bin global-discovery-service

FROM debian:trixie-slim AS global-discovery-service
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates libstdc++6 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /workspace/target/release/global-discovery-service /usr/local/bin/global-discovery-service
USER 10001:0
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/global-discovery-service"]
116 changes: 116 additions & 0 deletions container/global-discovery-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# Global Discovery Service with pools from Karmada, applied directly to the hub
# cluster (not through Karmada). Replace IMAGE with the pushed image, for example:
# sed "s#IMAGE#<registry>/global-discovery-service:<tag>#" global-discovery-service.yaml | kubectl apply -f -
# It needs only read access to EndpointSlices. It lists the pools whose
# `<DGD name>-pool-relay` Services Karmada imports, and the replicas of the
# Global Router Service named by the --router-* arguments: set those to the
# router's namespace, its Service and the port PoolRelays connect to.
#
# It reads the imported slices with the pod's credentials, so this cluster
# needs a ServiceImport for each pool's PoolRelay Service and for the router
# Service. To read the Karmada control plane instead, which holds every
# exported Service's slices, mount its kubeconfig from a Secret, point
# KUBECONFIG at it, and grant the same read access there.
apiVersion: v1
kind: Namespace
metadata:
name: global-discovery
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: global-discovery-service
namespace: global-discovery
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: global-discovery-service
rules:
- apiGroups: ["discovery.k8s.io"]
resources: ["endpointslices"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: global-discovery-service
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: global-discovery-service
subjects:
- kind: ServiceAccount
name: global-discovery-service
namespace: global-discovery
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: global-discovery-service
namespace: global-discovery
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: global-discovery-service
template:
metadata:
labels:
app.kubernetes.io/name: global-discovery-service
spec:
serviceAccountName: global-discovery-service
securityContext:
runAsNonRoot: true
containers:
- name: global-discovery
image: IMAGE
args:
- --listen=0.0.0.0:8080
- --pool-discovery=karmada
- --router-namespace=global-discovery
- --router-service=global-router
- --router-port-name=http
env:
- name: DYN_LOG
value: info
ports:
- name: http
containerPort: 8080
readinessProbe:
httpGet:
path: /healthz
port: http
periodSeconds: 5
lifecycle:
# Keep serving while the Pod leaves the Service's endpoints.
preStop:
exec:
command: ["sleep", "5"]
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
memory: 256Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
---
apiVersion: v1
kind: Service
metadata:
name: global-discovery-service
namespace: global-discovery
spec:
selector:
app.kubernetes.io/name: global-discovery-service
ports:
- name: http
port: 8080
targetPort: http
9 changes: 9 additions & 0 deletions docs/fern/index.yml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ navigation:
path: pages/kubernetes/kv-aware-routing/dynamo-frontend.md
- page: Deploy the Pool Relay (Experimental)
path: pages/kubernetes/kv-aware-routing/pool-relay.md
- page: Deploy Multi-Cluster Services (Experimental)
path: pages/kubernetes/kv-aware-routing/multi-cluster-services.md
slug: multi-cluster-services
- page: Using GAIE with Dynamo
path: pages/kubernetes/kv-aware-routing/gateway-api.mdx
- page: Using GAIE with vanilla vLLM
Expand Down Expand Up @@ -478,6 +481,9 @@ navigation:
- page: Pool Relay Concepts (Experimental)
slug: multi-dc-kv-routing
path: pages/developer-guide/knowledge-base/modular-components/router/multi-dc-kv-routing.md
- page: Multi-Cluster Services Registry (Experimental)
slug: multi-cluster-services-registry
path: pages/developer-guide/knowledge-base/modular-components/router/multi-cluster-services-registry.md
- section: Standalone Services
skip-slug: true
collapsed: true
Expand Down Expand Up @@ -1272,6 +1278,9 @@ navigation:
path: pages/reference/components/dynosim-sweep-reference.mdx
- page: Global Router Configuration
path: pages/reference/components/global-router-configuration.mdx
- page: Multi-Cluster Services Configuration
path: pages/reference/components/global-discovery-mcs-configuration.md
slug: global-discovery-mcs-configuration
- page: Gateway API Routing
path: pages/reference/components/gateway-api-routing.mdx
- page: ThunderAgent Scheduler
Expand Down
Loading
Loading