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