77 "sync"
88 "time"
99
10+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011 "k8s.io/apimachinery/pkg/util/sets"
1112 "k8s.io/apimachinery/pkg/util/wait"
1213 utilfeature "k8s.io/apiserver/pkg/util/feature"
@@ -15,6 +16,8 @@ import (
1516 "k8s.io/client-go/rest"
1617 "k8s.io/client-go/tools/clientcmd"
1718 cloudprovider "k8s.io/cloud-provider"
19+ cloudproviderapi "k8s.io/cloud-provider/api"
20+
1821 nodecontroller "k8s.io/cloud-provider/controllers/node"
1922 servicecontroller "k8s.io/cloud-provider/controllers/service"
2023 controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers"
@@ -228,22 +231,32 @@ func startCloudControllerManager(ctx context.Context, clusterName string, kubeCl
228231 ctx , cancel := context .WithCancel (ctx )
229232 go serviceController .Run (ctx , 5 , ccmMetrics )
230233
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 )
239237 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 )
242239 cancel ()
243240 return nil , err
244241 }
245- go nodeController .Run (ctx .Done (), ccmMetrics )
246242
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+ }
247260 sharedInformers .Start (ctx .Done ())
248261
249262 // This has to cleanup all the resources allocated by the cloud provider in this cluster
@@ -301,3 +314,18 @@ func (c *Controller) cleanup() {
301314 delete (c .clusters , cluster )
302315 }
303316}
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