1
1
package main
2
2
3
3
import (
4
- "context"
5
4
"flag"
6
5
"fmt"
7
6
"net"
8
7
"net/http"
8
+ "os"
9
9
"strconv"
10
10
11
11
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -21,10 +21,12 @@ import (
21
21
klog "k8s.io/klog/v2"
22
22
ctrl "sigs.k8s.io/controller-runtime"
23
23
"sigs.k8s.io/controller-runtime/pkg/log/zap"
24
+ "sigs.k8s.io/controller-runtime/pkg/manager"
24
25
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
25
26
"sigs.k8s.io/gateway-api-inference-extension/api/v1alpha1"
26
27
"sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/backend"
27
28
"sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/backend/vllm"
29
+ "sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/internal/runnable"
28
30
"sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/metrics"
29
31
runserver "sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/server"
30
32
"sigs.k8s.io/gateway-api-inference-extension/pkg/ext-proc/util/logging"
@@ -88,6 +90,12 @@ func init() {
88
90
}
89
91
90
92
func main () {
93
+ if err := run (); err != nil {
94
+ os .Exit (1 )
95
+ }
96
+ }
97
+
98
+ func run () error {
91
99
opts := zap.Options {
92
100
Development : true ,
93
101
}
@@ -97,11 +105,13 @@ func main() {
97
105
98
106
cfg , err := ctrl .GetConfig ()
99
107
if err != nil {
100
- klog .Fatalf ("Failed to get rest config: %v" , err )
108
+ klog .ErrorS (err , "Failed to get rest config" )
109
+ return err
101
110
}
102
111
// Validate flags
103
112
if err := validateFlags (); err != nil {
104
- klog .Fatalf ("Failed to validate flags: %v" , err )
113
+ klog .ErrorS (err , "Failed to validate flags" )
114
+ return err
105
115
}
106
116
107
117
// Print all flag values
@@ -127,37 +137,30 @@ func main() {
127
137
Config : ctrl .GetConfigOrDie (),
128
138
Datastore : datastore ,
129
139
}
130
- serverRunner .Setup ()
131
-
132
- // Start health and ext-proc servers in goroutines
133
- healthSvr := startHealthServer (datastore , * grpcHealthPort )
134
- extProcSvr := serverRunner .Start (
135
- datastore ,
136
- & vllm.PodMetricsClientImpl {},
137
- )
138
- // Start metrics handler
139
- metricsSvr := startMetricsHandler (* metricsPort , cfg )
140
-
141
- // Start manager, blocking
142
- serverRunner .StartManager ()
140
+ if err := serverRunner .Setup (); err != nil {
141
+ klog .ErrorS (err , "Failed to setup ext-proc server" )
142
+ return err
143
+ }
144
+ mgr := serverRunner .Manager
143
145
144
- // Gracefully shutdown servers
145
- if healthSvr != nil {
146
- klog .Info ("Health server shutting down" )
147
- healthSvr .GracefulStop ()
146
+ // Register health server.
147
+ if err := registerHealthServer (mgr , datastore , * grpcHealthPort ); err != nil {
148
+ return err
148
149
}
149
- if extProcSvr != nil {
150
- klog .Info ("Ext-proc server shutting down" )
151
- extProcSvr .GracefulStop ()
150
+
151
+ // Register ext-proc server.
152
+ if err := mgr .Add (serverRunner .AsRunnable (datastore , & vllm.PodMetricsClientImpl {})); err != nil {
153
+ klog .ErrorS (err , "Failed to register ext-proc server" )
154
+ return err
152
155
}
153
- if metricsSvr != nil {
154
- klog .Info ("Metrics server shutting down" )
155
- if err := metricsSvr .Shutdown (context .Background ()); err != nil {
156
- klog .Infof ("Metrics server Shutdown: %v" , err )
157
- }
156
+
157
+ // Register metrics handler.
158
+ if err := registerMetricsHandler (mgr , * metricsPort , cfg ); err != nil {
159
+ return err
158
160
}
159
161
160
- klog .Info ("All components shutdown" )
162
+ // Start the manager.
163
+ return serverRunner .StartManager (ctrl .SetupSignalHandler ())
161
164
}
162
165
163
166
func initLogging (opts * zap.Options ) {
@@ -179,68 +182,69 @@ func initLogging(opts *zap.Options) {
179
182
klog .SetLogger (logger )
180
183
}
181
184
182
- // startHealthServer starts the gRPC health probe server in a goroutine.
183
- func startHealthServer (ds * backend.K8sDatastore , port int ) * grpc.Server {
184
- svr := grpc .NewServer ()
185
- healthPb .RegisterHealthServer (svr , & healthServer {datastore : ds })
186
-
187
- go func () {
188
- lis , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , port ))
189
- if err != nil {
190
- klog .Fatalf ("Health server failed to listen: %v" , err )
191
- }
192
- klog .Infof ("Health server listening on port: %d" , port )
193
-
194
- // Blocking and will return when shutdown is complete.
195
- if err := svr .Serve (lis ); err != nil && err != grpc .ErrServerStopped {
196
- klog .Fatalf ("Health server failed: %v" , err )
197
- }
198
- klog .Info ("Health server shutting down" )
199
- }()
200
- return svr
185
+ // registerHealthServer adds the Health gRPC server as a Runnable to the given manager.
186
+ func registerHealthServer (mgr manager.Manager , ds * backend.K8sDatastore , port int ) error {
187
+ srv := grpc .NewServer ()
188
+ healthPb .RegisterHealthServer (srv , & healthServer {datastore : ds })
189
+ if err := mgr .Add (
190
+ runnable .NoLeaderElection (runnable .GRPCServer ("health" , srv , port ))); err != nil {
191
+ klog .ErrorS (err , "Failed to register health server" )
192
+ return err
193
+ }
194
+ return nil
201
195
}
202
196
203
- func startMetricsHandler (port int , cfg * rest.Config ) * http.Server {
197
+ // registerMetricsHandler adds the metrics HTTP handler as a Runnable to the given manager.
198
+ func registerMetricsHandler (mgr manager.Manager , port int , cfg * rest.Config ) error {
204
199
metrics .Register ()
205
200
206
- var svr * http.Server
207
- go func () {
208
- klog .Info ("Starting metrics HTTP handler ..." )
201
+ // Init HTTP server.
202
+ h , err := metricsHandlerWithAuthenticationAndAuthorization (cfg )
203
+ if err != nil {
204
+ return err
205
+ }
206
+
207
+ mux := http .NewServeMux ()
208
+ mux .Handle (defaultMetricsEndpoint , h )
209
209
210
- mux := http .NewServeMux ()
211
- mux .Handle (defaultMetricsEndpoint , metricsHandlerWithAuthenticationAndAuthorization (cfg ))
210
+ srv := & http.Server {
211
+ Addr : net .JoinHostPort ("" , strconv .Itoa (port )),
212
+ Handler : mux ,
213
+ }
212
214
213
- svr = & http.Server {
214
- Addr : net .JoinHostPort ("" , strconv .Itoa (port )),
215
- Handler : mux ,
216
- }
217
- if err := svr .ListenAndServe (); err != http .ErrServerClosed {
218
- klog .Fatalf ("failed to start metrics HTTP handler: %v" , err )
219
- }
220
- }()
221
- return svr
215
+ if err := mgr .Add (& manager.Server {
216
+ Name : "metrics" ,
217
+ Server : srv ,
218
+ }); err != nil {
219
+ klog .ErrorS (err , "Failed to register metrics HTTP handler" )
220
+ return err
221
+ }
222
+ return nil
222
223
}
223
224
224
- func metricsHandlerWithAuthenticationAndAuthorization (cfg * rest.Config ) http.Handler {
225
+ func metricsHandlerWithAuthenticationAndAuthorization (cfg * rest.Config ) ( http.Handler , error ) {
225
226
h := promhttp .HandlerFor (
226
227
legacyregistry .DefaultGatherer ,
227
228
promhttp.HandlerOpts {},
228
229
)
229
230
httpClient , err := rest .HTTPClientFor (cfg )
230
231
if err != nil {
231
- klog .Fatalf ("failed to create http client for metrics auth: %v" , err )
232
+ klog .ErrorS (err , "Failed to create http client for metrics auth" )
233
+ return nil , err
232
234
}
233
235
234
236
filter , err := filters .WithAuthenticationAndAuthorization (cfg , httpClient )
235
237
if err != nil {
236
- klog .Fatalf ("failed to create metrics filter for auth: %v" , err )
238
+ klog .ErrorS (err , "Failed to create metrics filter for auth" )
239
+ return nil , err
237
240
}
238
241
metricsLogger := klog .LoggerWithValues (klog .NewKlogr (), "path" , defaultMetricsEndpoint )
239
242
metricsAuthHandler , err := filter (metricsLogger , h )
240
243
if err != nil {
241
- klog .Fatalf ("failed to create metrics auth handler: %v" , err )
244
+ klog .ErrorS (err , "Failed to create metrics auth handler" )
245
+ return nil , err
242
246
}
243
- return metricsAuthHandler
247
+ return metricsAuthHandler , nil
244
248
}
245
249
246
250
func validateFlags () error {
0 commit comments