Skip to content

Commit 107faf5

Browse files
committed
proxy: Take into account exclude CIDRs while deleting legacy real servers
1 parent 407269d commit 107faf5

File tree

2 files changed

+83
-25
lines changed

2 files changed

+83
-25
lines changed

pkg/proxy/ipvs/proxier.go

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,15 +1671,17 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode
16711671
func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, currentServices map[string]*utilipvs.VirtualServer, legacyBindAddrs map[string]bool) {
16721672
for cs := range currentServices {
16731673
svc := currentServices[cs]
1674+
if proxier.isIPInExcludeCIDRs(svc.Address) {
1675+
continue
1676+
}
16741677
if _, ok := activeServices[cs]; !ok {
1675-
// This service was not processed in the latest sync loop so before deleting it,
1676-
okayToDelete := true
16771678
rsList, _ := proxier.ipvs.GetRealServers(svc)
16781679

16791680
// If we still have real servers graceful termination is not done
16801681
if len(rsList) > 0 {
1681-
okayToDelete = false
1682+
continue
16821683
}
1684+
16831685
// Applying graceful termination to all real servers
16841686
for _, rs := range rsList {
16851687
uniqueRS := GetUniqueRSName(svc, rs)
@@ -1692,35 +1694,36 @@ func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, curre
16921694
klog.Errorf("Failed to delete destination: %v, error: %v", uniqueRS, err)
16931695
}
16941696
}
1695-
// make sure it does not fall within an excluded CIDR range.
1696-
for _, excludedCIDR := range proxier.excludeCIDRs {
1697-
// Any validation of this CIDR already should have occurred.
1698-
_, n, _ := net.ParseCIDR(excludedCIDR)
1699-
if n.Contains(svc.Address) {
1700-
okayToDelete = false
1701-
break
1702-
}
1697+
klog.V(4).Infof("Delete service %s", svc.String())
1698+
if err := proxier.ipvs.DeleteVirtualServer(svc); err != nil {
1699+
klog.Errorf("Failed to delete service %s, error: %v", svc.String(), err)
17031700
}
1704-
if okayToDelete {
1705-
klog.V(4).Infof("Delete service %s", svc.String())
1706-
if err := proxier.ipvs.DeleteVirtualServer(svc); err != nil {
1707-
klog.Errorf("Failed to delete service %s, error: %v", svc.String(), err)
1708-
}
1709-
addr := svc.Address.String()
1710-
if _, ok := legacyBindAddrs[addr]; ok {
1711-
klog.V(4).Infof("Unbinding address %s", addr)
1712-
if err := proxier.netlinkHandle.UnbindAddress(addr, DefaultDummyDevice); err != nil {
1713-
klog.Errorf("Failed to unbind service addr %s from dummy interface %s: %v", addr, DefaultDummyDevice, err)
1714-
} else {
1715-
// In case we delete a multi-port service, avoid trying to unbind multiple times
1716-
delete(legacyBindAddrs, addr)
1717-
}
1701+
addr := svc.Address.String()
1702+
if _, ok := legacyBindAddrs[addr]; ok {
1703+
klog.V(4).Infof("Unbinding address %s", addr)
1704+
if err := proxier.netlinkHandle.UnbindAddress(addr, DefaultDummyDevice); err != nil {
1705+
klog.Errorf("Failed to unbind service addr %s from dummy interface %s: %v", addr, DefaultDummyDevice, err)
1706+
} else {
1707+
// In case we delete a multi-port service, avoid trying to unbind multiple times
1708+
delete(legacyBindAddrs, addr)
17181709
}
17191710
}
17201711
}
17211712
}
17221713
}
17231714

1715+
func (proxier *Proxier) isIPInExcludeCIDRs(ip net.IP) bool {
1716+
// make sure it does not fall within an excluded CIDR range.
1717+
for _, excludedCIDR := range proxier.excludeCIDRs {
1718+
// Any validation of this CIDR already should have occurred.
1719+
_, n, _ := net.ParseCIDR(excludedCIDR)
1720+
if n.Contains(ip) {
1721+
return true
1722+
}
1723+
}
1724+
return false
1725+
}
1726+
17241727
func (proxier *Proxier) getLegacyBindAddr(activeBindAddrs map[string]bool, currentBindAddrs []string) map[string]bool {
17251728
legacyAddrs := make(map[string]bool)
17261729
isIpv6 := utilnet.IsIPv6(proxier.nodeIP)

pkg/proxy/ipvs/proxier_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,6 +2925,61 @@ func TestCleanLegacyService(t *testing.T) {
29252925

29262926
}
29272927

2928+
func TestCleanLegacyRealServersExcludeCIDRs(t *testing.T) {
2929+
ipt := iptablestest.NewFake()
2930+
ipvs := ipvstest.NewFake()
2931+
ipset := ipsettest.NewFake(testIPSetVersion)
2932+
gtm := NewGracefulTerminationManager(ipvs)
2933+
fp := NewFakeProxier(ipt, ipvs, ipset, nil, []string{"4.4.4.4/32"})
2934+
fp.gracefuldeleteManager = gtm
2935+
2936+
vs := &utilipvs.VirtualServer{
2937+
Address: net.ParseIP("4.4.4.4"),
2938+
Protocol: string(v1.ProtocolUDP),
2939+
Port: 56,
2940+
Scheduler: "rr",
2941+
Flags: utilipvs.FlagHashed,
2942+
}
2943+
2944+
fp.ipvs.AddVirtualServer(vs)
2945+
2946+
rss := []*utilipvs.RealServer{
2947+
{
2948+
Address: net.ParseIP("10.10.10.10"),
2949+
Port: 56,
2950+
ActiveConn: 0,
2951+
InactiveConn: 0,
2952+
},
2953+
{
2954+
Address: net.ParseIP("11.11.11.11"),
2955+
Port: 56,
2956+
ActiveConn: 0,
2957+
InactiveConn: 0,
2958+
},
2959+
}
2960+
for _, rs := range rss {
2961+
fp.ipvs.AddRealServer(vs, rs)
2962+
}
2963+
2964+
fp.netlinkHandle.EnsureDummyDevice(DefaultDummyDevice)
2965+
2966+
fp.netlinkHandle.EnsureAddressBind("4.4.4.4", DefaultDummyDevice)
2967+
2968+
fp.cleanLegacyService(
2969+
map[string]bool{},
2970+
map[string]*utilipvs.VirtualServer{"ipvs0": vs},
2971+
map[string]bool{"4.4.4.4": true},
2972+
)
2973+
2974+
fp.gracefuldeleteManager.tryDeleteRs()
2975+
2976+
remainingRealServers, _ := fp.ipvs.GetRealServers(vs)
2977+
2978+
if len(remainingRealServers) != 2 {
2979+
t.Errorf("Expected number of remaining IPVS real servers after cleanup should be %v. Got %v", 2, len(remainingRealServers))
2980+
}
2981+
}
2982+
29282983
func TestCleanLegacyService6(t *testing.T) {
29292984
ipt := iptablestest.NewFake()
29302985
ipvs := ipvstest.NewFake()

0 commit comments

Comments
 (0)