mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
fix eps named ports does not work in sidecar(initContainer with restartPolicy=Always)
Signed-off-by: joey <zchengjoey@gmail.com>
This commit is contained in:
parent
582dcc2aca
commit
6bce72a794
@ -41,6 +41,17 @@ func FindPort(pod *v1.Pod, svcPort *v1.ServicePort) (int, error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// also support sidecar container (initContainer with restartPolicy=Always)
|
||||
for _, container := range pod.Spec.InitContainers {
|
||||
if container.RestartPolicy == nil || *container.RestartPolicy != v1.ContainerRestartPolicyAlways {
|
||||
continue
|
||||
}
|
||||
for _, port := range container.Ports {
|
||||
if port.Name == name && port.Protocol == svcPort.Protocol {
|
||||
return int(port.ContainerPort), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
case intstr.Int:
|
||||
return portName.IntValue(), nil
|
||||
}
|
||||
|
@ -32,12 +32,14 @@ import (
|
||||
)
|
||||
|
||||
func TestFindPort(t *testing.T) {
|
||||
restartAlways := v1.ContainerRestartPolicyAlways
|
||||
testCases := []struct {
|
||||
name string
|
||||
containers []v1.Container
|
||||
port intstr.IntOrString
|
||||
expected int
|
||||
pass bool
|
||||
name string
|
||||
containers []v1.Container
|
||||
initContainers []v1.Container
|
||||
port intstr.IntOrString
|
||||
expected int
|
||||
pass bool
|
||||
}{{
|
||||
name: "valid int, no ports",
|
||||
containers: []v1.Container{{}},
|
||||
@ -182,10 +184,69 @@ func TestFindPort(t *testing.T) {
|
||||
expected: 11,
|
||||
pass: true,
|
||||
},
|
||||
{
|
||||
name: "Sidecar initContainer named port",
|
||||
initContainers: []v1.Container{{
|
||||
RestartPolicy: &restartAlways,
|
||||
Ports: []v1.ContainerPort{{
|
||||
Name: "a",
|
||||
ContainerPort: 80,
|
||||
HostPort: -1,
|
||||
Protocol: "TCP",
|
||||
}},
|
||||
}},
|
||||
port: intstr.FromString("a"),
|
||||
expected: 80,
|
||||
pass: true,
|
||||
},
|
||||
{
|
||||
name: "Invalid(restartPolicy != Always) initContainer named port",
|
||||
initContainers: []v1.Container{{
|
||||
Ports: []v1.ContainerPort{{
|
||||
Name: "a",
|
||||
ContainerPort: 80,
|
||||
HostPort: -1,
|
||||
Protocol: "TCP",
|
||||
}},
|
||||
}},
|
||||
port: intstr.FromString("a"),
|
||||
expected: 0,
|
||||
pass: false,
|
||||
},
|
||||
{
|
||||
name: "App and sidecar containers have the same named port, first app container port will be used",
|
||||
initContainers: []v1.Container{{
|
||||
RestartPolicy: &restartAlways,
|
||||
Ports: []v1.ContainerPort{{
|
||||
Name: "a",
|
||||
ContainerPort: 80,
|
||||
HostPort: -1,
|
||||
Protocol: "TCP",
|
||||
}},
|
||||
}},
|
||||
containers: []v1.Container{{
|
||||
Ports: []v1.ContainerPort{{
|
||||
Name: "a",
|
||||
ContainerPort: 81,
|
||||
HostPort: -1,
|
||||
Protocol: "TCP",
|
||||
}},
|
||||
}, {
|
||||
Ports: []v1.ContainerPort{{
|
||||
Name: "a",
|
||||
ContainerPort: 82,
|
||||
HostPort: -1,
|
||||
Protocol: "TCP",
|
||||
}},
|
||||
}},
|
||||
port: intstr.FromString("a"),
|
||||
expected: 81,
|
||||
pass: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
port, err := FindPort(&v1.Pod{Spec: v1.PodSpec{Containers: tc.containers}},
|
||||
port, err := FindPort(&v1.Pod{Spec: v1.PodSpec{Containers: tc.containers, InitContainers: tc.initContainers}},
|
||||
&v1.ServicePort{Protocol: "TCP", TargetPort: tc.port})
|
||||
if err != nil && tc.pass {
|
||||
t.Errorf("unexpected error for %s: %v", tc.name, err)
|
||||
|
Loading…
Reference in New Issue
Block a user