@@ -71,6 +71,12 @@ const (
71
71
stackIPv6 clusterStackType = "IPv6"
72
72
)
73
73
74
+ // enableNodeTopology is bound to a command-line flag. When true, it enables
75
+ // generating nodeTopology custom resource based on node's subnetwork configuration,
76
+ // which is represented by a node label. Enabling this feature also assumes that a
77
+ // nodeTopology CR named 'default' is already installed.
78
+ var enableNodeTopology bool
79
+
74
80
// cloudCIDRAllocator allocates node CIDRs according to IP address aliases
75
81
// assigned by the cloud provider. In this case, the allocation and
76
82
// deallocation is delegated to the external provider, and the controller
@@ -100,7 +106,7 @@ type cloudCIDRAllocator struct {
100
106
var _ CIDRAllocator = (* cloudCIDRAllocator )(nil )
101
107
102
108
// NewCloudCIDRAllocator creates a new cloud CIDR allocator.
103
- func NewCloudCIDRAllocator (client clientset.Interface , cloud cloudprovider.Interface , nwInformer networkinformer.NetworkInformer , gnpInformer networkinformer.GKENetworkParamSetInformer , nodeTopologyClient nodetopologyclientset.Interface , nodeInformer informers.NodeInformer , allocatorParams CIDRAllocatorParams ) (CIDRAllocator , error ) {
109
+ func NewCloudCIDRAllocator (client clientset.Interface , cloud cloudprovider.Interface , nwInformer networkinformer.NetworkInformer , gnpInformer networkinformer.GKENetworkParamSetInformer , nodeTopologyClient nodetopologyclientset.Interface , enableMultiSubnetCluster bool , nodeInformer informers.NodeInformer , allocatorParams CIDRAllocatorParams ) (CIDRAllocator , error ) {
104
110
if client == nil {
105
111
klog .Fatalf ("kubeClient is nil when starting NodeController" )
106
112
}
@@ -131,24 +137,16 @@ func NewCloudCIDRAllocator(client clientset.Interface, cloud cloudprovider.Inter
131
137
stackType = stackIPv6
132
138
}
133
139
134
- nodeTopologySyncer := & NodeTopologySyncer {
135
- nodeTopologyClient : nodeTopologyClient ,
136
- cloud : gceCloud ,
137
- nodeLister : nodeInformer .Lister (),
138
- }
139
- nodetopologyQueue := NewTaskQueue ("nodetopologgTaskQueue" , "nodetopologyCRD" , nodeTopologyWorkers , nodeTopologyKeyFun , nodeTopologySyncer .sync )
140
-
141
140
ca := & cloudCIDRAllocator {
142
- client : client ,
143
- cloud : gceCloud ,
144
- networksLister : nwInformer .Lister (),
145
- gnpLister : gnpInformer .Lister (),
146
- nodeLister : nodeInformer .Lister (),
147
- nodesSynced : nodeInformer .Informer ().HasSynced ,
148
- recorder : recorder ,
149
- queue : workqueue .NewRateLimitingQueueWithConfig (workqueue .DefaultControllerRateLimiter (), workqueue.RateLimitingQueueConfig {Name : workqueueName }),
150
- nodeTopologyQueue : nodetopologyQueue ,
151
- stackType : stackType ,
141
+ client : client ,
142
+ cloud : gceCloud ,
143
+ networksLister : nwInformer .Lister (),
144
+ gnpLister : gnpInformer .Lister (),
145
+ nodeLister : nodeInformer .Lister (),
146
+ nodesSynced : nodeInformer .Informer ().HasSynced ,
147
+ recorder : recorder ,
148
+ queue : workqueue .NewRateLimitingQueueWithConfig (workqueue .DefaultControllerRateLimiter (), workqueue.RateLimitingQueueConfig {Name : workqueueName }),
149
+ stackType : stackType ,
152
150
}
153
151
154
152
nodeInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
@@ -174,26 +172,32 @@ func NewCloudCIDRAllocator(client clientset.Interface, cloud cloudprovider.Inter
174
172
}),
175
173
DeleteFunc : nodeutil .CreateDeleteNodeHandler (ca .ReleaseCIDR ),
176
174
})
177
- nodeInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
178
- AddFunc : nodeutil .CreateAddNodeHandler (func (node * v1.Node ) error {
179
- if ca .nodeTopologyQueue != nil {
175
+
176
+ enableNodeTopology = enableMultiSubnetCluster
177
+ if enableNodeTopology {
178
+ nodeTopologySyncer := & NodeTopologySyncer {
179
+ nodeTopologyClient : nodeTopologyClient ,
180
+ cloud : gceCloud ,
181
+ nodeLister : nodeInformer .Lister (),
182
+ }
183
+ nodetopologyQueue := NewTaskQueue ("nodetopologyTaskQueue" , "nodetopologyCRD" , nodeTopologyWorkers , nodeTopologyKeyFun , nodeTopologySyncer .sync )
184
+ ca .nodeTopologyQueue = nodetopologyQueue
185
+
186
+ nodeInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
187
+ AddFunc : nodeutil .CreateAddNodeHandler (func (node * v1.Node ) error {
180
188
ca .nodeTopologyQueue .Enqueue (node )
181
- }
182
- return nil
183
- }),
184
- UpdateFunc : nodeutil .CreateUpdateNodeHandler (func (oldNode , newNode * v1.Node ) error {
185
- if ca .nodeTopologyQueue != nil {
189
+ return nil
190
+ }),
191
+ UpdateFunc : nodeutil .CreateUpdateNodeHandler (func (oldNode , newNode * v1.Node ) error {
186
192
nodetopologyQueue .Enqueue (newNode )
187
- }
188
- return nil
189
- }),
190
- DeleteFunc : nodeutil .CreateDeleteNodeHandler (func (node * v1.Node ) error {
191
- if ca .nodeTopologyQueue != nil {
193
+ return nil
194
+ }),
195
+ DeleteFunc : nodeutil .CreateDeleteNodeHandler (func (node * v1.Node ) error {
192
196
nodetopologyQueue .Enqueue (node )
193
- }
194
- return nil
195
- }),
196
- })
197
+ return nil
198
+ }),
199
+ })
200
+ }
197
201
198
202
nwInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
199
203
AddFunc : func (originalObj interface {}) {
@@ -270,8 +274,6 @@ func (ca *cloudCIDRAllocator) Run(stopCh <-chan struct{}) {
270
274
ctx , cancelFn := context .WithCancel (context .Background ())
271
275
defer cancelFn ()
272
276
defer ca .queue .ShutDown ()
273
- defer ca .nodeTopologyQueue .Shutdown ()
274
-
275
277
klog .Infof ("Starting cloud CIDR allocator" )
276
278
defer klog .Infof ("Shutting down cloud CIDR allocator" )
277
279
@@ -282,18 +284,26 @@ func (ca *cloudCIDRAllocator) Run(stopCh <-chan struct{}) {
282
284
for i := 0 ; i < cidrUpdateWorkers ; i ++ {
283
285
go wait .UntilWithContext (ctx , ca .runWorker , time .Second )
284
286
}
285
- if ca .nodeTopologyQueue != nil {
286
- ca .nodeTopologyQueue .Run ()
287
- }
288
287
289
- go func () {
290
- time .Sleep (nodeTopologyReconcileInterval )
291
- wait .Until (
292
- func () {
293
- ca .nodeTopologyQueue .Enqueue (nodeTopologyReconcileFakeNode )
294
- },
295
- nodeTopologyReconcileInterval , stopCh )
296
- }()
288
+ if enableNodeTopology {
289
+ if ca .nodeTopologyQueue != nil {
290
+ defer ca .nodeTopologyQueue .Shutdown ()
291
+ ca .nodeTopologyQueue .Run ()
292
+ }
293
+ go func () {
294
+ time .Sleep (nodeTopologyReconcileInterval )
295
+ wait .Until (
296
+ func () {
297
+ if ca .nodeTopologyQueue != nil {
298
+ // nodeTopologyReconcileFakeNode triggers reconciliation. Node_topology_syncer
299
+ // will not find the fake node in nodeInformer cache, forcing a full reconciliation
300
+ // of the nodeTopology custom resource.
301
+ ca .nodeTopologyQueue .Enqueue (nodeTopologyReconcileFakeNode )
302
+ }
303
+ },
304
+ nodeTopologyReconcileInterval , stopCh )
305
+ }()
306
+ }
297
307
298
308
<- stopCh
299
309
}
0 commit comments