@@ -155,18 +155,18 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools(clusterName string,
155
155
// to nodeIPConfiguration, we need to decouple the VM NICs from the LB
156
156
// before attaching nodeIPs/podIPs to the LB backend pool.
157
157
if bp .BackendAddressPoolPropertiesFormat != nil &&
158
- (bp .BackendIPConfigurations == nil || len (* bp .BackendIPConfigurations ) == 0 ) {
159
- // It is not allowed to change the type of the backend pool, so we delete it
160
- // and create a new empty backend pool.
161
- if err := bc .DeleteLBBackendPool (lbName , to .String (bp .Name )); err != nil {
162
- klog .Errorf ("bc.ReconcileBackendPools for service (%s): failed to DeleteLBBackendPool: %s" , serviceName , err .Error ())
163
- return false , false , err
158
+ bp .LoadBalancerBackendAddresses != nil &&
159
+ len (* bp .LoadBalancerBackendAddresses ) > 0 {
160
+ if removeNodeIPAddressesFromBackendPool (bp , []string {}, true ) {
161
+ bp .Etag = nil
162
+ if err := bc .CreateOrUpdateLBBackendPool (lbName , bp ); err != nil {
163
+ klog .Errorf ("bc.ReconcileBackendPools for service (%s): failed to cleanup IP based backend pool %s: %s" , serviceName , lbBackendPoolName , err .Error ())
164
+ return false , false , fmt .Errorf ("bc.ReconcileBackendPools for service (%s): failed to cleanup IP based backend pool %s: %w" , serviceName , lbBackendPoolName , err )
165
+ }
166
+ newBackendPools [i ] = bp
167
+ lb .BackendAddressPools = & newBackendPools
168
+ lb .Etag = nil
164
169
}
165
- newBackendPools = append (newBackendPools [:i ], newBackendPools [i + 1 :]... )
166
- lb .BackendAddressPools = & newBackendPools
167
- lb .Etag = nil
168
- foundBackendPool = false
169
- break
170
170
}
171
171
172
172
var backendIPConfigurationsToBeDeleted []network.InterfaceIPConfiguration
@@ -399,22 +399,15 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(clusterName string, servi
399
399
if bp .BackendAddressPoolPropertiesFormat != nil &&
400
400
bp .BackendIPConfigurations != nil &&
401
401
len (* bp .BackendIPConfigurations ) > 0 {
402
- // It is not allowed to change the type of the backend pool, so we delete it
403
- // and create a new empty backend pool. Note that for IP configuration based
404
- // backend pools, we must decouple it from the vmSets before deleting.
405
402
klog .V (2 ).Infof ("bi.ReconcileBackendPools for service (%s): ensuring the LB is decoupled from the VMSet" , serviceName )
406
403
if err := bi .VMSet .EnsureBackendPoolDeleted (service , lbBackendPoolID , vmSetName , lb .BackendAddressPools , true ); err != nil {
407
404
klog .Errorf ("bi.ReconcileBackendPools for service (%s): failed to EnsureBackendPoolDeleted: %s" , serviceName , err .Error ())
408
405
return false , false , err
409
406
}
410
- if err := bi .DeleteLBBackendPool (lbName , to .String (bp .Name )); err != nil {
411
- klog .Errorf ("bi.ReconcileBackendPools for service (%s): failed to DeleteLBBackendPool: %s" , serviceName , err .Error ())
412
- return false , false , err
413
- }
414
- newBackendPools = append (newBackendPools [:i ], newBackendPools [i + 1 :]... )
415
- lb .BackendAddressPools = & newBackendPools
407
+ newBackendPools [i ].BackendAddressPoolPropertiesFormat .LoadBalancerBackendAddresses = & []network.LoadBalancerBackendAddress {}
408
+ newBackendPools [i ].BackendAddressPoolPropertiesFormat .BackendIPConfigurations = & []network.InterfaceIPConfiguration {}
409
+ newBackendPools [i ].Etag = nil
416
410
lb .Etag = nil
417
- foundBackendPool = false
418
411
break
419
412
}
420
413
@@ -426,7 +419,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(clusterName string, servi
426
419
}
427
420
}
428
421
if len (nodeIPAddressesToBeDeleted ) > 0 {
429
- updated := removeNodeIPAddressesFromBackendPool (bp , nodeIPAddressesToBeDeleted )
422
+ updated := removeNodeIPAddressesFromBackendPool (bp , nodeIPAddressesToBeDeleted , false )
430
423
if updated {
431
424
(* lb .BackendAddressPools )[i ] = bp
432
425
if err := bi .CreateOrUpdateLBBackendPool (lbName , bp ); err != nil {
@@ -468,15 +461,19 @@ func newBackendPool(lb *network.LoadBalancer, isBackendPoolPreConfigured bool, p
468
461
return isBackendPoolPreConfigured
469
462
}
470
463
471
- func removeNodeIPAddressesFromBackendPool (backendPool network.BackendAddressPool , nodeIPAddresses []string ) bool {
464
+ func removeNodeIPAddressesFromBackendPool (backendPool network.BackendAddressPool , nodeIPAddresses []string , removeAll bool ) bool {
472
465
changed := false
473
466
nodeIPsSet := sets .NewString (nodeIPAddresses ... )
474
467
if backendPool .BackendAddressPoolPropertiesFormat != nil &&
475
468
backendPool .LoadBalancerBackendAddresses != nil {
476
469
for i := len (* backendPool .LoadBalancerBackendAddresses ) - 1 ; i >= 0 ; i -- {
477
470
if (* backendPool .LoadBalancerBackendAddresses )[i ].LoadBalancerBackendAddressPropertiesFormat != nil {
478
471
ipAddress := to .String ((* backendPool .LoadBalancerBackendAddresses )[i ].IPAddress )
479
- if nodeIPsSet .Has (ipAddress ) {
472
+ if ipAddress == "" {
473
+ klog .V (4 ).Infof ("removeNodeIPAddressFromBackendPool: LoadBalancerBackendAddress %s is not IP-based, skipping" , to .String ((* backendPool .LoadBalancerBackendAddresses )[i ].Name ))
474
+ continue
475
+ }
476
+ if removeAll || nodeIPsSet .Has (ipAddress ) {
480
477
klog .V (4 ).Infof ("removeNodeIPAddressFromBackendPool: removing %s from the backend pool %s" , ipAddress , to .String (backendPool .Name ))
481
478
* backendPool .LoadBalancerBackendAddresses = append ((* backendPool .LoadBalancerBackendAddresses )[:i ], (* backendPool .LoadBalancerBackendAddresses )[i + 1 :]... )
482
479
changed = true
0 commit comments