Skip to content

Commit 1a93136

Browse files
committed
Only start CloudNodeController when nessesary
Only start the CloudNodeController when the cloud provider provided IP addresses annotation exists.
1 parent ab0e4de commit 1a93136

1 file changed

Lines changed: 36 additions & 13 deletions

File tree

pkg/controller/controller.go

Lines changed: 36 additions & 13 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,42 @@ 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+
clustersInterface, ok := cloud.Clusters()
235+
if !ok {
236+
klog.Fatalf("Unable to use clusters interface: %v", err)
237+
}
238+
239+
masterName, err := clustersInterface.Master(ctx, clusterName)
239240
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)
242-
cancel()
243-
return nil, err
241+
klog.Fatalf("unable to determine control plane node name: %v", err)
244242
}
245-
go nodeController.Run(ctx.Done(), ccmMetrics)
246243

244+
node, err := kubeClient.CoreV1().Nodes().Get(ctx, masterName, metav1.GetOptions{})
245+
if err != nil {
246+
klog.Fatalf("error getting node: %v", err)
247+
cancel()
248+
}
249+
_, exists := node.ObjectMeta.Annotations[cloudproviderapi.AnnotationAlphaProvidedIPAddr]
250+
251+
nodeController := &nodecontroller.CloudNodeController{}
252+
253+
if exists {
254+
// Start the node controller
255+
nodeController, err = nodecontroller.NewCloudNodeController(
256+
sharedInformers.Core().V1().Nodes(),
257+
kubeClient,
258+
cloud,
259+
30*time.Second,
260+
5, // workers
261+
)
262+
if err != nil {
263+
// This error shouldn't fail. It lives like this as a legacy.
264+
klog.Errorf("Failed to start node controller: %v", err)
265+
cancel()
266+
return nil, err
267+
}
268+
go nodeController.Run(ctx.Done(), ccmMetrics)
269+
}
247270
sharedInformers.Start(ctx.Done())
248271

249272
// This has to cleanup all the resources allocated by the cloud provider in this cluster

0 commit comments

Comments
 (0)