@@ -684,6 +684,7 @@ func (az *Cloud) isFrontendIPChanged(clusterName string, config network.Frontend
684
684
// nodes only used if wantLb is true
685
685
func (az * Cloud ) reconcileLoadBalancer (clusterName string , service * v1.Service , nodes []* v1.Node , wantLb bool ) (* network.LoadBalancer , error ) {
686
686
isInternal := requiresInternalLoadBalancer (service )
687
+ isBackendPoolPreConfigured := az .isBackendPoolPreConfigured (service )
687
688
serviceName := getServiceName (service )
688
689
klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s) - wantLb(%t): started" , serviceName , wantLb )
689
690
lb , _ , _ , err := az .getServiceLoadBalancer (service , clusterName , nodes , wantLb )
@@ -723,6 +724,14 @@ func (az *Cloud) reconcileLoadBalancer(clusterName string, service *v1.Service,
723
724
}
724
725
}
725
726
if ! foundBackendPool {
727
+ if isBackendPoolPreConfigured {
728
+ klog .V (2 ).Infof ("reconcileLoadBalancer for service (%s)(%t): lb backendpool - PreConfiguredBackendPoolLoadBalancerTypes %s has been set but can not find corresponding backend pool, ignoring it" ,
729
+ serviceName ,
730
+ wantLb ,
731
+ az .PreConfiguredBackendPoolLoadBalancerTypes )
732
+ isBackendPoolPreConfigured = false
733
+ }
734
+
726
735
newBackendPools = append (newBackendPools , network.BackendAddressPool {
727
736
Name : to .StringPtr (lbBackendPoolName ),
728
737
})
@@ -928,28 +937,32 @@ func (az *Cloud) reconcileLoadBalancer(clusterName string, service *v1.Service,
928
937
// If it is not exist, and no change to that, we don't CreateOrUpdate LB
929
938
if dirtyLb {
930
939
if lb .FrontendIPConfigurations == nil || len (* lb .FrontendIPConfigurations ) == 0 {
931
- // When FrontendIPConfigurations is empty, we need to delete the Azure load balancer resource itself,
932
- // because an Azure load balancer cannot have an empty FrontendIPConfigurations collection
933
- klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s): lb(%s) - deleting; no remaining frontendIPConfigurations" , serviceName , lbName )
934
-
935
- // Remove backend pools from vmSets. This is required for virtual machine scale sets before removing the LB.
936
- vmSetName := az .mapLoadBalancerNameToVMSet (lbName , clusterName )
937
- klog .V (10 ).Infof ("EnsureBackendPoolDeleted(%s,%s) for service %s: start" , lbBackendPoolID , vmSetName , serviceName )
938
- err := az .vmSet .EnsureBackendPoolDeleted (service , lbBackendPoolID , vmSetName , lb .BackendAddressPools )
939
- if err != nil {
940
- klog .Errorf ("EnsureBackendPoolDeleted(%s) for service %s failed: %v" , lbBackendPoolID , serviceName , err )
941
- return nil , err
942
- }
943
- klog .V (10 ).Infof ("EnsureBackendPoolDeleted(%s) for service %s: end" , lbBackendPoolID , serviceName )
940
+ if isBackendPoolPreConfigured {
941
+ klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s): lb(%s) - ignore cleanup of dirty lb because the lb is pre-confiruged" , serviceName , lbName )
942
+ } else {
943
+ // When FrontendIPConfigurations is empty, we need to delete the Azure load balancer resource itself,
944
+ // because an Azure load balancer cannot have an empty FrontendIPConfigurations collection
945
+ klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s): lb(%s) - deleting; no remaining frontendIPConfigurations" , serviceName , lbName )
946
+
947
+ // Remove backend pools from vmSets. This is required for virtual machine scale sets before removing the LB.
948
+ vmSetName := az .mapLoadBalancerNameToVMSet (lbName , clusterName )
949
+ klog .V (10 ).Infof ("EnsureBackendPoolDeleted(%s,%s) for service %s: start" , lbBackendPoolID , vmSetName , serviceName )
950
+ err := az .vmSet .EnsureBackendPoolDeleted (service , lbBackendPoolID , vmSetName , lb .BackendAddressPools )
951
+ if err != nil {
952
+ klog .Errorf ("EnsureBackendPoolDeleted(%s) for service %s failed: %v" , lbBackendPoolID , serviceName , err )
953
+ return nil , err
954
+ }
955
+ klog .V (10 ).Infof ("EnsureBackendPoolDeleted(%s) for service %s: end" , lbBackendPoolID , serviceName )
944
956
945
- // Remove the LB.
946
- klog .V (10 ).Infof ("reconcileLoadBalancer: az.DeleteLB(%q): start" , lbName )
947
- err = az .DeleteLB (service , lbName )
948
- if err != nil {
949
- klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s) abort backoff: lb(%s) - deleting; no remaining frontendIPConfigurations" , serviceName , lbName )
950
- return nil , err
957
+ // Remove the LB.
958
+ klog .V (10 ).Infof ("reconcileLoadBalancer: az.DeleteLB(%q): start" , lbName )
959
+ err = az .DeleteLB (service , lbName )
960
+ if err != nil {
961
+ klog .V (2 ).Infof ("reconcileLoadBalancer for service(%s) abort backoff: lb(%s) - deleting; no remaining frontendIPConfigurations" , serviceName , lbName )
962
+ return nil , err
963
+ }
964
+ klog .V (10 ).Infof ("az.DeleteLB(%q): end" , lbName )
951
965
}
952
- klog .V (10 ).Infof ("az.DeleteLB(%q): end" , lbName )
953
966
} else {
954
967
klog .V (2 ).Infof ("reconcileLoadBalancer: reconcileLoadBalancer for service(%s): lb(%s) - updating" , serviceName , lbName )
955
968
err := az .CreateOrUpdateLB (service , * lb )
@@ -973,7 +986,7 @@ func (az *Cloud) reconcileLoadBalancer(clusterName string, service *v1.Service,
973
986
}
974
987
}
975
988
976
- if wantLb && nodes != nil {
989
+ if wantLb && nodes != nil && ! isBackendPoolPreConfigured {
977
990
// Add the machines to the backend pool if they're not already
978
991
vmSetName := az .mapLoadBalancerNameToVMSet (lbName , clusterName )
979
992
// Etag would be changed when updating backend pools, so invalidate lbCache after it.
@@ -1695,6 +1708,23 @@ func (az *Cloud) getPublicIPAddressResourceGroup(service *v1.Service) string {
1695
1708
return az .ResourceGroup
1696
1709
}
1697
1710
1711
+ func (az * Cloud ) isBackendPoolPreConfigured (service * v1.Service ) bool {
1712
+ preConfigured := false
1713
+ isInternal := requiresInternalLoadBalancer (service )
1714
+
1715
+ if az .PreConfiguredBackendPoolLoadBalancerTypes == PreConfiguredBackendPoolLoadBalancerTypesAll {
1716
+ preConfigured = true
1717
+ }
1718
+ if (az .PreConfiguredBackendPoolLoadBalancerTypes == PreConfiguredBackendPoolLoadBalancerTypesInteral ) && isInternal {
1719
+ preConfigured = true
1720
+ }
1721
+ if (az .PreConfiguredBackendPoolLoadBalancerTypes == PreConfiguredBackendPoolLoadBalancerTypesExternal ) && ! isInternal {
1722
+ preConfigured = true
1723
+ }
1724
+
1725
+ return preConfigured
1726
+ }
1727
+
1698
1728
// Check if service requires an internal load balancer.
1699
1729
func requiresInternalLoadBalancer (service * v1.Service ) bool {
1700
1730
if l , found := service .Annotations [ServiceAnnotationLoadBalancerInternal ]; found {
0 commit comments