mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 09:49:50 +00:00
Merge pull request #120068 from aojea/ipmode_test
follow up on " Merged Make Kubernetes aware of the LoadBalancer behaviour"
This commit is contained in:
commit
aa8cb97f65
@ -213,7 +213,19 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic
|
|||||||
if ing.IP == "" {
|
if ing.IP == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ipFamily := proxyutil.GetIPFamilyFromIP(ing.IP); ipFamily == sct.ipFamily && proxyutil.IsVIPMode(ing) {
|
|
||||||
|
// proxy mode load balancers do not need to track the IPs in the service cache
|
||||||
|
// and they can also implement IP family translation, so no need to check if
|
||||||
|
// the status ingress.IP and the ClusterIP belong to the same family.
|
||||||
|
if !proxyutil.IsVIPMode(ing) {
|
||||||
|
klog.V(4).InfoS("Service change tracker ignored the following load balancer ingress IP for given Service as it using Proxy mode",
|
||||||
|
"ipFamily", sct.ipFamily, "loadBalancerIngressIP", ing.IP, "service", klog.KObj(service))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// kube-proxy does not implement IP family translation, skip addresses with
|
||||||
|
// different IP family
|
||||||
|
if ipFamily := proxyutil.GetIPFamilyFromIP(ing.IP); ipFamily == sct.ipFamily {
|
||||||
info.loadBalancerVIPs = append(info.loadBalancerVIPs, ing.IP)
|
info.loadBalancerVIPs = append(info.loadBalancerVIPs, ing.IP)
|
||||||
} else {
|
} else {
|
||||||
invalidIPs = append(invalidIPs, ing.IP)
|
invalidIPs = append(invalidIPs, ing.IP)
|
||||||
|
@ -27,6 +27,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/dump"
|
"k8s.io/apimachinery/pkg/util/dump"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
netutils "k8s.io/utils/net"
|
netutils "k8s.io/utils/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -91,12 +94,15 @@ func TestServiceToServiceMap(t *testing.T) {
|
|||||||
testClusterIPv6 := "2001:db8:85a3:0:0:8a2e:370:7334"
|
testClusterIPv6 := "2001:db8:85a3:0:0:8a2e:370:7334"
|
||||||
testExternalIPv6 := "2001:db8:85a3:0:0:8a2e:370:7335"
|
testExternalIPv6 := "2001:db8:85a3:0:0:8a2e:370:7335"
|
||||||
testSourceRangeIPv6 := "2001:db8::/32"
|
testSourceRangeIPv6 := "2001:db8::/32"
|
||||||
|
ipModeVIP := v1.LoadBalancerIPModeVIP
|
||||||
|
ipModeProxy := v1.LoadBalancerIPModeProxy
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
service *v1.Service
|
service *v1.Service
|
||||||
expected map[ServicePortName]*BaseServicePortInfo
|
expected map[ServicePortName]*BaseServicePortInfo
|
||||||
ipFamily v1.IPFamily
|
ipFamily v1.IPFamily
|
||||||
|
ipModeEnabled bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
desc: "nothing",
|
desc: "nothing",
|
||||||
@ -188,6 +194,90 @@ func TestServiceToServiceMap(t *testing.T) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "load balancer service ipMode VIP feature gate disable",
|
||||||
|
ipFamily: v1.IPv4Protocol,
|
||||||
|
|
||||||
|
service: makeTestService("ns1", "load-balancer", func(svc *v1.Service) {
|
||||||
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
|
svc.Spec.ClusterIP = "172.16.55.11"
|
||||||
|
svc.Spec.LoadBalancerIP = "5.6.7.8"
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port3", "UDP", 8675, 30061, 7000)
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port4", "UDP", 8676, 30062, 7001)
|
||||||
|
svc.Status.LoadBalancer.Ingress = []v1.LoadBalancerIngress{{IP: "10.1.2.4", IPMode: &ipModeVIP}}
|
||||||
|
}),
|
||||||
|
expected: map[ServicePortName]*BaseServicePortInfo{
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port3", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8675, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port4", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8676, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "load balancer service ipMode Proxy feature gate disable",
|
||||||
|
ipFamily: v1.IPv4Protocol,
|
||||||
|
|
||||||
|
service: makeTestService("ns1", "load-balancer", func(svc *v1.Service) {
|
||||||
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
|
svc.Spec.ClusterIP = "172.16.55.11"
|
||||||
|
svc.Spec.LoadBalancerIP = "5.6.7.8"
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port3", "UDP", 8675, 30061, 7000)
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port4", "UDP", 8676, 30062, 7001)
|
||||||
|
svc.Status.LoadBalancer.Ingress = []v1.LoadBalancerIngress{{IP: "10.1.2.4", IPMode: &ipModeProxy}}
|
||||||
|
}),
|
||||||
|
expected: map[ServicePortName]*BaseServicePortInfo{
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port3", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8675, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port4", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8676, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "load balancer service ipMode VIP feature gate enabled",
|
||||||
|
ipFamily: v1.IPv4Protocol,
|
||||||
|
ipModeEnabled: true,
|
||||||
|
|
||||||
|
service: makeTestService("ns1", "load-balancer", func(svc *v1.Service) {
|
||||||
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
|
svc.Spec.ClusterIP = "172.16.55.11"
|
||||||
|
svc.Spec.LoadBalancerIP = "5.6.7.8"
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port3", "UDP", 8675, 30061, 7000)
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port4", "UDP", 8676, 30062, 7001)
|
||||||
|
svc.Status.LoadBalancer.Ingress = []v1.LoadBalancerIngress{{IP: "10.1.2.4", IPMode: &ipModeVIP}}
|
||||||
|
}),
|
||||||
|
expected: map[ServicePortName]*BaseServicePortInfo{
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port3", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8675, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port4", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8676, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
bsvcPortInfo.loadBalancerVIPs = []string{"10.1.2.4"}
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "load balancer service ipMode Proxy feature gate enabled",
|
||||||
|
ipFamily: v1.IPv4Protocol,
|
||||||
|
ipModeEnabled: true,
|
||||||
|
|
||||||
|
service: makeTestService("ns1", "load-balancer", func(svc *v1.Service) {
|
||||||
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
|
svc.Spec.ClusterIP = "172.16.55.11"
|
||||||
|
svc.Spec.LoadBalancerIP = "5.6.7.8"
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port3", "UDP", 8675, 30061, 7000)
|
||||||
|
svc.Spec.Ports = addTestPort(svc.Spec.Ports, "port4", "UDP", 8676, 30062, 7001)
|
||||||
|
svc.Status.LoadBalancer.Ingress = []v1.LoadBalancerIngress{{IP: "10.1.2.4", IPMode: &ipModeProxy}}
|
||||||
|
}),
|
||||||
|
expected: map[ServicePortName]*BaseServicePortInfo{
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port3", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8675, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
}),
|
||||||
|
makeServicePortName("ns1", "load-balancer", "port4", v1.ProtocolUDP): makeTestServiceInfo("172.16.55.11", 8676, "UDP", 0, func(bsvcPortInfo *BaseServicePortInfo) {
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
desc: "load balancer service with only local traffic policy",
|
desc: "load balancer service with only local traffic policy",
|
||||||
ipFamily: v1.IPv4Protocol,
|
ipFamily: v1.IPv4Protocol,
|
||||||
@ -464,6 +554,7 @@ func TestServiceToServiceMap(t *testing.T) {
|
|||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.desc, func(t *testing.T) {
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.LoadBalancerIPMode, tc.ipModeEnabled)()
|
||||||
svcTracker := NewServiceChangeTracker(nil, tc.ipFamily, nil, nil)
|
svcTracker := NewServiceChangeTracker(nil, tc.ipFamily, nil, nil)
|
||||||
// outputs
|
// outputs
|
||||||
newServices := svcTracker.serviceToServiceMap(tc.service)
|
newServices := svcTracker.serviceToServiceMap(tc.service)
|
||||||
|
Loading…
Reference in New Issue
Block a user