@@ -19,19 +19,18 @@ package nfdworker
1919import (
2020 "encoding/json"
2121 "fmt"
22- "net"
22+ "net/http "
2323 "os"
2424 "path/filepath"
2525 "regexp"
2626 "sort"
2727 "strings"
2828 "time"
2929
30+ "github.com/prometheus/client_golang/prometheus"
31+ "github.com/prometheus/client_golang/prometheus/promhttp"
3032 "golang.org/x/exp/maps"
3133 "golang.org/x/net/context"
32- "google.golang.org/grpc"
33- "google.golang.org/grpc/health"
34- "google.golang.org/grpc/health/grpc_health_v1"
3534 "k8s.io/apimachinery/pkg/api/errors"
3635 "k8s.io/apimachinery/pkg/types"
3736 "k8s.io/apimachinery/pkg/util/validation"
@@ -93,14 +92,13 @@ type Labels map[string]string
9392
9493// Args are the command line arguments of NfdWorker.
9594type Args struct {
96- ConfigFile string
97- Klog map [string ]* utils.KlogFlagVal
98- Kubeconfig string
99- Oneshot bool
100- Options string
101- MetricsPort int
102- GrpcHealthPort int
103- NoOwnerRefs bool
95+ ConfigFile string
96+ Klog map [string ]* utils.KlogFlagVal
97+ Kubeconfig string
98+ Oneshot bool
99+ Options string
100+ Port int
101+ NoOwnerRefs bool
104102
105103 Overrides ConfigOverrideArgs
106104}
@@ -118,7 +116,6 @@ type nfdWorker struct {
118116 configFilePath string
119117 config * NFDConfig
120118 kubernetesNamespace string
121- healthServer * grpc.Server
122119 k8sClient k8sclient.Interface
123120 nfdClient nfdclient.Interface
124121 stop chan struct {} // channel for signaling stop
@@ -206,6 +203,10 @@ func newDefaultConfig() *NFDConfig {
206203 }
207204}
208205
206+ func (w * nfdWorker ) Healthz (writer http.ResponseWriter , _ * http.Request ) {
207+ writer .WriteHeader (http .StatusOK )
208+ }
209+
209210func (i * infiniteTicker ) Reset (d time.Duration ) {
210211 switch {
211212 case d > 0 :
@@ -217,29 +218,6 @@ func (i *infiniteTicker) Reset(d time.Duration) {
217218 }
218219}
219220
220- func (w * nfdWorker ) startGrpcHealthServer (errChan chan <- error ) error {
221- lis , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , w .args .GrpcHealthPort ))
222- if err != nil {
223- return fmt .Errorf ("failed to listen: %w" , err )
224- }
225-
226- s := grpc .NewServer ()
227- grpc_health_v1 .RegisterHealthServer (s , health .NewServer ())
228- klog .InfoS ("gRPC health server serving" , "port" , w .args .GrpcHealthPort )
229-
230- go func () {
231- defer func () {
232- lis .Close ()
233- }()
234- if err := s .Serve (lis ); err != nil {
235- errChan <- fmt .Errorf ("gRPC health server exited with an error: %w" , err )
236- }
237- klog .InfoS ("gRPC health server stopped" )
238- }()
239- w .healthServer = s
240- return nil
241- }
242-
243221// Run feature discovery.
244222func (w * nfdWorker ) runFeatureDiscovery () error {
245223 discoveryStart := time .Now ()
@@ -324,15 +302,13 @@ func (w *nfdWorker) Run() error {
324302 labelTrigger .Reset (w .config .Core .SleepInterval .Duration )
325303 defer labelTrigger .Stop ()
326304
305+ httpMux := http .NewServeMux ()
306+
327307 // Register to metrics server
328- if w .args .MetricsPort > 0 {
329- m := utils .CreateMetricsServer (w .args .MetricsPort ,
330- buildInfo ,
331- featureDiscoveryDuration )
332- go m .Run ()
333- registerVersion (version .Get ())
334- defer m .Stop ()
335- }
308+ promRegistry := prometheus .NewRegistry ()
309+ promRegistry .MustRegister (buildInfo , featureDiscoveryDuration )
310+ httpMux .Handle ("/metrics" , promhttp .HandlerFor (promRegistry , promhttp.HandlerOpts {}))
311+ registerVersion (version .Get ())
336312
337313 err = w .runFeatureDiscovery ()
338314 if err != nil {
@@ -344,20 +320,19 @@ func (w *nfdWorker) Run() error {
344320 return nil
345321 }
346322
347- grpcErr := make (chan error )
323+ // Register health endpoint (at this point we're "ready and live")
324+ httpMux .HandleFunc ("/healthz" , w .Healthz )
348325
349- // Start gRPC server for liveness probe (at this point we're "live")
350- if w .args .GrpcHealthPort != 0 {
351- if err := w .startGrpcHealthServer (grpcErr ); err != nil {
352- return fmt .Errorf ("failed to start gRPC health server: %w" , err )
353- }
354- }
326+ // Start HTTP server
327+ httpServer := http.Server {Addr : fmt .Sprintf (":%d" , w .args .Port ), Handler : httpMux }
328+ go func () {
329+ klog .InfoS ("http server starting" , "port" , httpServer .Addr )
330+ klog .InfoS ("http server stopped" , "exitCode" , httpServer .ListenAndServe ())
331+ }()
332+ defer httpServer .Close ()
355333
356334 for {
357335 select {
358- case err := <- grpcErr :
359- return fmt .Errorf ("error in serving gRPC: %w" , err )
360-
361336 case <- labelTrigger .C :
362337 err = w .runFeatureDiscovery ()
363338 if err != nil {
@@ -366,9 +341,6 @@ func (w *nfdWorker) Run() error {
366341
367342 case <- w .stop :
368343 klog .InfoS ("shutting down nfd-worker" )
369- if w .healthServer != nil {
370- w .healthServer .GracefulStop ()
371- }
372344 return nil
373345 }
374346 }
0 commit comments