Skip to content

Commit e0e38b2

Browse files
committed
Fix LB service e2e test
The test "Load Balancer Service Tests with MetalLB Should ensure connectivity works on an external service when mtu changes in intermediate node" relied on forwarding traffic through localhost into the cluster docker kind network. I was able to reproduce it locally and looking into filter rules, that traffic is dropped and requires an additional rule to allow it. I do not know what change triggered the failure. It looks like it might have been a docker update in the github runner image [1]. [1] actions/runner-images@ce61c11 Signed-off-by: Jaime Caamaño Ruiz <jcaamano@redhat.com> (cherry picked from commit 1df91ec)
1 parent db70722 commit e0e38b2

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

test/e2e/service.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,15 +1600,15 @@ metadata:
16001600
if !utilnet.IsIPv6String(svcLoadBalancerIP) {
16011601
ginkgo.By("Setting up external IPv4 client with an intermediate node")
16021602
defer func() {
1603-
cleanupIPv4NetworkForExternalClient(svcLoadBalancerIP)
1603+
cleanupIPv4NetworkForExternalClient(svcLoadBalancerIP, endpointHTTPPort)
16041604
}()
1605-
setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP)
1605+
setupIPv4NetworkForExternalClient(svcLoadBalancerIP, endpointHTTPPort, nodeIP)
16061606
} else {
16071607
ginkgo.By("Setting up external IPv6 client with an intermediate node")
16081608
defer func() {
1609-
cleanupIPv6NetworkForExternalClient(svcLoadBalancerIP)
1609+
cleanupIPv6NetworkForExternalClient(svcLoadBalancerIP, endpointHTTPPort)
16101610
}()
1611-
setupIPv6NetworkForExternalClient(svcLoadBalancerIP, nodeIP)
1611+
setupIPv6NetworkForExternalClient(svcLoadBalancerIP, endpointHTTPPort, nodeIP)
16121612
svcIPforCurl = fmt.Sprintf("[%s]", svcLoadBalancerIP)
16131613
}
16141614

@@ -2192,7 +2192,7 @@ func getServiceLoadBalancerIP(c clientset.Interface, namespace, serviceName stri
21922192
return svc.Status.LoadBalancer.Ingress[0].IP, nil
21932193
}
21942194

2195-
func setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
2195+
func setupIPv4NetworkForExternalClient(svcLoadBalancerIP string, svcLoadBalancerPort int, nodeIP string) {
21962196
// The external client configuration done in install_metallb can not be used because routes for external client
21972197
// installed in K8s node https://github.com/ovn-org/ovn-kubernetes/blob/master/contrib/kind.sh#L1045-L1047
21982198
// are ignored in shared gateway mode and traffic coming back from pod is put on the docker bridge directly by
@@ -2215,6 +2215,7 @@ func setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
22152215
// | 172.18.0.1 |
22162216
// | ip route add 192.168.223.0/24 via 192.168.222.2
22172217
// | ip route add <svc-ip> via|<endpoint-node-ip>
2218+
// | iptables -t filter -I FORWARD -d <svc-ip> -p tcp -m tcp --dport <svc-port> -j ACCEPT
22182219
// | |
22192220
// | vm 192.168.222.1 |
22202221
// +----------------------------------------+-------------------------------------+
@@ -2245,17 +2246,21 @@ func setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
22452246
err = buildAndRunCommand("sudo ip route add 192.168.223.0/24 via 192.168.222.2")
22462247
framework.ExpectNoError(err, "failed to add route for client to handle reverse service traffic")
22472248

2249+
err = buildAndRunCommand(fmt.Sprintf("sudo iptables -t filter -I FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT", svcLoadBalancerIP, svcLoadBalancerPort))
2250+
framework.ExpectNoError(err, "failed to add iptables rule for service")
2251+
22482252
err = buildAndRunCommand(fmt.Sprintf("sudo ip route add %s via %s", svcLoadBalancerIP, nodeIP))
22492253
framework.ExpectNoError(err, "failed to add route for external load balancer service")
22502254
}
22512255

2252-
func cleanupIPv4NetworkForExternalClient(svcLoadBalancerIP string) {
2256+
func cleanupIPv4NetworkForExternalClient(svcLoadBalancerIP string, svcLoadBalancerPort int) {
22532257
cleanupNetNamespace()
22542258
buildAndRunCommand("sudo ip route delete 192.168.223.0/24 via 192.168.222.2")
22552259
buildAndRunCommand(fmt.Sprintf("sudo ip route delete %s", svcLoadBalancerIP))
2260+
buildAndRunCommand(fmt.Sprintf("sudo iptables -t filter -D FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT", svcLoadBalancerIP, svcLoadBalancerPort))
22562261
}
22572262

2258-
func setupIPv6NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
2263+
func setupIPv6NetworkForExternalClient(svcLoadBalancerIP string, svcLoadBalancerPort int, nodeIP string) {
22592264
// The external client configuration done in install_metallb can not be used because routes for external client
22602265
// installed in K8s node https://github.com/ovn-org/ovn-kubernetes/blob/master/contrib/kind.sh#L1045-L1047
22612266
// are ignored in shared gateway mode and traffic coming back from pod is put on the docker bridge directly by
@@ -2306,12 +2311,16 @@ func setupIPv6NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
23062311

23072312
err = buildAndRunCommand(fmt.Sprintf("sudo ip -6 route add %s via %s", svcLoadBalancerIP, nodeIP))
23082313
framework.ExpectNoError(err, "failed to add route for external load balancer service")
2314+
2315+
err = buildAndRunCommand(fmt.Sprintf("sudo ip6tables -t filter -I FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT", svcLoadBalancerIP, svcLoadBalancerPort))
2316+
framework.ExpectNoError(err, "failed to add iptables rule for service")
23092317
}
23102318

2311-
func cleanupIPv6NetworkForExternalClient(svcLoadBalancerIP string) {
2319+
func cleanupIPv6NetworkForExternalClient(svcLoadBalancerIP string, svcLoadBalancerPort int) {
23122320
cleanupNetNamespace()
23132321
buildAndRunCommand("sudo ip -6 route delete fc00:f853:ccd:e223::2")
23142322
buildAndRunCommand(fmt.Sprintf("sudo ip -6 route delete %s", svcLoadBalancerIP))
2323+
buildAndRunCommand(fmt.Sprintf("sudo ip6tables -t filter -D FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT", svcLoadBalancerIP, svcLoadBalancerPort))
23152324
}
23162325

23172326
func setupNetNamespaceAndLinks() {

0 commit comments

Comments
 (0)