@@ -145,6 +145,14 @@ func (ir *informerResources) CopyTo(fakeClient *fakeclientset.Clientset, newFact
145
145
return nil
146
146
}
147
147
148
+ func metricsProviderListToMap (providersList []api.MetricsProvider ) map [api.MetricsSource ]* api.MetricsProvider {
149
+ providersMap := make (map [api.MetricsSource ]* api.MetricsProvider )
150
+ for _ , provider := range providersList {
151
+ providersMap [provider .Source ] = & provider
152
+ }
153
+ return providersMap
154
+ }
155
+
148
156
func newDescheduler (ctx context.Context , rs * options.DeschedulerServer , deschedulerPolicy * api.DeschedulerPolicy , evictionPolicyGroupVersion string , eventRecorder events.EventRecorder , sharedInformerFactory , namespacedSharedInformerFactory informers.SharedInformerFactory ) (* descheduler , error ) {
149
157
podInformer := sharedInformerFactory .Core ().V1 ().Pods ().Informer ()
150
158
@@ -198,9 +206,7 @@ func newDescheduler(ctx context.Context, rs *options.DeschedulerServer, deschedu
198
206
metricsProviders : make (map [api.MetricsSource ]* api.MetricsProvider ),
199
207
}
200
208
201
- for _ , provider := range deschedulerPolicy .MetricsProviders {
202
- desch .metricsProviders [provider .Source ] = & provider
203
- }
209
+ desch .metricsProviders = metricsProviderListToMap (deschedulerPolicy .MetricsProviders )
204
210
205
211
if rs .MetricsClient != nil {
206
212
nodeSelector := labels .Everything ()
@@ -215,12 +221,16 @@ func newDescheduler(ctx context.Context, rs *options.DeschedulerServer, deschedu
215
221
}
216
222
217
223
prometheusProvider := desch .metricsProviders [api .PrometheusMetrics ]
218
- if namespacedSharedInformerFactory != nil && prometheusProvider != nil {
219
- if prometheusProvider .Prometheus == nil || prometheusProvider .Prometheus .AuthToken == nil || prometheusProvider .Prometheus .AuthToken .SecretReference == nil {
224
+ if prometheusProvider != nil && prometheusProvider .Prometheus != nil && prometheusProvider .Prometheus .AuthToken != nil {
225
+ authTokenSecret := prometheusProvider .Prometheus .AuthToken .SecretReference
226
+ if authTokenSecret == nil || authTokenSecret .Namespace == "" {
220
227
return nil , fmt .Errorf ("prometheus metrics source configuration is missing authentication token secret" )
221
228
}
229
+ if namespacedSharedInformerFactory == nil {
230
+ return nil , fmt .Errorf ("namespacedSharedInformerFactory not configured" )
231
+ }
222
232
namespacedSharedInformerFactory .Core ().V1 ().Secrets ().Informer ().AddEventHandler (desch .eventHandler ())
223
- desch .namespacedSecretsLister = namespacedSharedInformerFactory .Core ().V1 ().Secrets ().Lister ().Secrets (desch . metricsProviders [ api . PrometheusMetrics ]. Prometheus . AuthToken . SecretReference .Namespace )
233
+ desch .namespacedSecretsLister = namespacedSharedInformerFactory .Core ().V1 ().Secrets ().Lister ().Secrets (authTokenSecret .Namespace )
224
234
}
225
235
226
236
return desch , nil
@@ -299,6 +309,10 @@ func (d *descheduler) sync() error {
299
309
// clear the token if the secret is not found
300
310
if apierrors .IsNotFound (err ) {
301
311
d .currentPrometheusAuthToken = ""
312
+ if d .previousPrometheusClientTransport != nil {
313
+ d .previousPrometheusClientTransport .CloseIdleConnections ()
314
+ }
315
+ d .previousPrometheusClientTransport = nil
302
316
}
303
317
return fmt .Errorf ("unable to get %v/%v secret" , ns , name )
304
318
}
@@ -474,13 +488,8 @@ func Run(ctx context.Context, rs *options.DeschedulerServer) error {
474
488
return err
475
489
}
476
490
477
- hasKubernetesMetricsProvider := false
478
- for _ , provider := range deschedulerPolicy .MetricsProviders {
479
- if provider .Source == api .KubernetesMetrics {
480
- hasKubernetesMetricsProvider = true
481
- break
482
- }
483
- }
491
+ providersMap := metricsProviderListToMap (deschedulerPolicy .MetricsProviders )
492
+ _ , hasKubernetesMetricsProvider := providersMap [api .KubernetesMetrics ]
484
493
if (deschedulerPolicy .MetricsCollector != nil && deschedulerPolicy .MetricsCollector .Enabled ) || hasKubernetesMetricsProvider {
485
494
metricsClient , err := client .CreateMetricsClient (clientConnection , "descheduler" )
486
495
if err != nil {
@@ -594,23 +603,17 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
594
603
defer eventBroadcaster .Shutdown ()
595
604
596
605
var namespacedSharedInformerFactory informers.SharedInformerFactory
597
- saTokenReconciliation := noReconciliation
598
-
599
- var prometheusConfiguration * api.Prometheus
600
- for _ , provider := range deschedulerPolicy .MetricsProviders {
601
- if provider .Source == api .PrometheusMetrics {
602
- prometheusConfiguration = provider .Prometheus
603
- }
604
- }
606
+ metricProviderTokenReconciliation := noReconciliation
605
607
606
- if prometheusConfiguration != nil && prometheusConfiguration .URL != "" {
607
- if prometheusConfiguration .AuthToken != nil {
608
+ prometheusProvider := metricsProviderListToMap (deschedulerPolicy .MetricsProviders )[api .PrometheusMetrics ]
609
+ if prometheusProvider != nil && prometheusProvider .Prometheus != nil && prometheusProvider .Prometheus .URL != "" {
610
+ if prometheusProvider .Prometheus .AuthToken != nil {
608
611
// Will get reconciled
609
- namespacedSharedInformerFactory = informers .NewSharedInformerFactoryWithOptions (rs .Client , 0 , informers .WithTransform (trimManagedFields ), informers .WithNamespace (prometheusConfiguration .AuthToken .SecretReference .Namespace ))
610
- saTokenReconciliation = secretReconciliation
612
+ namespacedSharedInformerFactory = informers .NewSharedInformerFactoryWithOptions (rs .Client , 0 , informers .WithTransform (trimManagedFields ), informers .WithNamespace (prometheusProvider . Prometheus .AuthToken .SecretReference .Namespace ))
613
+ metricProviderTokenReconciliation = secretReconciliation
611
614
} else {
612
615
// Use the sa token and assume it has the sufficient permissions to authenticate
613
- saTokenReconciliation = inClusterReconciliation
616
+ metricProviderTokenReconciliation = inClusterReconciliation
614
617
}
615
618
}
616
619
@@ -623,13 +626,13 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
623
626
defer cancel ()
624
627
625
628
sharedInformerFactory .Start (ctx .Done ())
626
- if saTokenReconciliation == secretReconciliation {
629
+ if metricProviderTokenReconciliation == secretReconciliation {
627
630
namespacedSharedInformerFactory .Start (ctx .Done ())
628
631
}
629
632
630
633
sharedInformerFactory .WaitForCacheSync (ctx .Done ())
631
634
descheduler .podEvictor .WaitForEventHandlersSync (ctx )
632
- if saTokenReconciliation == secretReconciliation {
635
+ if metricProviderTokenReconciliation == secretReconciliation {
633
636
namespacedSharedInformerFactory .WaitForCacheSync (ctx .Done ())
634
637
}
635
638
@@ -647,12 +650,12 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
647
650
}
648
651
}
649
652
650
- if saTokenReconciliation == secretReconciliation {
653
+ if metricProviderTokenReconciliation == secretReconciliation {
651
654
go descheduler .runAuthenticationSecretReconciler (ctx )
652
655
}
653
656
654
657
wait .NonSlidingUntil (func () {
655
- if saTokenReconciliation == inClusterReconciliation {
658
+ if metricProviderTokenReconciliation == inClusterReconciliation {
656
659
// Read the sa token and assume it has the sufficient permissions to authenticate
657
660
if err := descheduler .reconcileInClusterSAToken (); err != nil {
658
661
klog .ErrorS (err , "unable to reconcile an in cluster SA token" )
0 commit comments