7
7
"sync"
8
8
"time"
9
9
10
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
11
"k8s.io/apimachinery/pkg/util/sets"
11
12
"k8s.io/apimachinery/pkg/util/wait"
12
13
utilfeature "k8s.io/apiserver/pkg/util/feature"
@@ -15,6 +16,8 @@ import (
15
16
"k8s.io/client-go/rest"
16
17
"k8s.io/client-go/tools/clientcmd"
17
18
cloudprovider "k8s.io/cloud-provider"
19
+ cloudproviderapi "k8s.io/cloud-provider/api"
20
+
18
21
nodecontroller "k8s.io/cloud-provider/controllers/node"
19
22
servicecontroller "k8s.io/cloud-provider/controllers/service"
20
23
controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers"
@@ -228,22 +231,32 @@ func startCloudControllerManager(ctx context.Context, clusterName string, kubeCl
228
231
ctx , cancel := context .WithCancel (ctx )
229
232
go serviceController .Run (ctx , 5 , ccmMetrics )
230
233
231
- // Start the node controller
232
- nodeController , err := nodecontroller .NewCloudNodeController (
233
- sharedInformers .Core ().V1 ().Nodes (),
234
- kubeClient ,
235
- cloud ,
236
- 30 * time .Second ,
237
- 5 , // workers
238
- )
234
+ nodeController := & nodecontroller.CloudNodeController {}
235
+
236
+ hasCloudProviderTaint , err := getCloudProviderTaint (ctx , clusterName , kubeClient )
239
237
if err != nil {
240
- // This error shouldn't fail. It lives like this as a legacy.
241
- klog .Errorf ("Failed to start node controller: %v" , err )
238
+ klog .Errorf ("Failed get cluster nodes: %v" , err )
242
239
cancel ()
243
240
return nil , err
244
241
}
245
- go nodeController .Run (ctx .Done (), ccmMetrics )
246
242
243
+ if hasCloudProviderTaint {
244
+ // Start the node controller
245
+ nodeController , err = nodecontroller .NewCloudNodeController (
246
+ sharedInformers .Core ().V1 ().Nodes (),
247
+ kubeClient ,
248
+ cloud ,
249
+ 30 * time .Second ,
250
+ 5 , // workers
251
+ )
252
+ if err != nil {
253
+ // This error shouldn't fail. It lives like this as a legacy.
254
+ klog .Errorf ("Failed to start node controller: %v" , err )
255
+ cancel ()
256
+ return nil , err
257
+ }
258
+ go nodeController .Run (ctx .Done (), ccmMetrics )
259
+ }
247
260
sharedInformers .Start (ctx .Done ())
248
261
249
262
// This has to cleanup all the resources allocated by the cloud provider in this cluster
@@ -301,3 +314,18 @@ func (c *Controller) cleanup() {
301
314
delete (c .clusters , cluster )
302
315
}
303
316
}
317
+
318
+ func getCloudProviderTaint (ctx context.Context , clusterName string , kubeClient kubernetes.Interface ) (bool , error ) {
319
+ nodes , err := kubeClient .CoreV1 ().Nodes ().List (ctx , metav1.ListOptions {})
320
+ if err != nil {
321
+ return false , fmt .Errorf ("failed to list nodes for cluster %s: %w" , clusterName , err )
322
+ }
323
+ for _ , node := range nodes .Items {
324
+ for _ , taint := range node .Spec .Taints {
325
+ if taint .Key == cloudproviderapi .TaintExternalCloudProvider {
326
+ return true , nil
327
+ }
328
+ }
329
+ }
330
+ return false , nil
331
+ }
0 commit comments