@@ -1190,7 +1190,15 @@ func (proxier *Proxier) syncProxyRules() {
1190
1190
}
1191
1191
proxier .portsMap = replacementPortsMap
1192
1192
1193
- // Clean up legacy IPVS services
1193
+ // Get legacy bind address
1194
+ // currentBindAddrs represents ip addresses bind to DefaultDummyDevice from the system
1195
+ currentBindAddrs , err := proxier .netlinkHandle .ListBindAddress (DefaultDummyDevice )
1196
+ if err != nil {
1197
+ klog .Errorf ("Failed to get bind address, err: %v" , err )
1198
+ }
1199
+ legacyBindAddrs := proxier .getLegacyBindAddr (activeBindAddrs , currentBindAddrs )
1200
+
1201
+ // Clean up legacy IPVS services and unbind addresses
1194
1202
appliedSvcs , err := proxier .ipvs .GetVirtualServers ()
1195
1203
if err == nil {
1196
1204
for _ , appliedSvc := range appliedSvcs {
@@ -1199,15 +1207,7 @@ func (proxier *Proxier) syncProxyRules() {
1199
1207
} else {
1200
1208
klog .Errorf ("Failed to get ipvs service, err: %v" , err )
1201
1209
}
1202
- proxier .cleanLegacyService (activeIPVSServices , currentIPVSServices )
1203
-
1204
- // Clean up legacy bind address
1205
- // currentBindAddrs represents ip addresses bind to DefaultDummyDevice from the system
1206
- currentBindAddrs , err := proxier .netlinkHandle .ListBindAddress (DefaultDummyDevice )
1207
- if err != nil {
1208
- klog .Errorf ("Failed to get bind address, err: %v" , err )
1209
- }
1210
- proxier .cleanLegacyBindAddr (activeBindAddrs , currentBindAddrs )
1210
+ proxier .cleanLegacyService (activeIPVSServices , currentIPVSServices , legacyBindAddrs )
1211
1211
1212
1212
// Update healthz timestamp
1213
1213
if proxier .healthzServer != nil {
@@ -1605,29 +1605,34 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode
1605
1605
klog .V (5 ).Infof ("Using graceful delete to delete: %v" , uniqueRS )
1606
1606
err = proxier .gracefuldeleteManager .GracefulDeleteRS (appliedVirtualServer , delDest )
1607
1607
if err != nil {
1608
- klog .Errorf ("Failed to delete destination: %v, error: %v" , delDest , err )
1608
+ klog .Errorf ("Failed to delete destination: %v, error: %v" , uniqueRS , err )
1609
1609
continue
1610
1610
}
1611
1611
}
1612
1612
return nil
1613
1613
}
1614
1614
1615
- func (proxier * Proxier ) cleanLegacyService (activeServices map [string ]bool , currentServices map [string ]* utilipvs.VirtualServer ) {
1615
+ func (proxier * Proxier ) cleanLegacyService (activeServices map [string ]bool , currentServices map [string ]* utilipvs.VirtualServer , legacyBindAddrs map [ string ] bool ) {
1616
1616
for cs := range currentServices {
1617
1617
svc := currentServices [cs ]
1618
1618
if _ , ok := activeServices [cs ]; ! ok {
1619
1619
// This service was not processed in the latest sync loop so before deleting it,
1620
- // make sure it does not fall within an excluded CIDR range.
1621
1620
okayToDelete := true
1622
1621
rsList , _ := proxier .ipvs .GetRealServers (svc )
1622
+
1623
+ // If we still have real servers graceful termination is not done
1624
+ if len (rsList ) > 0 {
1625
+ okayToDelete = false
1626
+ }
1627
+ // Applying graceful termination to all real servers
1623
1628
for _ , rs := range rsList {
1624
1629
uniqueRS := GetUniqueRSName (svc , rs )
1625
- // if there are in terminating real server in this service, then handle it later
1626
- if proxier .gracefuldeleteManager .InTerminationList (uniqueRS ) {
1627
- okayToDelete = false
1628
- break
1630
+ klog .V (5 ).Infof ("Using graceful delete to delete: %v" , uniqueRS )
1631
+ if err := proxier .gracefuldeleteManager .GracefulDeleteRS (svc , rs ); err != nil {
1632
+ klog .Errorf ("Failed to delete destination: %v, error: %v" , uniqueRS , err )
1629
1633
}
1630
1634
}
1635
+ // make sure it does not fall within an excluded CIDR range.
1631
1636
for _ , excludedCIDR := range proxier .excludeCIDRs {
1632
1637
// Any validation of this CIDR already should have occurred.
1633
1638
_ , n , _ := net .ParseCIDR (excludedCIDR )
@@ -1637,26 +1642,33 @@ func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, curre
1637
1642
}
1638
1643
}
1639
1644
if okayToDelete {
1645
+ klog .V (4 ).Infof ("Delete service %s" , svc .String ())
1640
1646
if err := proxier .ipvs .DeleteVirtualServer (svc ); err != nil {
1641
- klog .Errorf ("Failed to delete service, error: %v" , err )
1647
+ klog .Errorf ("Failed to delete service %s, error: %v" , svc .String (), err )
1648
+ }
1649
+ addr := svc .Address .String ()
1650
+ if _ , ok := legacyBindAddrs [addr ]; ok {
1651
+ klog .V (4 ).Infof ("Unbinding address %s" , addr )
1652
+ if err := proxier .netlinkHandle .UnbindAddress (addr , DefaultDummyDevice ); err != nil {
1653
+ klog .Errorf ("Failed to unbind service addr %s from dummy interface %s: %v" , addr , DefaultDummyDevice , err )
1654
+ } else {
1655
+ // In case we delete a multi-port service, avoid trying to unbind multiple times
1656
+ delete (legacyBindAddrs , addr )
1657
+ }
1642
1658
}
1643
1659
}
1644
1660
}
1645
1661
}
1646
1662
}
1647
1663
1648
- func (proxier * Proxier ) cleanLegacyBindAddr (activeBindAddrs map [string ]bool , currentBindAddrs []string ) {
1664
+ func (proxier * Proxier ) getLegacyBindAddr (activeBindAddrs map [string ]bool , currentBindAddrs []string ) map [string ]bool {
1665
+ legacyAddrs := make (map [string ]bool )
1649
1666
for _ , addr := range currentBindAddrs {
1650
1667
if _ , ok := activeBindAddrs [addr ]; ! ok {
1651
- // This address was not processed in the latest sync loop
1652
- klog .V (4 ).Infof ("Unbind addr %s" , addr )
1653
- err := proxier .netlinkHandle .UnbindAddress (addr , DefaultDummyDevice )
1654
- // Ignore no such address error when try to unbind address
1655
- if err != nil {
1656
- klog .Errorf ("Failed to unbind service addr %s from dummy interface %s: %v" , addr , DefaultDummyDevice , err )
1657
- }
1668
+ legacyAddrs [addr ] = true
1658
1669
}
1659
1670
}
1671
+ return legacyAddrs
1660
1672
}
1661
1673
1662
1674
// Join all words with spaces, terminate with newline and write to buff.
0 commit comments