mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Updating EndpointSlice controllers to support NodeName field
This commit is contained in:
parent
e9573eef4c
commit
d985438772
@ -917,7 +917,7 @@ func TestReconcileEndpointSlicesReplaceDeprecated(t *testing.T) {
|
|||||||
namespace := "test"
|
namespace := "test"
|
||||||
|
|
||||||
svc, endpointMeta := newServiceAndEndpointMeta("foo", namespace)
|
svc, endpointMeta := newServiceAndEndpointMeta("foo", namespace)
|
||||||
endpointMeta.AddressType = discovery.AddressTypeIP
|
endpointMeta.AddressType = discovery.AddressType("IP")
|
||||||
|
|
||||||
existingSlices := []*discovery.EndpointSlice{}
|
existingSlices := []*discovery.EndpointSlice{}
|
||||||
pods := []*corev1.Pod{}
|
pods := []*corev1.Pod{}
|
||||||
|
@ -87,6 +87,10 @@ func podToEndpoint(pod *corev1.Pod, node *corev1.Node, service *corev1.Service,
|
|||||||
ep.Conditions.Terminating = &terminating
|
ep.Conditions.Terminating = &terminating
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pod.Spec.NodeName != "" && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) {
|
||||||
|
ep.NodeName = &pod.Spec.NodeName
|
||||||
|
}
|
||||||
|
|
||||||
if endpointutil.ShouldSetHostname(pod, service) {
|
if endpointutil.ShouldSetHostname(pod, service) {
|
||||||
ep.Hostname = &pod.Spec.Hostname
|
ep.Hostname = &pod.Spec.Hostname
|
||||||
}
|
}
|
||||||
|
@ -252,6 +252,7 @@ func TestPodToEndpoint(t *testing.T) {
|
|||||||
expectedEndpoint discovery.Endpoint
|
expectedEndpoint discovery.Endpoint
|
||||||
publishNotReadyAddresses bool
|
publishNotReadyAddresses bool
|
||||||
terminatingGateEnabled bool
|
terminatingGateEnabled bool
|
||||||
|
nodeNameGateEnabled bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Ready pod",
|
name: "Ready pod",
|
||||||
@ -321,6 +322,25 @@ func TestPodToEndpoint(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Ready pod + node name gate enabled",
|
||||||
|
pod: readyPod,
|
||||||
|
svc: &svc,
|
||||||
|
nodeNameGateEnabled: true,
|
||||||
|
expectedEndpoint: discovery.Endpoint{
|
||||||
|
Addresses: []string{"1.2.3.5"},
|
||||||
|
Conditions: discovery.EndpointConditions{Ready: utilpointer.BoolPtr(true)},
|
||||||
|
Topology: map[string]string{"kubernetes.io/hostname": "node-1"},
|
||||||
|
NodeName: utilpointer.StringPtr("node-1"),
|
||||||
|
TargetRef: &v1.ObjectReference{
|
||||||
|
Kind: "Pod",
|
||||||
|
Namespace: ns,
|
||||||
|
Name: readyPod.Name,
|
||||||
|
UID: readyPod.UID,
|
||||||
|
ResourceVersion: readyPod.ResourceVersion,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Ready pod + node labels",
|
name: "Ready pod + node labels",
|
||||||
pod: readyPod,
|
pod: readyPod,
|
||||||
@ -499,6 +519,7 @@ func TestPodToEndpoint(t *testing.T) {
|
|||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
t.Run(testCase.name, func(t *testing.T) {
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EndpointSliceTerminatingCondition, testCase.terminatingGateEnabled)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EndpointSliceTerminatingCondition, testCase.terminatingGateEnabled)()
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EndpointSliceNodeName, testCase.nodeNameGateEnabled)()
|
||||||
|
|
||||||
endpoint := podToEndpoint(testCase.pod, testCase.node, testCase.svc, discovery.AddressTypeIPv4)
|
endpoint := podToEndpoint(testCase.pod, testCase.node, testCase.svc, discovery.AddressTypeIPv4)
|
||||||
if !reflect.DeepEqual(testCase.expectedEndpoint, endpoint) {
|
if !reflect.DeepEqual(testCase.expectedEndpoint, endpoint) {
|
||||||
|
@ -18,6 +18,7 @@ go_library(
|
|||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/controller/endpointslicemirroring/metrics:go_default_library",
|
"//pkg/controller/endpointslicemirroring/metrics:go_default_library",
|
||||||
"//pkg/controller/util/endpoint:go_default_library",
|
"//pkg/controller/util/endpoint:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
@ -28,6 +29,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers/discovery/v1beta1:go_default_library",
|
"//staging/src/k8s.io/client-go/informers/discovery/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
@ -58,6 +60,7 @@ go_test(
|
|||||||
deps = [
|
deps = [
|
||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/controller/endpointslicemirroring/metrics:go_default_library",
|
"//pkg/controller/endpointslicemirroring/metrics:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
@ -66,6 +69,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
||||||
@ -73,6 +77,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
|
||||||
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
|
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/k8s.io/utils/pointer:go_default_library",
|
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||||
|
@ -27,10 +27,12 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/tools/leaderelection/resourcelock"
|
"k8s.io/client-go/tools/leaderelection/resourcelock"
|
||||||
"k8s.io/kubernetes/pkg/apis/discovery/validation"
|
"k8s.io/kubernetes/pkg/apis/discovery/validation"
|
||||||
endpointutil "k8s.io/kubernetes/pkg/controller/util/endpoint"
|
endpointutil "k8s.io/kubernetes/pkg/controller/util/endpoint"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
// addrTypePortMapKey is used to uniquely identify groups of endpoint ports and
|
// addrTypePortMapKey is used to uniquely identify groups of endpoint ports and
|
||||||
@ -138,6 +140,9 @@ func addressToEndpoint(address corev1.EndpointAddress, ready bool) *discovery.En
|
|||||||
endpoint.Topology = map[string]string{
|
endpoint.Topology = map[string]string{
|
||||||
"kubernetes.io/hostname": *address.NodeName,
|
"kubernetes.io/hostname": *address.NodeName,
|
||||||
}
|
}
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) {
|
||||||
|
endpoint.NodeName = address.NodeName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if address.Hostname != "" {
|
if address.Hostname != "" {
|
||||||
endpoint.Hostname = &address.Hostname
|
endpoint.Hostname = &address.Hostname
|
||||||
|
@ -27,8 +27,12 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/rand"
|
"k8s.io/apimachinery/pkg/util/rand"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
k8stesting "k8s.io/client-go/testing"
|
k8stesting "k8s.io/client-go/testing"
|
||||||
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
utilpointer "k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewEndpointSlice(t *testing.T) {
|
func TestNewEndpointSlice(t *testing.T) {
|
||||||
@ -76,6 +80,86 @@ func TestNewEndpointSlice(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddressToEndpoint(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
epAddress v1.EndpointAddress
|
||||||
|
expectedEndpoint discovery.Endpoint
|
||||||
|
ready bool
|
||||||
|
nodeNameGateEnabled bool
|
||||||
|
}{{
|
||||||
|
name: "simple + gate enabled",
|
||||||
|
epAddress: v1.EndpointAddress{
|
||||||
|
IP: "10.1.2.3",
|
||||||
|
Hostname: "foo",
|
||||||
|
NodeName: utilpointer.StringPtr("node-abc"),
|
||||||
|
TargetRef: &v1.ObjectReference{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "Pod",
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ready: true,
|
||||||
|
nodeNameGateEnabled: true,
|
||||||
|
expectedEndpoint: discovery.Endpoint{
|
||||||
|
Addresses: []string{"10.1.2.3"},
|
||||||
|
Hostname: utilpointer.StringPtr("foo"),
|
||||||
|
Conditions: discovery.EndpointConditions{
|
||||||
|
Ready: utilpointer.BoolPtr(true),
|
||||||
|
},
|
||||||
|
Topology: map[string]string{
|
||||||
|
"kubernetes.io/hostname": "node-abc",
|
||||||
|
},
|
||||||
|
TargetRef: &v1.ObjectReference{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "Pod",
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "foo",
|
||||||
|
},
|
||||||
|
NodeName: utilpointer.StringPtr("node-abc"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
name: "simple + gate disabled",
|
||||||
|
epAddress: v1.EndpointAddress{
|
||||||
|
IP: "10.1.2.3",
|
||||||
|
Hostname: "foo",
|
||||||
|
NodeName: utilpointer.StringPtr("node-abc"),
|
||||||
|
TargetRef: &v1.ObjectReference{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "Pod",
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ready: true,
|
||||||
|
nodeNameGateEnabled: false,
|
||||||
|
expectedEndpoint: discovery.Endpoint{
|
||||||
|
Addresses: []string{"10.1.2.3"},
|
||||||
|
Hostname: utilpointer.StringPtr("foo"),
|
||||||
|
Conditions: discovery.EndpointConditions{
|
||||||
|
Ready: utilpointer.BoolPtr(true),
|
||||||
|
},
|
||||||
|
Topology: map[string]string{
|
||||||
|
"kubernetes.io/hostname": "node-abc",
|
||||||
|
},
|
||||||
|
TargetRef: &v1.ObjectReference{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "Pod",
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EndpointSliceNodeName, tc.nodeNameGateEnabled)()
|
||||||
|
|
||||||
|
ep := addressToEndpoint(tc.epAddress, tc.ready)
|
||||||
|
assert.EqualValues(t, tc.expectedEndpoint, *ep)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Test helpers
|
// Test helpers
|
||||||
|
|
||||||
func newClientset() *fake.Clientset {
|
func newClientset() *fake.Clientset {
|
||||||
|
Loading…
Reference in New Issue
Block a user