Skip to content

Commit 8bfa141

Browse files
committed
update helm chart to use preferred backends for gke
Signed-off-by: Radhika Lakhtakia <rlakhtakia@google.com>
1 parent 8fa2015 commit 8bfa141

6 files changed

Lines changed: 194 additions & 29 deletions

File tree

config/charts/llm-d-router-gateway/templates/gke.yaml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,30 @@ spec:
5858
grpcHealthCheck:
5959
portSpecification: "USE_FIXED_PORT"
6060
port: {{ $eppHealthPort }}
61+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
62+
---
63+
kind: HealthCheckPolicy
64+
apiVersion: networking.gke.io/v1
65+
metadata:
66+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
67+
namespace: {{ .Release.Namespace }}
68+
labels:
69+
{{- include "llm-d-router.labels" . | nindent 4 }}
70+
spec:
71+
targetRef:
72+
group: ""
73+
kind: Service
74+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
75+
default:
76+
config:
77+
type: GRPC
78+
grpcHealthCheck:
79+
portSpecification: "USE_FIXED_PORT"
80+
port: {{ $eppHealthPort }}
81+
{{- end }}
6182
{{- end }}
6283
---
84+
{{- if not .Values.router.epp.gkePreferredBackends.enabled }}
6385
apiVersion: networking.gke.io/v1
6486
kind: GCPBackendPolicy
6587
metadata:
@@ -78,4 +100,52 @@ spec:
78100
enabled: true # log all requests by default
79101
---
80102
{{- end }}
103+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
104+
apiVersion: networking.gke.io/v1
105+
kind: GCPBackendPolicy
106+
metadata:
107+
name: {{ .Release.Name }}
108+
namespace: {{ .Release.Namespace }}
109+
spec:
110+
targetRef:
111+
group: ""
112+
kind: Service
113+
name: {{ include "llm-d-router.name" . }}
114+
default:
115+
timeoutSec: 300
116+
backendPreference: PREFERRED
117+
{{- if .Values.router.epp.gkePreferredBackends.balancingMode }}
118+
balancingMode: {{ .Values.router.epp.gkePreferredBackends.balancingMode }}
119+
{{- end }}
120+
{{- if .Values.router.epp.gkePreferredBackends.maxRatePerEndpoint }}
121+
maxRatePerEndpoint: {{ .Values.router.epp.gkePreferredBackends.maxRatePerEndpoint }}
122+
{{- end }}
123+
{{- if .Values.router.epp.gkePreferredBackends.capacityScalerPercent }}
124+
capacityScalerPercent: {{ .Values.router.epp.gkePreferredBackends.capacityScalerPercent }}
125+
{{- end }}
126+
---
127+
apiVersion: networking.gke.io/v1
128+
kind: GCPBackendPolicy
129+
metadata:
130+
name: {{ printf "%s-backup" .Release.Name }}
131+
namespace: {{ .Release.Namespace }}
132+
spec:
133+
targetRef:
134+
group: ""
135+
kind: Service
136+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
137+
default:
138+
timeoutSec: 300
139+
backendPreference: DEFAULT
140+
{{- if .Values.router.epp.gkePreferredBackends.balancingMode }}
141+
balancingMode: {{ .Values.router.epp.gkePreferredBackends.balancingMode }}
142+
{{- end }}
143+
{{- if .Values.router.epp.gkePreferredBackends.maxRatePerEndpoint }}
144+
maxRatePerEndpoint: {{ .Values.router.epp.gkePreferredBackends.maxRatePerEndpoint }}
145+
{{- end }}
146+
{{- if .Values.router.epp.gkePreferredBackends.capacityScalerPercent }}
147+
capacityScalerPercent: {{ .Values.router.epp.gkePreferredBackends.capacityScalerPercent }}
148+
{{- end }}
149+
{{- end }}
150+
{{- end }}
81151
{{- include "llm-d-router.gke" . -}}

config/charts/routerlib/templates/_deployment.yaml

Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,4 @@
1-
{{- define "llm-d-epp.deployment" -}}
2-
apiVersion: apps/v1
3-
kind: Deployment
4-
metadata:
5-
name: {{ include "llm-d-router.name" . }}
6-
namespace: {{ .Release.Namespace }}
7-
labels:
8-
{{- include "llm-d-router.labels" . | nindent 4 }}
9-
{{- include "llm-d-router.modeLabels" . | nindent 4 }}
10-
spec:
11-
replicas: {{ .Values.router.epp.replicas | default 1 }}
12-
strategy:
13-
# The current recommended EPP deployment pattern is to have a single active replica. This ensures
14-
# optimal performance of the stateful operations such prefix cache aware scorer.
15-
# The Recreate strategy the old replica is killed immediately, and allow the new replica(s) to
16-
# quickly take over. This is particularly important in the high availability set up with leader
17-
# election, as the rolling update strategy would prevent the old leader being killed because
18-
# otherwise the maxUnavailable would be 100%.
19-
type: Recreate
20-
selector:
21-
matchLabels:
22-
{{- include "llm-d-router.selectorLabels" . | nindent 6 }}
23-
template:
24-
metadata:
25-
labels:
26-
{{- include "llm-d-router.selectorLabels" . | nindent 8 }}
27-
{{- include "llm-d-router.modeLabels" . | nindent 8 }}
28-
spec:
1+
{{- define "llm-d-epp.deployment-pod-spec" -}}
292
{{- $proxy := include "llm-d-router.proxy" . | fromYaml | default dict }}
303
{{- $proxyType := include "llm-d-router.proxyType" . | trim }}
314
{{- $proxyMode := include "llm-d-router.proxyMode" . | trim }}
@@ -129,7 +102,7 @@ spec:
129102
- "json"
130103
- --config-file
131104
- "/config/{{ .Values.router.epp.pluginsConfigFile }}"
132-
{{- if gt (.Values.router.epp.replicas | int) 1 }}
105+
{{- if and (gt (.Values.router.epp.replicas | int) 1) (not .Values.router.epp.gkePreferredBackends.enabled) }}
133106
- --ha-enable-leader-election
134107
{{- end }}
135108
{{- $grpcHealthPort := .Values.router.epp.grpcHealthPort | default 9003 }}
@@ -305,5 +278,67 @@ spec:
305278
tolerations:
306279
{{- toYaml .Values.router.epp.tolerations | nindent 8 }}
307280
{{- end }}
281+
{{- end }}
282+
283+
{{- define "llm-d-epp.deployment" -}}
284+
apiVersion: apps/v1
285+
kind: Deployment
286+
metadata:
287+
name: {{ include "llm-d-router.name" . }}
288+
namespace: {{ .Release.Namespace }}
289+
labels:
290+
{{- include "llm-d-router.labels" . | nindent 4 }}
291+
{{- include "llm-d-router.modeLabels" . | nindent 4 }}
292+
spec:
293+
{{- $replicas := .Values.router.epp.replicas | default 1 }}
294+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
295+
{{- $replicas = .Values.router.epp.gkePreferredBackends.preferredReplicas | default 1 }}
296+
{{- end }}
297+
replicas: {{ $replicas }}
298+
strategy:
299+
type: Recreate
300+
selector:
301+
matchLabels:
302+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
303+
llm-d-router-gateway: {{ include "llm-d-router.name" . }}
304+
{{- else }}
305+
{{- include "llm-d-router.selectorLabels" . | nindent 6 }}
306+
{{- end }}
307+
template:
308+
metadata:
309+
labels:
310+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
311+
llm-d-router-gateway: {{ include "llm-d-router.name" . }}
312+
{{- else }}
313+
{{- include "llm-d-router.selectorLabels" . | nindent 8 }}
314+
{{- end }}
315+
{{- include "llm-d-router.modeLabels" . | nindent 8 }}
316+
spec:
317+
{{ include "llm-d-epp.deployment-pod-spec" . }}
318+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
319+
---
320+
apiVersion: apps/v1
321+
kind: Deployment
322+
metadata:
323+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
324+
namespace: {{ .Release.Namespace }}
325+
labels:
326+
{{- include "llm-d-router.labels" . | nindent 4 }}
327+
{{- include "llm-d-router.modeLabels" . | nindent 4 }}
328+
spec:
329+
replicas: {{ .Values.router.epp.gkePreferredBackends.defaultReplicas | default 1 }}
330+
strategy:
331+
type: Recreate
332+
selector:
333+
matchLabels:
334+
llm-d-router-gateway: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
335+
template:
336+
metadata:
337+
labels:
338+
llm-d-router-gateway: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
339+
{{- include "llm-d-router.modeLabels" . | nindent 8 }}
340+
spec:
341+
{{ include "llm-d-epp.deployment-pod-spec" . }}
342+
{{- end }}
308343
---
309344
{{- end }}

config/charts/routerlib/templates/_helpers.tpl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,25 @@ EPP resource validations
397397
{{/*
398398
EPP generic validations
399399
*/}}
400+
{{- define "llm-d-router.validations.epp.preferredBackends" -}}
401+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
402+
{{- $preferredReplicas := .Values.router.epp.gkePreferredBackends.preferredReplicas | default 1 | int }}
403+
{{- $defaultReplicas := .Values.router.epp.gkePreferredBackends.defaultReplicas | default 1 | int }}
404+
{{- if lt $preferredReplicas 1 }}
405+
{{- fail ".Values.router.epp.gkePreferredBackends.preferredReplicas must be at least 1 when gkePreferredBackends.enabled is true" }}
406+
{{- end }}
407+
{{- if lt $defaultReplicas 1 }}
408+
{{- fail ".Values.router.epp.gkePreferredBackends.defaultReplicas must be at least 1 when gkePreferredBackends.enabled is true" }}
409+
{{- end }}
410+
{{- end }}
411+
{{- end -}}
412+
400413
{{- define "llm-d-router.validations.epp" -}}
401414
{{- include "llm-d-router.validations.deprecations" . }}
402415
{{- include "llm-d-router.validations.epp.resources" . }}
403416
{{- include "llm-d-router.validations.epp.inferenceObjectives" . }}
404417
{{- include "llm-d-router.validations.epp.tokenizer" . }}
418+
{{- include "llm-d-router.validations.epp.preferredBackends" . }}
405419
{{- end -}}
406420

407421
{{/*

config/charts/routerlib/templates/_inferencepool.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ spec:
2626
{{- end }}
2727
{{- end }}
2828
endpointPickerRef:
29+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
30+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
31+
{{- else }}
2932
name: {{ include "llm-d-router.name" . }}
33+
{{- end }}
3034
port:
3135
number: {{ .Values.router.epp.extProcPort | default 9002 }}
3236
failureMode: {{ .Values.router.inferencePool.failureMode | default "FailOpen" }}

config/charts/routerlib/templates/_service.yaml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,22 @@ metadata:
66
namespace: {{ .Release.Namespace }}
77
labels:
88
{{- include "llm-d-router.labels" . | nindent 4 }}
9+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
10+
annotations:
11+
cloud.google.com/neg: '{"exposed_ports":{"{{ .Values.router.epp.extProcPort | default 9002 }}":{}}}'
12+
{{- end }}
913
spec:
1014
selector:
15+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
16+
llm-d-router-gateway: {{ include "llm-d-router.name" . }}
17+
{{- else }}
1118
{{- include "llm-d-router.selectorLabels" . | nindent 4 }}
19+
{{- end }}
1220
ports:
1321
- name: grpc-ext-proc
1422
protocol: TCP
1523
port: {{ .Values.router.epp.extProcPort | default 9002 }}
24+
appProtocol: kubernetes.io/h2c
1625
- name: http-metrics
1726
protocol: TCP
1827
port: {{ .Values.router.metricsPort | default 9090 }}
@@ -21,4 +30,24 @@ spec:
2130
{{- end }}
2231
type: ClusterIP
2332
---
33+
{{- if .Values.router.epp.gkePreferredBackends.enabled }}
34+
apiVersion: v1
35+
kind: Service
36+
metadata:
37+
name: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
38+
namespace: {{ .Release.Namespace }}
39+
labels:
40+
{{- include "llm-d-router.labels" . | nindent 4 }}
41+
annotations:
42+
cloud.google.com/neg: '{"exposed_ports":{"{{ .Values.router.epp.extProcPort | default 9002 }}":{}}}'
43+
spec:
44+
selector:
45+
llm-d-router-gateway: {{ printf "%s-backup" (include "llm-d-router.name" .) }}
46+
ports:
47+
- name: grpc-ext-proc
48+
protocol: TCP
49+
port: {{ .Values.router.epp.extProcPort | default 9002 }}
50+
appProtocol: kubernetes.io/h2c
51+
type: ClusterIP
52+
{{- end }}
2453
{{- end }}

config/charts/routerlib/values.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@ clusterDomain: cluster.local
55

66
epp:
77
replicas: 1
8+
gkePreferredBackends:
9+
enabled: false
10+
# Number of primary active pod instances pinned to the PREFERRED load balancing tier.
11+
# Setting >1 scales concurrent active routing.
12+
preferredReplicas: 1
13+
# Number of standby pod instances pinned to the DEFAULT load balancing tier.
14+
# Setting >1 scales warm standby failover capacity.
15+
defaultReplicas: 1
16+
# Benchmark capacity and threshold settings for PREFERRED load balancing tier.
17+
# When incoming traffic exceeds capacityScalerPercent of maxRatePerEndpoint, excess traffic spills over to DEFAULT standby pods.
18+
balancingMode: RATE
19+
maxRatePerEndpoint: 100
20+
capacityScalerPercent: 100
821
image:
922
registry: ghcr.io/llm-d
1023
repository: llm-d-router-endpoint-picker-dev

0 commit comments

Comments
 (0)