refactor: handle internal IPv6 addresses on nodeport services consistently with --expose-internal-ipv6 flag (#5652)

This commit is contained in:
Jonas Badstübner 2025-07-18 19:16:32 +02:00 committed by GitHub
parent 48760e653b
commit 30cbbc0e75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 80 additions and 19 deletions

View File

@ -742,13 +742,19 @@ func (sc *serviceSource) extractNodePortTargets(svc *v1.Service) (endpoint.Targe
access := getAccessFromAnnotations(svc.Annotations)
switch access {
case "public":
return append(externalIPs, ipv6IPs...), nil
if sc.exposeInternalIPv6 {
return append(externalIPs, ipv6IPs...), nil
}
return externalIPs, nil
case "private":
return internalIPs, nil
}
if len(externalIPs) > 0 {
return append(externalIPs, ipv6IPs...), nil
if sc.exposeInternalIPv6 {
return append(externalIPs, ipv6IPs...), nil
}
return externalIPs, nil
}
return internalIPs, nil

View File

@ -1735,7 +1735,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.example.org", Targets: endpoint.Targets{"0 50 30192 foo.example.org"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"54.10.11.1", "54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::2"}, RecordType: endpoint.RecordTypeAAAA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::3"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
@ -1745,7 +1745,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -1756,7 +1757,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
@ -1779,7 +1781,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -1790,7 +1793,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
@ -1806,7 +1810,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.bar.example.com", Targets: endpoint.Targets{"0 50 30192 foo.bar.example.com"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.bar.example.com", Targets: endpoint.Targets{"54.10.11.1", "54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.bar.example.com", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::2"}, RecordType: endpoint.RecordTypeAAAA},
{DNSName: "foo.bar.example.com", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::3"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
@ -1816,7 +1820,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -1827,7 +1832,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
@ -1880,7 +1886,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.example.org", Targets: endpoint.Targets{"0 50 30192 foo.example.org"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::2"}, RecordType: endpoint.RecordTypeAAAA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::3"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
@ -1890,7 +1896,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -1901,7 +1908,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
@ -1924,7 +1932,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.example.org", Targets: endpoint.Targets{"0 50 30192 foo.example.org"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::2"}, RecordType: endpoint.RecordTypeAAAA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::3"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
@ -1934,7 +1942,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -1945,7 +1954,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
@ -2098,7 +2108,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
}},
},
{
title: "access=public annotation NodePort services return an endpoint with public IP addresses of the cluster's nodes",
title: "access=public annotation NodePort services return an endpoint with external IP addresses of the cluster's nodes if exposeInternalIPv6 is unset",
svcNamespace: "testing",
svcName: "foo",
svcType: v1.ServiceTypeNodePort,
@ -2111,7 +2121,7 @@ func TestServiceSourceNodePortServices(t *testing.T) {
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.example.org", Targets: endpoint.Targets{"0 50 30192 foo.example.org"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"54.10.11.1", "54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::2"}, RecordType: endpoint.RecordTypeAAAA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::3"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
@ -2121,7 +2131,8 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
@ -2132,9 +2143,53 @@ func TestServiceSourceNodePortServices(t *testing.T) {
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
},
{
title: "access=public annotation NodePort services return an endpoint with public IP addresses of the cluster's nodes if exposeInternalIPv6 is set to true",
svcNamespace: "testing",
svcName: "foo",
svcType: v1.ServiceTypeNodePort,
svcTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster,
labels: map[string]string{},
annotations: map[string]string{
hostnameAnnotationKey: "foo.example.org.",
accessAnnotationKey: "public",
},
exposeInternalIPv6: true,
expected: []*endpoint.Endpoint{
{DNSName: "_foo._tcp.foo.example.org", Targets: endpoint.Targets{"0 50 30192 foo.example.org"}, RecordType: endpoint.RecordTypeSRV},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"54.10.11.1", "54.10.11.2"}, RecordType: endpoint.RecordTypeA},
{DNSName: "foo.example.org", Targets: endpoint.Targets{"2001:DB8::1", "2001:DB8::2", "2001:DB8::3", "2001:DB8::4"}, RecordType: endpoint.RecordTypeAAAA},
},
nodes: []*v1.Node{{
ObjectMeta: metav1.ObjectMeta{
Name: "node1",
},
Status: v1.NodeStatus{
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.1"},
{Type: v1.NodeInternalIP, Address: "10.0.1.1"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::1"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::2"},
},
},
}, {
ObjectMeta: metav1.ObjectMeta{
Name: "node2",
},
Status: v1.NodeStatus{
Addresses: []v1.NodeAddress{
{Type: v1.NodeExternalIP, Address: "54.10.11.2"},
{Type: v1.NodeInternalIP, Address: "10.0.1.2"},
{Type: v1.NodeExternalIP, Address: "2001:DB8::3"},
{Type: v1.NodeInternalIP, Address: "2001:DB8::4"},
},
},
}},
},
{