Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1,476 changes: 755 additions & 721 deletions demos/grid-cloud-burst/README.md

Large diffs are not rendered by default.

202 changes: 202 additions & 0 deletions demos/grid-cloud-burst/example-manifests/08-regional-local-pools.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
# Two local llm-d-inference-sim providers per regional gateway.
# Names are intentionally shared across Deployment, Service, InferenceProvider,
# and provider-gateway load_balancer clusters.
apiVersion: v1
kind: ConfigMap
metadata:
name: llm-d-east-1-config
namespace: grid-system
data:
config.yaml: |
port: 8000
model: "gpt-4o-mini"
served-model-name: ["gpt-4o-mini"]
mode: "echo"
force-dummy-tokenizer: true
max-num-seqs: 4
max-waiting-queue-length: 128
fake-metrics:
running-requests: 0
waiting-requests: 0
kv-cache-usage: 0.1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: llm-d-east-2-config
namespace: grid-system
data:
config.yaml: |
port: 8000
model: "gpt-4o-mini"
served-model-name: ["gpt-4o-mini"]
mode: "echo"
force-dummy-tokenizer: true
max-num-seqs: 4
max-waiting-queue-length: 128
fake-metrics:
running-requests: 0
waiting-requests: 0
kv-cache-usage: 0.1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: llm-d-west-1-config
namespace: grid-system
data:
config.yaml: |
port: 8000
model: "gpt-4o-mini"
served-model-name: ["gpt-4o-mini"]
mode: "echo"
force-dummy-tokenizer: true
max-num-seqs: 4
max-waiting-queue-length: 128
fake-metrics:
running-requests: 0
waiting-requests: 0
kv-cache-usage: 0.1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: llm-d-west-2-config
namespace: grid-system
data:
config.yaml: |
port: 8000
model: "gpt-4o-mini"
served-model-name: ["gpt-4o-mini"]
mode: "echo"
force-dummy-tokenizer: true
max-num-seqs: 4
max-waiting-queue-length: 128
fake-metrics:
running-requests: 0
waiting-requests: 0
kv-cache-usage: 0.1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-d-east-1
namespace: grid-system
labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-east-1}
spec:
replicas: 1
selector: {matchLabels: {grid.praxis-proxy.io/pool: llm-d-east-1}}
template:
metadata: {labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-east-1}}
spec:
automountServiceAccountToken: false
securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}}
containers:
- name: simulator
image: ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
imagePullPolicy: IfNotPresent
args: ["--config", "/config/config.yaml"]
ports: [{name: http, containerPort: 8000}]
volumeMounts: [{name: config, mountPath: /config, readOnly: true}]
readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5}
securityContext: {allowPrivilegeEscalation: false, capabilities: {drop: [ALL]}, readOnlyRootFilesystem: true}
resources: {requests: {cpu: 100m, memory: 128Mi}, limits: {cpu: "1", memory: 512Mi}}
volumes: [{name: config, configMap: {name: llm-d-east-1-config}}]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-d-east-2
namespace: grid-system
labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-east-2}
spec:
replicas: 1
selector: {matchLabels: {grid.praxis-proxy.io/pool: llm-d-east-2}}
template:
metadata: {labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-east-2}}
spec:
automountServiceAccountToken: false
securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}}
containers:
- name: simulator
image: ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
imagePullPolicy: IfNotPresent
args: ["--config", "/config/config.yaml"]
ports: [{name: http, containerPort: 8000}]
volumeMounts: [{name: config, mountPath: /config, readOnly: true}]
readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5}
securityContext: {allowPrivilegeEscalation: false, capabilities: {drop: [ALL]}, readOnlyRootFilesystem: true}
resources: {requests: {cpu: 100m, memory: 128Mi}, limits: {cpu: "1", memory: 512Mi}}
volumes: [{name: config, configMap: {name: llm-d-east-2-config}}]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-d-west-1
namespace: grid-system
labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-west-1}
spec:
replicas: 1
selector: {matchLabels: {grid.praxis-proxy.io/pool: llm-d-west-1}}
template:
metadata: {labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-west-1}}
spec:
automountServiceAccountToken: false
securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}}
containers:
- name: simulator
image: ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
imagePullPolicy: IfNotPresent
args: ["--config", "/config/config.yaml"]
ports: [{name: http, containerPort: 8000}]
volumeMounts: [{name: config, mountPath: /config, readOnly: true}]
readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5}
securityContext: {allowPrivilegeEscalation: false, capabilities: {drop: [ALL]}, readOnlyRootFilesystem: true}
resources: {requests: {cpu: 100m, memory: 128Mi}, limits: {cpu: "1", memory: 512Mi}}
volumes: [{name: config, configMap: {name: llm-d-west-1-config}}]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-d-west-2
namespace: grid-system
labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-west-2}
spec:
replicas: 1
selector: {matchLabels: {grid.praxis-proxy.io/pool: llm-d-west-2}}
template:
metadata: {labels: {app.kubernetes.io/name: llm-d-inference-sim, grid.praxis-proxy.io/pool: llm-d-west-2}}
spec:
automountServiceAccountToken: false
securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}}
containers:
- name: simulator
image: ghcr.io/llm-d/llm-d-inference-sim:v0.10.2
imagePullPolicy: IfNotPresent
args: ["--config", "/config/config.yaml"]
ports: [{name: http, containerPort: 8000}]
volumeMounts: [{name: config, mountPath: /config, readOnly: true}]
readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5}
securityContext: {allowPrivilegeEscalation: false, capabilities: {drop: [ALL]}, readOnlyRootFilesystem: true}
resources: {requests: {cpu: 100m, memory: 128Mi}, limits: {cpu: "1", memory: 512Mi}}
volumes: [{name: config, configMap: {name: llm-d-west-2-config}}]
---
apiVersion: v1
kind: Service
metadata: {name: llm-d-east-1, namespace: grid-system}
spec: {selector: {grid.praxis-proxy.io/pool: llm-d-east-1}, ports: [{name: http, port: 8000, targetPort: http}]}
---
apiVersion: v1
kind: Service
metadata: {name: llm-d-east-2, namespace: grid-system}
spec: {selector: {grid.praxis-proxy.io/pool: llm-d-east-2}, ports: [{name: http, port: 8000, targetPort: http}]}
---
apiVersion: v1
kind: Service
metadata: {name: llm-d-west-1, namespace: grid-system}
spec: {selector: {grid.praxis-proxy.io/pool: llm-d-west-1}, ports: [{name: http, port: 8000, targetPort: http}]}
---
apiVersion: v1
kind: Service
metadata: {name: llm-d-west-2, namespace: grid-system}
spec: {selector: {grid.praxis-proxy.io/pool: llm-d-west-2}, ports: [{name: http, port: 8000, targetPort: http}]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Two local InferenceProviders per site. Use localityScope: sameSite on the
# GridNetwork so east and west remain isolated active groups.
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata: {name: llm-d-east-1, namespace: grid-system}
spec:
gridNetworkRef: grid-cloud-burst-rhoai
providerKind: llm-d-inference-sim
backendKind: local
endpoint: http://llm-d-east-1.grid-system.svc.cluster.local:8000
routingClusterRef: llm-d-east-1
capacityWeight: 50
models: [{name: gpt-4o-mini, capabilities: [text_generation], contextWindow: 4096}]
siteSelector: {matchLabels: {grid.praxis-proxy.io/provider-site: east-local}}
accessPolicy: {siteSelector: {matchLabels: {}}}
metricsConfig: {metricsEndpoint: http://llm-d-east-1.grid-system.svc.cluster.local:8000, path: /metrics, queueCapacity: 10, signalNames: {queueDepth: vllm:num_requests_waiting}, timeout: 2s}
healthCheck: {path: /health, interval: 5s, timeout: 2s}
---
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata: {name: llm-d-east-2, namespace: grid-system}
spec:
gridNetworkRef: grid-cloud-burst-rhoai
providerKind: llm-d-inference-sim
backendKind: local
endpoint: http://llm-d-east-2.grid-system.svc.cluster.local:8000
routingClusterRef: llm-d-east-2
capacityWeight: 50
models: [{name: gpt-4o-mini, capabilities: [text_generation], contextWindow: 4096}]
siteSelector: {matchLabels: {grid.praxis-proxy.io/provider-site: east-local}}
accessPolicy: {siteSelector: {matchLabels: {}}}
metricsConfig: {metricsEndpoint: http://llm-d-east-2.grid-system.svc.cluster.local:8000, path: /metrics, queueCapacity: 10, signalNames: {queueDepth: vllm:num_requests_waiting}, timeout: 2s}
healthCheck: {path: /health, interval: 5s, timeout: 2s}
---
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata: {name: llm-d-west-1, namespace: grid-system}
spec:
gridNetworkRef: grid-cloud-burst-rhoai
providerKind: llm-d-inference-sim
backendKind: local
endpoint: http://llm-d-west-1.grid-system.svc.cluster.local:8000
routingClusterRef: llm-d-west-1
capacityWeight: 50
models: [{name: gpt-4o-mini, capabilities: [text_generation], contextWindow: 4096}]
siteSelector: {matchLabels: {grid.praxis-proxy.io/provider-site: west-local}}
accessPolicy: {siteSelector: {matchLabels: {}}}
metricsConfig: {metricsEndpoint: http://llm-d-west-1.grid-system.svc.cluster.local:8000, path: /metrics, queueCapacity: 10, signalNames: {queueDepth: vllm:num_requests_waiting}, timeout: 2s}
healthCheck: {path: /health, interval: 5s, timeout: 2s}
---
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata: {name: llm-d-west-2, namespace: grid-system}
spec:
gridNetworkRef: grid-cloud-burst-rhoai
providerKind: llm-d-inference-sim
backendKind: local
endpoint: http://llm-d-west-2.grid-system.svc.cluster.local:8000
routingClusterRef: llm-d-west-2
capacityWeight: 50
models: [{name: gpt-4o-mini, capabilities: [text_generation], contextWindow: 4096}]
siteSelector: {matchLabels: {grid.praxis-proxy.io/provider-site: west-local}}
accessPolicy: {siteSelector: {matchLabels: {}}}
metricsConfig: {metricsEndpoint: http://llm-d-west-2.grid-system.svc.cluster.local:8000, path: /metrics, queueCapacity: 10, signalNames: {queueDepth: vllm:num_requests_waiting}, timeout: 2s}
healthCheck: {path: /health, interval: 5s, timeout: 2s}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: jaeger
namespace: grid-system
labels:
app.kubernetes.io/name: jaeger
app.kubernetes.io/part-of: grid-cloud-burst
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: jaeger
template:
metadata:
labels:
app.kubernetes.io/name: jaeger
app.kubernetes.io/part-of: grid-cloud-burst
spec:
containers:
- name: jaeger
image: jaegertracing/all-in-one:1.57
imagePullPolicy: IfNotPresent
env:
- name: COLLECTOR_OTLP_ENABLED
value: "true"
ports:
- name: otlp-grpc
containerPort: 4317
- name: query
containerPort: 16686
readinessProbe:
httpGet:
path: /
port: query
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: jaeger-collector
namespace: grid-system
labels:
app.kubernetes.io/name: jaeger
spec:
selector:
app.kubernetes.io/name: jaeger
ports:
- name: otlp-grpc
port: 4317
targetPort: otlp-grpc
---
apiVersion: v1
kind: Service
metadata:
name: jaeger-query
namespace: grid-system
labels:
app.kubernetes.io/name: jaeger
spec:
selector:
app.kubernetes.io/name: jaeger
ports:
- name: query
port: 16686
targetPort: query
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# OpenAI is an overflow provider. Its InferenceProvider endpoint must describe
# the real external backend; the provider-gateway route separately owns the
# final-hop TLS/authority and credential injection configuration. The paired
# provider-gateway ConfigMaps must set both tls.sni and http.authority to
# api.openai.com; SNI alone can produce HTTP 421 from the upstream. In Praxis
# configuration authority is nested under the cluster's http field.
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata:
name: openai-east
namespace: grid-system
spec:
gridNetworkRef: grid-cloud-burst-rhoai
backendKind: api_provider
providerKind: openai
endpoint: https://api.openai.com
routingClusterRef: openai-east
capacityWeight: 50
models:
- name: gpt-4o-mini
capabilities: [text_generation]
contextWindow: 4096
auth:
strategy: bearer_token
manual: true
secretRef: {name: openai-api-key, namespace: grid-system, key: token}
siteSelector:
matchLabels: {grid.praxis-proxy.io/provider-site: east-cloud}
accessPolicy: {siteSelector: {matchLabels: {}}}
---
apiVersion: grid.praxis-proxy.io/v1alpha1
kind: InferenceProvider
metadata:
name: openai-west
namespace: grid-system
spec:
gridNetworkRef: grid-cloud-burst-rhoai
backendKind: api_provider
providerKind: openai
endpoint: https://api.openai.com
routingClusterRef: openai-west
capacityWeight: 50
models:
- name: gpt-4o-mini
capabilities: [text_generation]
contextWindow: 4096
auth:
strategy: bearer_token
manual: true
secretRef: {name: openai-api-key, namespace: grid-system, key: token}
siteSelector:
matchLabels: {grid.praxis-proxy.io/provider-site: west-cloud}
accessPolicy: {siteSelector: {matchLabels: {}}}
Loading
Loading