Skip to content

Commit bdf1655

Browse files
authored
Merge pull request #261 from adrianmoisey/node-controller
Only start CloudNodeController when nessesary
2 parents ab0e4de + df74813 commit bdf1655

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

pkg/controller/controller.go

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
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

Comments
 (0)