@@ -1782,6 +1782,16 @@ func (nsc *NetworkServicesController) Cleanup() {
1782
1782
handle .Close ()
1783
1783
}
1784
1784
1785
+ // In prep for further steps make sure that ipset and iptables handlers are created
1786
+ if len (nsc .iptablesCmdHandlers ) < 1 {
1787
+ // Even though we have a config at this point (via passed param), we want to send nil so that the node will
1788
+ // discover which IP address families it has and act accordingly
1789
+ err = nsc .setupHandlers (nil , nil )
1790
+ if err != nil {
1791
+ klog .Errorf ("could not cleanup because we couldn't create iptables/ipset command handlers due to: %v" , err )
1792
+ }
1793
+ }
1794
+
1785
1795
// cleanup iptables masquerade rule
1786
1796
err = nsc .deleteMasqueradeIptablesRule ()
1787
1797
if err != nil {
@@ -1790,15 +1800,21 @@ func (nsc *NetworkServicesController) Cleanup() {
1790
1800
}
1791
1801
1792
1802
// cleanup iptables hairpin rules
1793
- err = nsc .deleteHairpinIptablesRules (v1 .IPv4Protocol )
1794
- if err != nil {
1795
- klog .Errorf ("Failed to cleanup iptables hairpin rules: %s" , err .Error ())
1796
- return
1803
+ if _ , ok := nsc .iptablesCmdHandlers [v1 .IPv4Protocol ]; ok {
1804
+ klog .Info ("Processing IPv4 hairpin rule cleanup" )
1805
+ err = nsc .deleteHairpinIptablesRules (v1 .IPv4Protocol )
1806
+ if err != nil {
1807
+ klog .Errorf ("Failed to cleanup iptables hairpin rules: %s" , err .Error ())
1808
+ return
1809
+ }
1797
1810
}
1798
- err = nsc .deleteHairpinIptablesRules (v1 .IPv6Protocol )
1799
- if err != nil {
1800
- klog .Errorf ("Failed to cleanup iptables hairpin rules: %s" , err .Error ())
1801
- return
1811
+ if _ , ok := nsc .iptablesCmdHandlers [v1 .IPv6Protocol ]; ok {
1812
+ klog .Info ("Processing IPv6 hairpin rule cleanup" )
1813
+ err = nsc .deleteHairpinIptablesRules (v1 .IPv6Protocol )
1814
+ if err != nil {
1815
+ klog .Errorf ("Failed to cleanup iptables hairpin rules: %s" , err .Error ())
1816
+ return
1817
+ }
1802
1818
}
1803
1819
1804
1820
nsc .cleanupIpvsFirewall ()
@@ -1927,6 +1943,70 @@ func (nsc *NetworkServicesController) handleServiceDelete(obj interface{}) {
1927
1943
nsc .OnServiceUpdate (service )
1928
1944
}
1929
1945
1946
+ // setupHandlers Here we test to see whether the node is IPv6 capable, if the user has enabled IPv6 (via command-line
1947
+ // options) and the node has an IPv6 address, the following method will return an IPv6 address
1948
+ func (nsc * NetworkServicesController ) setupHandlers (config * options.KubeRouterConfig , node * v1.Node ) error {
1949
+ // node being nil covers the case where this function is called by something that doesn't have a kube-apiserver
1950
+ // connection like the cleanup code. In this instance we want all possible iptables and ipset handlers
1951
+ if node != nil {
1952
+ nsc .nodeIPv4Addrs , nsc .nodeIPv6Addrs = utils .GetAllNodeIPs (node )
1953
+ }
1954
+
1955
+ // We test for nil configs as the Cleanup() method often doesn't have a valid config in this respect, so rather
1956
+ // than trying to guess options, it is better to just let the logic fallthrough. For the primary path to this func,
1957
+ // NewNetworkServicesController, the config will not be nil and we want to check that we have options that match
1958
+ // the node's capability to ensure sanity later down the road.
1959
+ if config != nil {
1960
+ if config .EnableIPv4 && len (nsc .nodeIPv4Addrs [v1 .NodeInternalIP ]) < 1 &&
1961
+ len (nsc .nodeIPv4Addrs [v1 .NodeExternalIP ]) < 1 {
1962
+ return fmt .Errorf ("IPv4 was enabled, but no IPv4 address was found on the node" )
1963
+ }
1964
+ }
1965
+ nsc .isIPv4Capable = len (nsc .nodeIPv4Addrs ) > 0
1966
+ if config != nil {
1967
+ if config .EnableIPv6 && len (nsc .nodeIPv6Addrs [v1 .NodeInternalIP ]) < 1 &&
1968
+ len (nsc .nodeIPv6Addrs [v1 .NodeExternalIP ]) < 1 {
1969
+ return fmt .Errorf ("IPv6 was enabled, but no IPv6 address was found on the node" )
1970
+ }
1971
+ }
1972
+ nsc .isIPv6Capable = len (nsc .nodeIPv6Addrs ) > 0
1973
+
1974
+ nsc .ipSetHandlers = make (map [v1.IPFamily ]utils.IPSetHandler )
1975
+ nsc .iptablesCmdHandlers = make (map [v1.IPFamily ]utils.IPTablesHandler )
1976
+ if node == nil || len (nsc .nodeIPv4Addrs ) > 0 {
1977
+ iptHandler , err := iptables .NewWithProtocol (iptables .ProtocolIPv4 )
1978
+ if err != nil {
1979
+ klog .Fatalf ("Failed to allocate IPv4 iptables handler: %v" , err )
1980
+ return fmt .Errorf ("failed to create iptables handler: %w" , err )
1981
+ }
1982
+ nsc .iptablesCmdHandlers [v1 .IPv4Protocol ] = iptHandler
1983
+
1984
+ ipset , err := utils .NewIPSet (false )
1985
+ if err != nil {
1986
+ klog .Fatalf ("Failed to allocate IPv4 ipset handler: %v" , err )
1987
+ return fmt .Errorf ("failed to create ipset handler: %w" , err )
1988
+ }
1989
+ nsc .ipSetHandlers [v1 .IPv4Protocol ] = ipset
1990
+ }
1991
+ if node == nil || len (nsc .nodeIPv6Addrs ) > 0 {
1992
+ iptHandler , err := iptables .NewWithProtocol (iptables .ProtocolIPv6 )
1993
+ if err != nil {
1994
+ klog .Fatalf ("Failed to allocate IPv6 iptables handler: %v" , err )
1995
+ return fmt .Errorf ("failed to create iptables handler: %w" , err )
1996
+ }
1997
+ nsc .iptablesCmdHandlers [v1 .IPv6Protocol ] = iptHandler
1998
+
1999
+ ipset , err := utils .NewIPSet (true )
2000
+ if err != nil {
2001
+ klog .Fatalf ("Failed to allocate IPv6 ipset handler: %v" , err )
2002
+ return fmt .Errorf ("failed to create ipset handler: %w" , err )
2003
+ }
2004
+ nsc .ipSetHandlers [v1 .IPv6Protocol ] = ipset
2005
+ }
2006
+
2007
+ return nil
2008
+ }
2009
+
1930
2010
// NewNetworkServicesController returns NetworkServicesController object
1931
2011
func NewNetworkServicesController (clientset kubernetes.Interface ,
1932
2012
config * options.KubeRouterConfig , svcInformer cache.SharedIndexInformer ,
@@ -2021,51 +2101,9 @@ func NewNetworkServicesController(clientset kubernetes.Interface,
2021
2101
return nil , err
2022
2102
}
2023
2103
2024
- // Here we test to see whether the node is IPv6 capable, if the user has enabled IPv6 (via command-line options)
2025
- // and the node has an IPv6 address, the following method will return an IPv6 address
2026
- nsc .nodeIPv4Addrs , nsc .nodeIPv6Addrs = utils .GetAllNodeIPs (node )
2027
- if config .EnableIPv4 && len (nsc .nodeIPv4Addrs [v1 .NodeInternalIP ]) < 1 &&
2028
- len (nsc .nodeIPv4Addrs [v1 .NodeExternalIP ]) < 1 {
2029
- return nil , fmt .Errorf ("IPv4 was enabled, but no IPv4 address was found on the node" )
2030
- }
2031
- nsc .isIPv4Capable = len (nsc .nodeIPv4Addrs ) > 0
2032
- if config .EnableIPv6 && len (nsc .nodeIPv6Addrs [v1 .NodeInternalIP ]) < 1 &&
2033
- len (nsc .nodeIPv6Addrs [v1 .NodeExternalIP ]) < 1 {
2034
- return nil , fmt .Errorf ("IPv6 was enabled, but no IPv6 address was found on the node" )
2035
- }
2036
- nsc .isIPv6Capable = len (nsc .nodeIPv6Addrs ) > 0
2037
-
2038
- nsc .ipSetHandlers = make (map [v1.IPFamily ]utils.IPSetHandler )
2039
- nsc .iptablesCmdHandlers = make (map [v1.IPFamily ]utils.IPTablesHandler )
2040
- if len (nsc .nodeIPv4Addrs ) > 0 {
2041
- iptHandler , err := iptables .NewWithProtocol (iptables .ProtocolIPv4 )
2042
- if err != nil {
2043
- klog .Fatalf ("Failed to allocate IPv4 iptables handler: %v" , err )
2044
- return nil , fmt .Errorf ("failed to create iptables handler: %w" , err )
2045
- }
2046
- nsc .iptablesCmdHandlers [v1 .IPv4Protocol ] = iptHandler
2047
-
2048
- ipset , err := utils .NewIPSet (false )
2049
- if err != nil {
2050
- klog .Fatalf ("Failed to allocate IPv4 ipset handler: %v" , err )
2051
- return nil , fmt .Errorf ("failed to create ipset handler: %w" , err )
2052
- }
2053
- nsc .ipSetHandlers [v1 .IPv4Protocol ] = ipset
2054
- }
2055
- if len (nsc .nodeIPv6Addrs ) > 0 {
2056
- iptHandler , err := iptables .NewWithProtocol (iptables .ProtocolIPv6 )
2057
- if err != nil {
2058
- klog .Fatalf ("Failed to allocate IPv6 iptables handler: %v" , err )
2059
- return nil , fmt .Errorf ("failed to create iptables handler: %w" , err )
2060
- }
2061
- nsc .iptablesCmdHandlers [v1 .IPv6Protocol ] = iptHandler
2062
-
2063
- ipset , err := utils .NewIPSet (true )
2064
- if err != nil {
2065
- klog .Fatalf ("Failed to allocate IPv6 ipset handler: %v" , err )
2066
- return nil , fmt .Errorf ("failed to create ipset handler: %w" , err )
2067
- }
2068
- nsc .ipSetHandlers [v1 .IPv6Protocol ] = ipset
2104
+ err = nsc .setupHandlers (config , node )
2105
+ if err != nil {
2106
+ return nil , err
2069
2107
}
2070
2108
2071
2109
automtu , err := utils .GetMTUFromNodeIP (nsc .primaryIP )
0 commit comments