Skip to content

Commit b0500ed

Browse files
authored
Merge pull request #1217 from k8s-infra-cherrypick-robot/cherry-pick-1216-to-release-1.23
[release-1.23] fix: do not delete backend pool when reconciling lb backend pools
2 parents f882fc5 + d615f18 commit b0500ed

File tree

2 files changed

+31
-40
lines changed

2 files changed

+31
-40
lines changed

pkg/provider/azure_loadbalancer_backendpool.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,18 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools(clusterName string,
155155
// to nodeIPConfiguration, we need to decouple the VM NICs from the LB
156156
// before attaching nodeIPs/podIPs to the LB backend pool.
157157
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
164169
}
165-
newBackendPools = append(newBackendPools[:i], newBackendPools[i+1:]...)
166-
lb.BackendAddressPools = &newBackendPools
167-
lb.Etag = nil
168-
foundBackendPool = false
169-
break
170170
}
171171

172172
var backendIPConfigurationsToBeDeleted []network.InterfaceIPConfiguration
@@ -399,22 +399,15 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(clusterName string, servi
399399
if bp.BackendAddressPoolPropertiesFormat != nil &&
400400
bp.BackendIPConfigurations != nil &&
401401
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.
405402
klog.V(2).Infof("bi.ReconcileBackendPools for service (%s): ensuring the LB is decoupled from the VMSet", serviceName)
406403
if err := bi.VMSet.EnsureBackendPoolDeleted(service, lbBackendPoolID, vmSetName, lb.BackendAddressPools, true); err != nil {
407404
klog.Errorf("bi.ReconcileBackendPools for service (%s): failed to EnsureBackendPoolDeleted: %s", serviceName, err.Error())
408405
return false, false, err
409406
}
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
416410
lb.Etag = nil
417-
foundBackendPool = false
418411
break
419412
}
420413

@@ -426,7 +419,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(clusterName string, servi
426419
}
427420
}
428421
if len(nodeIPAddressesToBeDeleted) > 0 {
429-
updated := removeNodeIPAddressesFromBackendPool(bp, nodeIPAddressesToBeDeleted)
422+
updated := removeNodeIPAddressesFromBackendPool(bp, nodeIPAddressesToBeDeleted, false)
430423
if updated {
431424
(*lb.BackendAddressPools)[i] = bp
432425
if err := bi.CreateOrUpdateLBBackendPool(lbName, bp); err != nil {
@@ -468,15 +461,19 @@ func newBackendPool(lb *network.LoadBalancer, isBackendPoolPreConfigured bool, p
468461
return isBackendPoolPreConfigured
469462
}
470463

471-
func removeNodeIPAddressesFromBackendPool(backendPool network.BackendAddressPool, nodeIPAddresses []string) bool {
464+
func removeNodeIPAddressesFromBackendPool(backendPool network.BackendAddressPool, nodeIPAddresses []string, removeAll bool) bool {
472465
changed := false
473466
nodeIPsSet := sets.NewString(nodeIPAddresses...)
474467
if backendPool.BackendAddressPoolPropertiesFormat != nil &&
475468
backendPool.LoadBalancerBackendAddresses != nil {
476469
for i := len(*backendPool.LoadBalancerBackendAddresses) - 1; i >= 0; i-- {
477470
if (*backendPool.LoadBalancerBackendAddresses)[i].LoadBalancerBackendAddressPropertiesFormat != nil {
478471
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) {
480477
klog.V(4).Infof("removeNodeIPAddressFromBackendPool: removing %s from the backend pool %s", ipAddress, to.String(backendPool.Name))
481478
*backendPool.LoadBalancerBackendAddresses = append((*backendPool.LoadBalancerBackendAddresses)[:i], (*backendPool.LoadBalancerBackendAddresses)[i+1:]...)
482479
changed = true

pkg/provider/azure_loadbalancer_backendpool_test.go

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -322,17 +322,17 @@ func TestReconcileBackendPoolsNodeIPToIPConfig(t *testing.T) {
322322

323323
lb := buildLBWithVMIPs(testClusterName, []string{"10.0.0.1", "10.0.0.2"})
324324
mockLBClient := mockloadbalancerclient.NewMockInterface(ctrl)
325-
mockLBClient.EXPECT().DeleteLBBackendPool(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(retry.NewError(false, fmt.Errorf("delete LB backend pool error")))
325+
mockLBClient.EXPECT().CreateOrUpdateBackendPools(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(retry.NewError(false, fmt.Errorf("create or update LB backend pool error")))
326326

327327
az := GetTestCloud(ctrl)
328328
az.LoadBalancerClient = mockLBClient
329329
bc := newBackendPoolTypeNodeIPConfig(az)
330330
svc := getTestService("test", v1.ProtocolTCP, nil, false, 80)
331331
_, _, err := bc.ReconcileBackendPools(testClusterName, &svc, lb)
332-
assert.Contains(t, err.Error(), "delete LB backend pool error")
332+
assert.Contains(t, err.Error(), "create or update LB backend pool error")
333333

334334
lb = buildLBWithVMIPs(testClusterName, []string{"10.0.0.1", "10.0.0.2"})
335-
mockLBClient.EXPECT().DeleteLBBackendPool(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
335+
mockLBClient.EXPECT().CreateOrUpdateBackendPools(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
336336
_, _, err = bc.ReconcileBackendPools(testClusterName, &svc, lb)
337337
assert.NoError(t, err)
338338
assert.Empty(t, (*lb.BackendAddressPools)[0].LoadBalancerBackendAddresses)
@@ -426,18 +426,6 @@ func TestReconcileBackendPoolsNodeIPConfigToIP(t *testing.T) {
426426
"/subscriptions/subscription/resourceGroups/rg/providers/Microsoft.Network/networkInterfaces/k8s-agentpool1-00000000-nic-1/ipConfigurations/ipconfig1",
427427
"/subscriptions/subscription/resourceGroups/rg/providers/Microsoft.Network/networkInterfaces/k8s-agentpool2-00000000-nic-1/ipConfigurations/ipconfig1",
428428
})
429-
mockLBClient := mockloadbalancerclient.NewMockInterface(ctrl)
430-
mockLBClient.EXPECT().DeleteLBBackendPool(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(retry.NewError(false, fmt.Errorf("error2")))
431-
mockVMSet.EXPECT().EnsureBackendPoolDeleted(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
432-
az.LoadBalancerClient = mockLBClient
433-
_, _, err = bi.ReconcileBackendPools(testClusterName, &svc, &lb)
434-
assert.Contains(t, err.Error(), "error2")
435-
436-
lb = buildDefaultTestLB(testClusterName, []string{
437-
"/subscriptions/subscription/resourceGroups/rg/providers/Microsoft.Network/networkInterfaces/k8s-agentpool1-00000000-nic-1/ipConfigurations/ipconfig1",
438-
"/subscriptions/subscription/resourceGroups/rg/providers/Microsoft.Network/networkInterfaces/k8s-agentpool2-00000000-nic-1/ipConfigurations/ipconfig1",
439-
})
440-
mockLBClient.EXPECT().DeleteLBBackendPool(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
441429
mockVMSet.EXPECT().EnsureBackendPoolDeleted(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
442430
_, _, err = bi.ReconcileBackendPools(testClusterName, &svc, &lb)
443431
assert.NoError(t, err)
@@ -465,6 +453,9 @@ func TestRemoveNodeIPAddressFromBackendPool(t *testing.T) {
465453
IPAddress: to.StringPtr("4.3.2.1"),
466454
},
467455
},
456+
{
457+
LoadBalancerBackendAddressPropertiesFormat: &network.LoadBalancerBackendAddressPropertiesFormat{},
458+
},
468459
},
469460
},
470461
}
@@ -477,10 +468,13 @@ func TestRemoveNodeIPAddressFromBackendPool(t *testing.T) {
477468
IPAddress: to.StringPtr("5.6.7.8"),
478469
},
479470
},
471+
{
472+
LoadBalancerBackendAddressPropertiesFormat: &network.LoadBalancerBackendAddressPropertiesFormat{},
473+
},
480474
},
481475
},
482476
}
483477

484-
removeNodeIPAddressesFromBackendPool(backendPool, nodeIPAddresses)
478+
removeNodeIPAddressesFromBackendPool(backendPool, nodeIPAddresses, false)
485479
assert.Equal(t, expectedBackendPool, backendPool)
486480
}

0 commit comments

Comments
 (0)