test/e2e/network: fix a bug in the hostport e2e test

The hostport e2e test (sonobuoy run --e2e-focus 'validates that there is no
conflict between pods with same hostPort but different hostIP and protocol')
checks, in particular, that two pods with the same hostPort, the same hostIP,
but different L4 protocols can coexist on one node.

In order to do this, the test creates two pods with the same hostIP:hostPort,
one TCP-based, another UDP-based. However, both pods listen on both protocols:

    netexec --http-port=8080 --udp-port=8080

This can happen that a CNI which doesn't distinguish between TCP and UDP
hostPorts forwards all traffic, TCP or UDP, to the same pod. As this pod
listens on both protocols it will reply to both requests, and the test
will think that everything works properly while the second pod is indeed
disconnected. Fix this by executing different commands in different pods:

    TCP: netexec --http-port=8080 --udp-port=-1
    UDP: netexec --http-port=8008 --udp-port=8080

The TCP pod now doesn't listen on UDP, and the UDP pod doesn't listen on TCP on
the target hostPort. The UDP pod still needs to listen on TCP on another port
so that a pod readiness check can be made.
This commit is contained in:
Anton Protopopov 2022-06-17 12:46:50 +00:00 committed by Anton Protopopov
parent 4e17f88b7e
commit 8c76845b03

View File

@ -157,6 +157,18 @@ var _ = common.SIGDescribe("HostPort", func() {
// create pod which using hostport on the specified node according to the nodeSelector
// it starts an http server on the exposed port
func createHostPortPodOnNode(f *framework.Framework, podName, ns, hostIP string, port int32, protocol v1.Protocol, nodeName string) {
var netexecArgs []string
var readinessProbePort int32
if protocol == v1.ProtocolTCP {
readinessProbePort = 8080
netexecArgs = []string{"--http-port=8080", "--udp-port=-1"}
} else {
readinessProbePort = 8008
netexecArgs = []string{"--http-port=8008", "--udp-port=8080"}
}
hostPortPod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
@ -166,7 +178,7 @@ func createHostPortPodOnNode(f *framework.Framework, podName, ns, hostIP string,
{
Name: "agnhost",
Image: imageutils.GetE2EImage(imageutils.Agnhost),
Args: []string{"netexec", "--http-port=8080", "--udp-port=8080"},
Args: append([]string{"netexec"}, netexecArgs...),
Ports: []v1.ContainerPort{
{
HostPort: port,
@ -180,7 +192,7 @@ func createHostPortPodOnNode(f *framework.Framework, podName, ns, hostIP string,
HTTPGet: &v1.HTTPGetAction{
Path: "/hostname",
Port: intstr.IntOrString{
IntVal: int32(8080),
IntVal: readinessProbePort,
},
Scheme: v1.URISchemeHTTP,
},