diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 08088733f90..55953182577 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -65,6 +65,9 @@ const ( // the services chain kubeServicesChain utiliptables.Chain = "KUBE-SERVICES" + // the external services chain + kubeExternalServicesChain utiliptables.Chain = "KUBE-EXTERNAL-SERVICES" + // the nodeports chain kubeNodePortsChain utiliptables.Chain = "KUBE-NODEPORTS" @@ -433,7 +436,7 @@ type iptablesJumpChain struct { } var iptablesJumpChains = []iptablesJumpChain{ - {utiliptables.TableFilter, kubeServicesChain, utiliptables.ChainInput, "kubernetes service portals"}, + {utiliptables.TableFilter, kubeExternalServicesChain, utiliptables.ChainInput, "kubernetes externally-visible service portals"}, {utiliptables.TableFilter, kubeServicesChain, utiliptables.ChainOutput, "kubernetes service portals"}, {utiliptables.TableNAT, kubeServicesChain, utiliptables.ChainOutput, "kubernetes service portals"}, {utiliptables.TableNAT, kubeServicesChain, utiliptables.ChainPrerouting, "kubernetes service portals"}, @@ -441,11 +444,16 @@ var iptablesJumpChains = []iptablesJumpChain{ {utiliptables.TableFilter, kubeForwardChain, utiliptables.ChainForward, "kubernetes forwarding rules"}, } +var iptablesCleanupOnlyChains = []iptablesJumpChain{ + // Present in kube 1.6 - 1.9. Removed by #56164 in favor of kubeExternalServicesChain + {utiliptables.TableFilter, kubeServicesChain, utiliptables.ChainInput, "kubernetes service portals"}, +} + // CleanupLeftovers removes all iptables rules and chains created by the Proxier // It returns true if an error was encountered. Errors are logged. func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { // Unlink our chains - for _, chain := range iptablesJumpChains { + for _, chain := range append(iptablesJumpChains, iptablesCleanupOnlyChains...) { args := []string{ "-m", "comment", "--comment", chain.comment, "-j", string(chain.chain), @@ -504,7 +512,7 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { filterChains := bytes.NewBuffer(nil) filterRules := bytes.NewBuffer(nil) writeLine(filterChains, "*filter") - for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeForwardChain} { + for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { if _, found := existingFilterChains[chain]; found { chainString := string(chain) writeLine(filterChains, existingFilterChains[chain]) @@ -770,7 +778,7 @@ func (proxier *Proxier) syncProxyRules() { // Make sure we keep stats for the top-level chains, if they existed // (which most should have because we created them above). - for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeForwardChain} { + for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { if chain, ok := existingFilterChains[chainName]; ok { writeLine(proxier.filterChains, chain) } else { @@ -941,7 +949,7 @@ func (proxier *Proxier) syncProxyRules() { // Install ICMP Reject rule in filter table for destination=externalIP and dport=svcport if len(proxier.endpointsMap[svcName]) == 0 { writeLine(proxier.filterRules, - "-A", string(kubeServicesChain), + "-A", string(kubeExternalServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", protocol, "-p", protocol, "-d", utilproxy.ToCIDR(net.ParseIP(externalIP)), @@ -1082,7 +1090,7 @@ func (proxier *Proxier) syncProxyRules() { // chain. if len(proxier.endpointsMap[svcName]) == 0 { writeLine(proxier.filterRules, - "-A", string(kubeServicesChain), + "-A", string(kubeExternalServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", "addrtype", "--dst-type", "LOCAL", "-m", protocol, "-p", protocol, diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 441a79f0198..d52acfd67d5 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -807,7 +807,7 @@ func TestExternalIPsReject(t *testing.T) { fp.syncProxyRules() - kubeSvcRules := ipt.GetRules(string(kubeServicesChain)) + kubeSvcRules := ipt.GetRules(string(kubeExternalServicesChain)) if !hasJump(kubeSvcRules, iptablestest.Reject, svcExternalIPs, svcPort) { errorf(fmt.Sprintf("Failed to a %v rule for externalIP %v with no endpoints", iptablestest.Reject, svcPortName), kubeSvcRules, t) } @@ -840,7 +840,7 @@ func TestNodePortReject(t *testing.T) { fp.syncProxyRules() - kubeSvcRules := ipt.GetRules(string(kubeServicesChain)) + kubeSvcRules := ipt.GetRules(string(kubeExternalServicesChain)) if !hasJump(kubeSvcRules, iptablestest.Reject, svcIP, svcNodePort) { errorf(fmt.Sprintf("Failed to find a %v rule for service %v with no endpoints", iptablestest.Reject, svcPortName), kubeSvcRules, t) }