Skip to content

Commit

Permalink
fix: remove deleted node IP address from IP-based LB backend pools
Browse files Browse the repository at this point in the history
  • Loading branch information
nilo19 committed Jun 20, 2023
1 parent 98054b4 commit 8e07d7b
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
22 changes: 19 additions & 3 deletions pkg/provider/azure_loadbalancer_backendpool.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,8 +391,10 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(service *v1.Service, nodes []
}
vnetID := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualNetworks/%s", bi.SubscriptionID, vnetResourceGroup, bi.VnetName)

changed := false
numOfAdd := 0
var (
changed bool
numOfAdd, numOfDelete int
)
lbBackendPoolName := getBackendPoolName(clusterName, isIPv6)
if strings.EqualFold(pointer.StringDeref(backendPool.Name, ""), lbBackendPoolName) &&
backendPool.BackendAddressPoolPropertiesFormat != nil {
Expand All @@ -414,13 +416,15 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(service *v1.Service, nodes []
}
}

nodePrivateIPsSet := sets.New[string]()
for _, node := range nodes {
if isControlPlaneNode(node) {
klog.V(4).Infof("bi.EnsureHostsInPool: skipping control plane node %s", node.Name)
continue
}

privateIP := getNodePrivateIPAddress(node, isIPv6)
nodePrivateIPsSet.Insert(privateIP)
if !existingIPs.Has(privateIP) {
name := node.Name
if utilnet.IsIPv6String(privateIP) {
Expand All @@ -438,9 +442,21 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(service *v1.Service, nodes []
changed = true
}
}

var nodeIPsToBeDeleted []string
for _, loadBalancerBackendAddress := range *backendPool.LoadBalancerBackendAddresses {
ip := pointer.StringDeref(loadBalancerBackendAddress.IPAddress, "")
if !nodePrivateIPsSet.Has(ip) {
klog.V(4).Infof("bi.EnsureHostsInPool: removing IP %s", ip)
nodeIPsToBeDeleted = append(nodeIPsToBeDeleted, ip)
changed = true
numOfDelete++
}
}
removeNodeIPAddressesFromBackendPool(backendPool, nodeIPsToBeDeleted, false)
}
if changed {
klog.V(2).Infof("bi.EnsureHostsInPool: updating backend pool %s of load balancer %s to add %d nodes", lbBackendPoolName, lbName, numOfAdd)
klog.V(2).Infof("bi.EnsureHostsInPool: updating backend pool %s of load balancer %s to add %d nodes and remove %d nodes", lbBackendPoolName, lbName, numOfAdd, numOfDelete)
if err := bi.CreateOrUpdateLBBackendPool(lbName, backendPool); err != nil {
return fmt.Errorf("bi.EnsureHostsInPool: failed to update backend pool %s: %w", lbBackendPoolName, err)
}
Expand Down
22 changes: 22 additions & 0 deletions pkg/provider/azure_loadbalancer_backendpool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,23 @@ func TestEnsureHostsInPoolNodeIP(t *testing.T) {
},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "vmss-1",
},
Status: v1.NodeStatus{
Addresses: []v1.NodeAddress{
{
Type: v1.NodeInternalIP,
Address: "10.0.0.1",
},
{
Type: v1.NodeInternalIP,
Address: "2001::1",
},
},
},
},
}

testcases := []struct {
Expand All @@ -88,6 +105,11 @@ func TestEnsureHostsInPoolNodeIP(t *testing.T) {
IPAddress: pointer.String("10.0.0.1"),
},
},
{
LoadBalancerBackendAddressPropertiesFormat: &network.LoadBalancerBackendAddressPropertiesFormat{
IPAddress: pointer.String("10.0.0.3"),
},
},
},
},
},
Expand Down

0 comments on commit 8e07d7b

Please sign in to comment.