1
1
package main
2
2
3
3
import (
4
- "context"
5
4
"flag"
6
5
"fmt"
7
6
"net"
@@ -10,10 +9,10 @@ import (
10
9
"strconv"
11
10
12
11
"github.com/prometheus/client_golang/prometheus/promhttp"
13
- "golang.org/x/sync/errgroup"
14
12
"google.golang.org/grpc"
15
13
healthPb "google.golang.org/grpc/health/grpc_health_v1"
16
14
"inference.networking.x-k8s.io/gateway-api-inference-extension/api/v1alpha1"
15
+ "inference.networking.x-k8s.io/gateway-api-inference-extension/internal/runnable"
17
16
"inference.networking.x-k8s.io/gateway-api-inference-extension/pkg/ext-proc/backend"
18
17
"inference.networking.x-k8s.io/gateway-api-inference-extension/pkg/ext-proc/backend/vllm"
19
18
"inference.networking.x-k8s.io/gateway-api-inference-extension/pkg/ext-proc/metrics"
@@ -26,6 +25,7 @@ import (
26
25
"k8s.io/component-base/metrics/legacyregistry"
27
26
klog "k8s.io/klog/v2"
28
27
ctrl "sigs.k8s.io/controller-runtime"
28
+ "sigs.k8s.io/controller-runtime/pkg/manager"
29
29
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
30
30
)
31
31
@@ -119,123 +119,73 @@ func run() error {
119
119
klog .ErrorS (err , "Failed to setup ext-proc server" )
120
120
return err
121
121
}
122
+ mgr := serverRunner .Manager
122
123
123
- k8sClient , err := kubernetes .NewForConfigAndClient (cfg , serverRunner . Manager .GetHTTPClient ())
124
+ k8sClient , err := kubernetes .NewForConfigAndClient (cfg , mgr .GetHTTPClient ())
124
125
if err != nil {
125
126
klog .ErrorS (err , "Failed to create client" )
126
127
return err
127
128
}
128
129
datastore .SetClient (k8sClient )
129
130
130
- if err := serverRunner . Setup (); err != nil {
131
- klog . ErrorS ( err , "Failed to setup server runner" )
131
+ // Register health server.
132
+ if err := registerHealthServer ( mgr , datastore , * grpcHealthPort ); err != nil {
132
133
return err
133
134
}
134
135
135
- // Start processing signals and init the group to manage goroutines.
136
- g , ctx := errgroup .WithContext (ctrl .SetupSignalHandler ())
137
-
138
- // Start health server.
139
- startHealthServer (ctx , g , datastore , * grpcHealthPort )
140
-
141
- // Start ext-proc server.
142
- g .Go (func () error {
143
- return serverRunner .Start (ctx , & vllm.PodMetricsClientImpl {})
144
- })
145
-
146
- // Start metrics handler.
147
- startMetricsHandler (ctx , g , * metricsPort , cfg )
136
+ // Register ext-proc server.
137
+ if err := mgr .Add (serverRunner .AsRunnable (& vllm.PodMetricsClientImpl {})); err != nil {
138
+ klog .ErrorS (err , "Failed to register ext-proc server" )
139
+ return err
140
+ }
148
141
149
- // Start manager .
150
- g . Go ( func () error {
151
- return serverRunner . StartManager ( ctx )
152
- })
142
+ // Register metrics handler .
143
+ if err := registerMetricsHandler ( mgr , * metricsPort , cfg ); err != nil {
144
+ return err
145
+ }
153
146
154
- err = g .Wait ()
155
- klog .InfoS ("All components terminated" )
156
- return err
147
+ // Start the manager.
148
+ return serverRunner .StartManager (ctrl .SetupSignalHandler ())
157
149
}
158
150
159
- // startHealthServer starts the gRPC health probe server using the given errgroup.
160
- func startHealthServer (ctx context.Context , g * errgroup.Group , ds * backend.K8sDatastore , port int ) {
161
- g .Go (func () error {
162
- klog .InfoS ("Health server starting..." )
163
-
164
- // Start listening.
165
- lis , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , port ))
166
- if err != nil {
167
- klog .ErrorS (err , "Health server failed to listen" )
168
- return err
169
- }
170
-
171
- klog .InfoS ("Health server listening" , "port" , port )
172
-
173
- svr := grpc .NewServer ()
174
- healthPb .RegisterHealthServer (svr , & healthServer {datastore : ds })
175
-
176
- // Shutdown on context closed.
177
- g .Go (func () error {
178
- <- ctx .Done ()
179
- klog .InfoS ("Health server shutting down..." )
180
- svr .GracefulStop ()
181
- return nil
182
- })
183
-
184
- // Keep serving until terminated.
185
- if err := svr .Serve (lis ); err != nil && err != grpc .ErrServerStopped {
186
- klog .ErrorS (err , "Health server failed" )
187
- return err
188
- }
189
- klog .InfoS ("Health server terminated" )
190
- return nil
191
- })
151
+ // registerHealthServer adds the Health gRPC server as a Runnable to the given manager.
152
+ func registerHealthServer (mgr manager.Manager , ds * backend.K8sDatastore , port int ) error {
153
+ srv := grpc .NewServer ()
154
+ healthPb .RegisterHealthServer (srv , & healthServer {datastore : ds })
155
+ if err := mgr .Add (
156
+ runnable .NoLeaderElection (runnable .GRPCServer ("health" , srv , port ))); err != nil {
157
+ klog .ErrorS (err , "Failed to register health server" )
158
+ return err
159
+ }
160
+ return nil
192
161
}
193
162
194
- // startMetricsHandler starts the metrics HTTP handler using the given errgroup.
195
- func startMetricsHandler (ctx context.Context , g * errgroup.Group , port int , cfg * rest.Config ) {
196
- g .Go (func () error {
197
- metrics .Register ()
198
- klog .InfoS ("Metrics HTTP handler starting..." )
163
+ // registerMetricsHandler adds the metrics HTTP handler as a Runnable to the given manager.
164
+ func registerMetricsHandler (mgr manager.Manager , port int , cfg * rest.Config ) error {
165
+ metrics .Register ()
199
166
200
- // Start listening.
201
- lis , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , port ))
202
- if err != nil {
203
- klog .ErrorS (err , "Metrics HTTP handler failed to listen" )
204
- return err
205
- }
206
-
207
- klog .InfoS ("Metrics HTTP handler listening" , "port" , port )
208
-
209
- // Init HTTP server.
210
- h , err := metricsHandlerWithAuthenticationAndAuthorization (cfg )
211
- if err != nil {
212
- return err
213
- }
214
-
215
- mux := http .NewServeMux ()
216
- mux .Handle (defaultMetricsEndpoint , h )
167
+ // Init HTTP server.
168
+ h , err := metricsHandlerWithAuthenticationAndAuthorization (cfg )
169
+ if err != nil {
170
+ return err
171
+ }
217
172
218
- svr := & http.Server {
219
- Addr : net .JoinHostPort ("" , strconv .Itoa (port )),
220
- Handler : mux ,
221
- }
173
+ mux := http .NewServeMux ()
174
+ mux .Handle (defaultMetricsEndpoint , h )
222
175
223
- // Shutdown on interrupt.
224
- g .Go (func () error {
225
- <- ctx .Done ()
226
- klog .InfoS ("Metrics HTTP handler shutting down..." )
227
- _ = svr .Shutdown (context .Background ())
228
- return nil
229
- })
176
+ srv := & http.Server {
177
+ Addr : net .JoinHostPort ("" , strconv .Itoa (port )),
178
+ Handler : mux ,
179
+ }
230
180
231
- // Keep serving until terminated.
232
- if err := svr . Serve ( lis ); err != http . ErrServerClosed {
233
- klog . ErrorS ( err , "Metrics HTTP handler failed" )
234
- return err
235
- }
236
- klog . InfoS ( "Metrics HTTP handler terminated" )
237
- return nil
238
- })
181
+ if err := mgr . Add ( & manager. Server {
182
+ Name : "metrics" ,
183
+ Server : srv ,
184
+ }); err != nil {
185
+ klog . ErrorS ( err , "Failed to register metrics HTTP handler" )
186
+ return err
187
+ }
188
+ return nil
239
189
}
240
190
241
191
func metricsHandlerWithAuthenticationAndAuthorization (cfg * rest.Config ) (http.Handler , error ) {
0 commit comments