clean up LocalTrafficDetector construction / tests (#124582)
* LocalTrafficDetector construction and test improvements * Reorder getLocalDetector unit test fields so "input" args come before "output" args * Don't pass DetectLocalMode as a separate arg to getLocalDetector It's already part of `config` * Clarify test names in preparation for merging * Merge single-stack/dual-stack LocalTrafficDetector construction Also, only warn if the *primary* IP family is not correctly configured (since we don't actually know if the cluster is really dual-stack or not), and pass the pair of detectors to the proxiers as a map rather than an array. * Remove the rest of Test_getDualStackLocalDetectorTuple
This commit is contained in:
@@ -162,18 +162,16 @@ func (s *ProxyServer) platformCheckSupported(ctx context.Context) (ipv4Supported
|
|||||||
func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.KubeProxyConfiguration, dualStack, initOnly bool) (proxy.Provider, error) {
|
func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.KubeProxyConfiguration, dualStack, initOnly bool) (proxy.Provider, error) {
|
||||||
logger := klog.FromContext(ctx)
|
logger := klog.FromContext(ctx)
|
||||||
var proxier proxy.Provider
|
var proxier proxy.Provider
|
||||||
var localDetectors [2]proxyutil.LocalTrafficDetector
|
|
||||||
var localDetector proxyutil.LocalTrafficDetector
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
localDetectors := getLocalDetectors(logger, s.PrimaryIPFamily, config, s.podCIDRs)
|
||||||
|
|
||||||
if config.Mode == proxyconfigapi.ProxyModeIPTables {
|
if config.Mode == proxyconfigapi.ProxyModeIPTables {
|
||||||
logger.Info("Using iptables Proxier")
|
logger.Info("Using iptables Proxier")
|
||||||
|
|
||||||
if dualStack {
|
if dualStack {
|
||||||
ipt, _ := getIPTables(s.PrimaryIPFamily)
|
ipt, _ := getIPTables(s.PrimaryIPFamily)
|
||||||
|
|
||||||
localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
// TODO this has side effects that should only happen when Run() is invoked.
|
// TODO this has side effects that should only happen when Run() is invoked.
|
||||||
proxier, err = iptables.NewDualStackProxier(
|
proxier, err = iptables.NewDualStackProxier(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -196,7 +194,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
} else {
|
} else {
|
||||||
// Create a single-stack proxier if and only if the node does not support dual-stack (i.e, no iptables support).
|
// Create a single-stack proxier if and only if the node does not support dual-stack (i.e, no iptables support).
|
||||||
_, iptInterface := getIPTables(s.PrimaryIPFamily)
|
_, iptInterface := getIPTables(s.PrimaryIPFamily)
|
||||||
localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
// TODO this has side effects that should only happen when Run() is invoked.
|
// TODO this has side effects that should only happen when Run() is invoked.
|
||||||
proxier, err = iptables.NewProxier(
|
proxier, err = iptables.NewProxier(
|
||||||
@@ -210,7 +207,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
config.IPTables.MasqueradeAll,
|
config.IPTables.MasqueradeAll,
|
||||||
*config.IPTables.LocalhostNodePorts,
|
*config.IPTables.LocalhostNodePorts,
|
||||||
int(*config.IPTables.MasqueradeBit),
|
int(*config.IPTables.MasqueradeBit),
|
||||||
localDetector,
|
localDetectors[s.PrimaryIPFamily],
|
||||||
s.Hostname,
|
s.Hostname,
|
||||||
s.NodeIPs[s.PrimaryIPFamily],
|
s.NodeIPs[s.PrimaryIPFamily],
|
||||||
s.Recorder,
|
s.Recorder,
|
||||||
@@ -234,10 +231,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
logger.Info("Using ipvs Proxier")
|
logger.Info("Using ipvs Proxier")
|
||||||
if dualStack {
|
if dualStack {
|
||||||
ipt, _ := getIPTables(s.PrimaryIPFamily)
|
ipt, _ := getIPTables(s.PrimaryIPFamily)
|
||||||
|
|
||||||
// Always ordered to match []ipt
|
|
||||||
localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
proxier, err = ipvs.NewDualStackProxier(
|
proxier, err = ipvs.NewDualStackProxier(
|
||||||
ctx,
|
ctx,
|
||||||
ipt,
|
ipt,
|
||||||
@@ -265,8 +258,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
_, iptInterface := getIPTables(s.PrimaryIPFamily)
|
_, iptInterface := getIPTables(s.PrimaryIPFamily)
|
||||||
localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
proxier, err = ipvs.NewProxier(
|
proxier, err = ipvs.NewProxier(
|
||||||
ctx,
|
ctx,
|
||||||
s.PrimaryIPFamily,
|
s.PrimaryIPFamily,
|
||||||
@@ -284,7 +275,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
config.IPVS.UDPTimeout.Duration,
|
config.IPVS.UDPTimeout.Duration,
|
||||||
config.IPTables.MasqueradeAll,
|
config.IPTables.MasqueradeAll,
|
||||||
int(*config.IPTables.MasqueradeBit),
|
int(*config.IPTables.MasqueradeBit),
|
||||||
localDetector,
|
localDetectors[s.PrimaryIPFamily],
|
||||||
s.Hostname,
|
s.Hostname,
|
||||||
s.NodeIPs[s.PrimaryIPFamily],
|
s.NodeIPs[s.PrimaryIPFamily],
|
||||||
s.Recorder,
|
s.Recorder,
|
||||||
@@ -301,8 +292,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
logger.Info("Using nftables Proxier")
|
logger.Info("Using nftables Proxier")
|
||||||
|
|
||||||
if dualStack {
|
if dualStack {
|
||||||
localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
// TODO this has side effects that should only happen when Run() is invoked.
|
// TODO this has side effects that should only happen when Run() is invoked.
|
||||||
proxier, err = nftables.NewDualStackProxier(
|
proxier, err = nftables.NewDualStackProxier(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -321,8 +310,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// Create a single-stack proxier if and only if the node does not support dual-stack
|
// Create a single-stack proxier if and only if the node does not support dual-stack
|
||||||
localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs)
|
|
||||||
|
|
||||||
// TODO this has side effects that should only happen when Run() is invoked.
|
// TODO this has side effects that should only happen when Run() is invoked.
|
||||||
proxier, err = nftables.NewProxier(
|
proxier, err = nftables.NewProxier(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -332,7 +319,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.
|
|||||||
config.NFTables.MinSyncPeriod.Duration,
|
config.NFTables.MinSyncPeriod.Duration,
|
||||||
config.NFTables.MasqueradeAll,
|
config.NFTables.MasqueradeAll,
|
||||||
int(*config.NFTables.MasqueradeBit),
|
int(*config.NFTables.MasqueradeBit),
|
||||||
localDetector,
|
localDetectors[s.PrimaryIPFamily],
|
||||||
s.Hostname,
|
s.Hostname,
|
||||||
s.NodeIPs[s.PrimaryIPFamily],
|
s.NodeIPs[s.PrimaryIPFamily],
|
||||||
s.Recorder,
|
s.Recorder,
|
||||||
@@ -484,48 +471,45 @@ func detectNumCPU() int {
|
|||||||
return numCPU
|
return numCPU
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLocalDetector(logger klog.Logger, ipFamily v1.IPFamily, mode proxyconfigapi.LocalMode, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) proxyutil.LocalTrafficDetector {
|
func getLocalDetectors(logger klog.Logger, primaryIPFamily v1.IPFamily, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) map[v1.IPFamily]proxyutil.LocalTrafficDetector {
|
||||||
switch mode {
|
localDetectors := map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
}
|
||||||
|
|
||||||
|
switch config.DetectLocalMode {
|
||||||
case proxyconfigapi.LocalModeClusterCIDR:
|
case proxyconfigapi.LocalModeClusterCIDR:
|
||||||
// LocalModeClusterCIDR is the default if --detect-local-mode wasn't passed,
|
clusterCIDRs := strings.Split(strings.TrimSpace(config.ClusterCIDR), ",")
|
||||||
// but --cluster-cidr is optional.
|
for family, cidrs := range proxyutil.MapCIDRsByIPFamily(clusterCIDRs) {
|
||||||
clusterCIDRs := strings.TrimSpace(config.ClusterCIDR)
|
localDetectors[family] = proxyutil.NewDetectLocalByCIDR(cidrs[0].String())
|
||||||
if len(clusterCIDRs) == 0 {
|
|
||||||
logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR defined")
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
if !localDetectors[primaryIPFamily].IsImplemented() {
|
||||||
cidrsByFamily := proxyutil.MapCIDRsByIPFamily(strings.Split(clusterCIDRs, ","))
|
logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR specified for primary IP family", "ipFamily", primaryIPFamily, "clusterCIDR", config.ClusterCIDR)
|
||||||
if len(cidrsByFamily[ipFamily]) != 0 {
|
|
||||||
return proxyutil.NewDetectLocalByCIDR(cidrsByFamily[ipFamily][0].String())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR for family", "ipFamily", ipFamily)
|
|
||||||
|
|
||||||
case proxyconfigapi.LocalModeNodeCIDR:
|
case proxyconfigapi.LocalModeNodeCIDR:
|
||||||
cidrsByFamily := proxyutil.MapCIDRsByIPFamily(nodePodCIDRs)
|
for family, cidrs := range proxyutil.MapCIDRsByIPFamily(nodePodCIDRs) {
|
||||||
if len(cidrsByFamily[ipFamily]) != 0 {
|
localDetectors[family] = proxyutil.NewDetectLocalByCIDR(cidrs[0].String())
|
||||||
return proxyutil.NewDetectLocalByCIDR(cidrsByFamily[ipFamily][0].String())
|
}
|
||||||
|
if !localDetectors[primaryIPFamily].IsImplemented() {
|
||||||
|
logger.Info("Detect-local-mode set to NodeCIDR, but no PodCIDR defined at node for primary IP family", "ipFamily", primaryIPFamily, "podCIDRs", nodePodCIDRs)
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("Detect-local-mode set to NodeCIDR, but no PodCIDR defined at node for family", "ipFamily", ipFamily)
|
|
||||||
|
|
||||||
case proxyconfigapi.LocalModeBridgeInterface:
|
case proxyconfigapi.LocalModeBridgeInterface:
|
||||||
return proxyutil.NewDetectLocalByBridgeInterface(config.DetectLocal.BridgeInterface)
|
localDetector := proxyutil.NewDetectLocalByBridgeInterface(config.DetectLocal.BridgeInterface)
|
||||||
|
localDetectors[v1.IPv4Protocol] = localDetector
|
||||||
|
localDetectors[v1.IPv6Protocol] = localDetector
|
||||||
|
|
||||||
case proxyconfigapi.LocalModeInterfaceNamePrefix:
|
case proxyconfigapi.LocalModeInterfaceNamePrefix:
|
||||||
return proxyutil.NewDetectLocalByInterfaceNamePrefix(config.DetectLocal.InterfaceNamePrefix)
|
localDetector := proxyutil.NewDetectLocalByInterfaceNamePrefix(config.DetectLocal.InterfaceNamePrefix)
|
||||||
|
localDetectors[v1.IPv4Protocol] = localDetector
|
||||||
|
localDetectors[v1.IPv6Protocol] = localDetector
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.Info("Defaulting to no-op detect-local")
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("Defaulting to no-op detect-local")
|
return localDetectors
|
||||||
return proxyutil.NewNoOpLocalDetector()
|
|
||||||
}
|
|
||||||
|
|
||||||
func getDualStackLocalDetectorTuple(logger klog.Logger, mode proxyconfigapi.LocalMode, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) [2]proxyutil.LocalTrafficDetector {
|
|
||||||
return [2]proxyutil.LocalTrafficDetector{
|
|
||||||
getLocalDetector(logger, v1.IPv4Protocol, mode, config, nodePodCIDRs),
|
|
||||||
getLocalDetector(logger, v1.IPv6Protocol, mode, config, nodePodCIDRs),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// platformCleanup removes stale kube-proxy rules that can be safely removed. If
|
// platformCleanup removes stale kube-proxy rules that can be safely removed. If
|
||||||
|
@@ -108,299 +108,292 @@ func Test_platformApplyDefaults(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_getLocalDetector(t *testing.T) {
|
func Test_getLocalDetectors(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
name string
|
name string
|
||||||
mode proxyconfigapi.LocalMode
|
config *proxyconfigapi.KubeProxyConfiguration
|
||||||
config *proxyconfigapi.KubeProxyConfiguration
|
primaryIPFamily v1.IPFamily
|
||||||
family v1.IPFamily
|
nodePodCIDRs []string
|
||||||
expected proxyutil.LocalTrafficDetector
|
expected map[v1.IPFamily]proxyutil.LocalTrafficDetector
|
||||||
nodePodCIDRs []string
|
|
||||||
}{
|
}{
|
||||||
// LocalModeClusterCIDR
|
// LocalModeClusterCIDR
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, IPv4 cluster",
|
name: "LocalModeClusterCIDR, single-stack IPv4 cluster",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "10.0.0.0/14",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, IPv6 cluster",
|
name: "LocalModeClusterCIDR, single-stack IPv6 cluster",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv6Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
},
|
||||||
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, IPv6 cluster with IPv4 config",
|
name: "LocalModeClusterCIDR, single-stack IPv6 cluster with single-stack IPv4 config",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv6Protocol,
|
ClusterCIDR: "10.0.0.0/14",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
// This will output a warning that there is no IPv6 CIDR but it
|
||||||
|
// will still use the provided IPv4 CIDR for IPv4.
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, IPv4 cluster with IPv6 config",
|
name: "LocalModeClusterCIDR, single-stack IPv4 cluster with single-stack IPv6 config",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
// This will output a warning that there is no IPv4 CIDR but it
|
||||||
|
// will still use the provided IPv6 CIDR for IPv6.
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, IPv4 kube-proxy in dual-stack IPv6-primary cluster",
|
name: "LocalModeClusterCIDR, dual-stack IPv4-primary cluster",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeClusterCIDR, no ClusterCIDR",
|
name: "LocalModeClusterCIDR, dual-stack IPv6-primary cluster",
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""},
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeClusterCIDR, IPv4-primary kube-proxy / IPv6-primary config",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
|
ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14",
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeClusterCIDR, no ClusterCIDR",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR,
|
||||||
|
ClusterCIDR: "",
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// LocalModeNodeCIDR
|
// LocalModeNodeCIDR
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, IPv4 cluster",
|
name: "LocalModeNodeCIDR, single-stack IPv4 cluster",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "10.0.0.0/14",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
},
|
||||||
nodePodCIDRs: []string{"10.0.0.0/24"},
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
nodePodCIDRs: []string{"10.0.0.0/24"},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, IPv6 cluster",
|
name: "LocalModeNodeCIDR, single-stack IPv6 cluster",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv6Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
},
|
||||||
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"},
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, IPv6 cluster with IPv4 config",
|
name: "LocalModeNodeCIDR, single-stack IPv6 cluster with single-stack IPv4 config",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv6Protocol,
|
ClusterCIDR: "10.0.0.0/14",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
nodePodCIDRs: []string{"10.0.0.0/24"},
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
nodePodCIDRs: []string{"10.0.0.0/24"},
|
||||||
|
// This will output a warning that there is no IPv6 CIDR but it
|
||||||
|
// will still use the provided IPv4 CIDR for IPv4.
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, IPv4 cluster with IPv6 config",
|
name: "LocalModeNodeCIDR, single-stack IPv4 cluster with single-stack IPv6 config",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"},
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"},
|
||||||
|
// This will output a warning that there is no IPv4 CIDR but it
|
||||||
|
// will still use the provided IPv6 CIDR for IPv6.
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, IPv6 kube-proxy in dual-stack IPv4-primary cluster",
|
name: "LocalModeNodeCIDR, dual-stack IPv4-primary cluster",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv6Protocol,
|
ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64",
|
||||||
expected: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
},
|
||||||
nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"},
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "LocalModeNodeCIDR, no PodCIDRs",
|
name: "LocalModeNodeCIDR, dual-stack IPv6-primary cluster",
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""},
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
family: v1.IPv4Protocol,
|
ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14",
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
},
|
||||||
nodePodCIDRs: []string{},
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96", "10.0.0.0/24"},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeNodeCIDR, IPv6-primary kube-proxy / IPv4-primary config",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
|
ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64",
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv6Protocol,
|
||||||
|
nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeNodeCIDR, no PodCIDRs",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR,
|
||||||
|
ClusterCIDR: "",
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
nodePodCIDRs: []string{},
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// unknown mode
|
// unknown mode
|
||||||
{
|
{
|
||||||
name: "unknown LocalMode",
|
name: "unknown LocalMode",
|
||||||
mode: proxyconfigapi.LocalMode("abcd"),
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
|
||||||
family: v1.IPv4Protocol,
|
|
||||||
expected: proxyutil.NewNoOpLocalDetector(),
|
|
||||||
},
|
|
||||||
// LocalModeBridgeInterface
|
|
||||||
{
|
|
||||||
name: "LocalModeBrideInterface",
|
|
||||||
mode: proxyconfigapi.LocalModeBridgeInterface,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"},
|
DetectLocalMode: proxyconfigapi.LocalMode("abcd"),
|
||||||
|
ClusterCIDR: "10.0.0.0/14",
|
||||||
},
|
},
|
||||||
family: v1.IPv4Protocol,
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
expected: proxyutil.NewDetectLocalByBridgeInterface("eth"),
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
},
|
v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
{
|
v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(),
|
||||||
name: "LocalModeBridgeInterface, strange bridge name",
|
|
||||||
mode: proxyconfigapi.LocalModeBridgeInterface,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "1234567890123456789"},
|
|
||||||
},
|
},
|
||||||
family: v1.IPv4Protocol,
|
|
||||||
expected: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"),
|
|
||||||
},
|
|
||||||
// LocalModeInterfaceNamePrefix
|
|
||||||
{
|
|
||||||
name: "LocalModeInterfaceNamePrefix",
|
|
||||||
mode: proxyconfigapi.LocalModeInterfaceNamePrefix,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "eth"},
|
|
||||||
},
|
|
||||||
family: v1.IPv4Protocol,
|
|
||||||
expected: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeInterfaceNamePrefix, strange interface name",
|
|
||||||
mode: proxyconfigapi.LocalModeInterfaceNamePrefix,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "1234567890123456789"},
|
|
||||||
},
|
|
||||||
family: v1.IPv4Protocol,
|
|
||||||
expected: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, c := range cases {
|
|
||||||
t.Run(c.name, func(t *testing.T) {
|
|
||||||
logger, _ := ktesting.NewTestContext(t)
|
|
||||||
r := getLocalDetector(logger, c.family, c.mode, c.config, c.nodePodCIDRs)
|
|
||||||
if !reflect.DeepEqual(r, c.expected) {
|
|
||||||
t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_getDualStackLocalDetectorTuple(t *testing.T) {
|
|
||||||
cases := []struct {
|
|
||||||
name string
|
|
||||||
mode proxyconfigapi.LocalMode
|
|
||||||
config *proxyconfigapi.KubeProxyConfiguration
|
|
||||||
expected [2]proxyutil.LocalTrafficDetector
|
|
||||||
nodePodCIDRs []string
|
|
||||||
}{
|
|
||||||
// LocalModeClusterCIDR
|
|
||||||
{
|
|
||||||
name: "LocalModeClusterCIDR, dual-stack IPv4-primary cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeClusterCIDR, dual-stack IPv6-primary cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeClusterCIDR, single-stack IPv4 cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"),
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeClusterCIDR, single-stack IPv6 cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeClusterCIDR, no ClusterCIDR",
|
|
||||||
mode: proxyconfigapi.LocalModeClusterCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// LocalModeNodeCIDR
|
|
||||||
{
|
|
||||||
name: "LocalModeNodeCIDR, dual-stack IPv4-primary cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
|
||||||
},
|
|
||||||
nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeNodeCIDR, dual-stack IPv6-primary cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
|
||||||
},
|
|
||||||
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96", "10.0.0.0/24"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeNodeCIDR, single-stack IPv4 cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"),
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
},
|
|
||||||
nodePodCIDRs: []string{"10.0.0.0/24"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeNodeCIDR, single-stack IPv6 cluster",
|
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"),
|
|
||||||
},
|
|
||||||
nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LocalModeNodeCIDR, no PodCIDRs",
|
|
||||||
mode: proxyconfigapi.LocalModeNodeCIDR,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""},
|
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
proxyutil.NewNoOpLocalDetector(),
|
|
||||||
},
|
|
||||||
nodePodCIDRs: []string{},
|
|
||||||
},
|
},
|
||||||
// LocalModeBridgeInterface
|
// LocalModeBridgeInterface
|
||||||
{
|
{
|
||||||
name: "LocalModeBridgeInterface",
|
name: "LocalModeBridgeInterface",
|
||||||
mode: proxyconfigapi.LocalModeBridgeInterface,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"},
|
DetectLocalMode: proxyconfigapi.LocalModeBridgeInterface,
|
||||||
|
DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"},
|
||||||
},
|
},
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
proxyutil.NewDetectLocalByBridgeInterface("eth"),
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
proxyutil.NewDetectLocalByBridgeInterface("eth"),
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByBridgeInterface("eth"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByBridgeInterface("eth"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeBridgeInterface, strange bridge name",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeBridgeInterface,
|
||||||
|
DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "1234567890123456789"},
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// LocalModeInterfaceNamePrefix
|
// LocalModeInterfaceNamePrefix
|
||||||
{
|
{
|
||||||
name: "LocalModeInterfaceNamePrefix",
|
name: "LocalModeInterfaceNamePrefix",
|
||||||
mode: proxyconfigapi.LocalModeInterfaceNamePrefix,
|
|
||||||
config: &proxyconfigapi.KubeProxyConfiguration{
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "veth"},
|
DetectLocalMode: proxyconfigapi.LocalModeInterfaceNamePrefix,
|
||||||
|
DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "eth"},
|
||||||
},
|
},
|
||||||
expected: [2]proxyutil.LocalTrafficDetector{
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
proxyutil.NewDetectLocalByInterfaceNamePrefix("veth"),
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
proxyutil.NewDetectLocalByInterfaceNamePrefix("veth"),
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LocalModeInterfaceNamePrefix, strange interface name",
|
||||||
|
config: &proxyconfigapi.KubeProxyConfiguration{
|
||||||
|
DetectLocalMode: proxyconfigapi.LocalModeInterfaceNamePrefix,
|
||||||
|
DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "1234567890123456789"},
|
||||||
|
},
|
||||||
|
primaryIPFamily: v1.IPv4Protocol,
|
||||||
|
expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{
|
||||||
|
v1.IPv4Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"),
|
||||||
|
v1.IPv6Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, c := range cases {
|
for _, c := range cases {
|
||||||
t.Run(c.name, func(t *testing.T) {
|
t.Run(c.name, func(t *testing.T) {
|
||||||
logger, _ := ktesting.NewTestContext(t)
|
logger, _ := ktesting.NewTestContext(t)
|
||||||
r := getDualStackLocalDetectorTuple(logger, c.mode, c.config, c.nodePodCIDRs)
|
r := getLocalDetectors(logger, c.primaryIPFamily, c.config, c.nodePodCIDRs)
|
||||||
if !reflect.DeepEqual(r, c.expected) {
|
if !reflect.DeepEqual(r, c.expected) {
|
||||||
t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r)
|
t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r)
|
||||||
}
|
}
|
||||||
|
@@ -107,7 +107,7 @@ func NewDualStackProxier(
|
|||||||
masqueradeAll bool,
|
masqueradeAll bool,
|
||||||
localhostNodePorts bool,
|
localhostNodePorts bool,
|
||||||
masqueradeBit int,
|
masqueradeBit int,
|
||||||
localDetectors [2]proxyutil.LocalTrafficDetector,
|
localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector,
|
||||||
hostname string,
|
hostname string,
|
||||||
nodeIPs map[v1.IPFamily]net.IP,
|
nodeIPs map[v1.IPFamily]net.IP,
|
||||||
recorder events.EventRecorder,
|
recorder events.EventRecorder,
|
||||||
@@ -117,15 +117,17 @@ func NewDualStackProxier(
|
|||||||
) (proxy.Provider, error) {
|
) (proxy.Provider, error) {
|
||||||
// Create an ipv4 instance of the single-stack proxier
|
// Create an ipv4 instance of the single-stack proxier
|
||||||
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], sysctl,
|
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], sysctl,
|
||||||
exec, syncPeriod, minSyncPeriod, masqueradeAll, localhostNodePorts, masqueradeBit, localDetectors[0], hostname,
|
exec, syncPeriod, minSyncPeriod, masqueradeAll, localhostNodePorts, masqueradeBit,
|
||||||
nodeIPs[v1.IPv4Protocol], recorder, healthzServer, nodePortAddresses, initOnly)
|
localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol],
|
||||||
|
recorder, healthzServer, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], sysctl,
|
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], sysctl,
|
||||||
exec, syncPeriod, minSyncPeriod, masqueradeAll, false, masqueradeBit, localDetectors[1], hostname,
|
exec, syncPeriod, minSyncPeriod, masqueradeAll, false, masqueradeBit,
|
||||||
nodeIPs[v1.IPv6Protocol], recorder, healthzServer, nodePortAddresses, initOnly)
|
localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol],
|
||||||
|
recorder, healthzServer, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
||||||
}
|
}
|
||||||
|
@@ -126,7 +126,7 @@ func NewDualStackProxier(
|
|||||||
udpTimeout time.Duration,
|
udpTimeout time.Duration,
|
||||||
masqueradeAll bool,
|
masqueradeAll bool,
|
||||||
masqueradeBit int,
|
masqueradeBit int,
|
||||||
localDetectors [2]proxyutil.LocalTrafficDetector,
|
localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector,
|
||||||
hostname string,
|
hostname string,
|
||||||
nodeIPs map[v1.IPFamily]net.IP,
|
nodeIPs map[v1.IPFamily]net.IP,
|
||||||
recorder events.EventRecorder,
|
recorder events.EventRecorder,
|
||||||
@@ -139,7 +139,7 @@ func NewDualStackProxier(
|
|||||||
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], ipvs, ipset, sysctl,
|
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], ipvs, ipset, sysctl,
|
||||||
exec, syncPeriod, minSyncPeriod, filterCIDRs(false, excludeCIDRs), strictARP,
|
exec, syncPeriod, minSyncPeriod, filterCIDRs(false, excludeCIDRs), strictARP,
|
||||||
tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit,
|
tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit,
|
||||||
localDetectors[0], hostname, nodeIPs[v1.IPv4Protocol], recorder,
|
localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol], recorder,
|
||||||
healthzServer, scheduler, nodePortAddresses, initOnly)
|
healthzServer, scheduler, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
||||||
@@ -148,7 +148,7 @@ func NewDualStackProxier(
|
|||||||
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], ipvs, ipset, sysctl,
|
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], ipvs, ipset, sysctl,
|
||||||
exec, syncPeriod, minSyncPeriod, filterCIDRs(true, excludeCIDRs), strictARP,
|
exec, syncPeriod, minSyncPeriod, filterCIDRs(true, excludeCIDRs), strictARP,
|
||||||
tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit,
|
tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit,
|
||||||
localDetectors[1], hostname, nodeIPs[v1.IPv6Protocol], recorder,
|
localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol], recorder,
|
||||||
healthzServer, scheduler, nodePortAddresses, initOnly)
|
healthzServer, scheduler, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
||||||
|
@@ -110,7 +110,7 @@ func NewDualStackProxier(
|
|||||||
minSyncPeriod time.Duration,
|
minSyncPeriod time.Duration,
|
||||||
masqueradeAll bool,
|
masqueradeAll bool,
|
||||||
masqueradeBit int,
|
masqueradeBit int,
|
||||||
localDetectors [2]proxyutil.LocalTrafficDetector,
|
localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector,
|
||||||
hostname string,
|
hostname string,
|
||||||
nodeIPs map[v1.IPFamily]net.IP,
|
nodeIPs map[v1.IPFamily]net.IP,
|
||||||
recorder events.EventRecorder,
|
recorder events.EventRecorder,
|
||||||
@@ -120,15 +120,17 @@ func NewDualStackProxier(
|
|||||||
) (proxy.Provider, error) {
|
) (proxy.Provider, error) {
|
||||||
// Create an ipv4 instance of the single-stack proxier
|
// Create an ipv4 instance of the single-stack proxier
|
||||||
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, sysctl,
|
ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, sysctl,
|
||||||
syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[0], hostname,
|
syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit,
|
||||||
nodeIPs[v1.IPv4Protocol], recorder, healthzServer, nodePortAddresses, initOnly)
|
localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol],
|
||||||
|
recorder, healthzServer, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, sysctl,
|
ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, sysctl,
|
||||||
syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[1], hostname,
|
syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit,
|
||||||
nodeIPs[v1.IPv6Protocol], recorder, healthzServer, nodePortAddresses, initOnly)
|
localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol],
|
||||||
|
recorder, healthzServer, nodePortAddresses, initOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user