Promote the ServiceInternalTrafficPolicy field to Beta and on by default (#103462)

* pkg/features: promote the ServiceInternalTrafficPolicy field to Beta and on by default

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/api/service/testing: update Service test fixture functions to set internalTrafficPolicy=Cluster by default

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/apis/core/validation: add more Service validation tests for internalTrafficPolicy

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/registry/core/service/storage: fix failing Service REST storage tests to use internalTrafficPolicy: Cluster

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/registry/core/service/storage: add two test cases for Service REST TestServiceRegistryInternalTrafficPolicyClusterThenLocal and TestServiceRegistryInternalTrafficPolicyLocalThenCluster

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/registry/core/service: update strategy unit tests to expect default
internalTrafficPolicy=Cluster

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/proxy/ipvs: fix unit test Test_EndpointSliceReadyAndTerminatingLocal to use internalTrafficPolicy=Cluster

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/apis/core: update fuzzers to set Service internalTrafficPolicy field

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>

* pkg/api/service/testing: refactor Service test fixtures to use Tweak funcs

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>
This commit is contained in:
Andrew Sy Kim 2021-07-06 09:16:30 -04:00 committed by GitHub
parent 6d11f22fde
commit 28f3f36505
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 139 additions and 15 deletions

View File

@ -48,6 +48,8 @@ func MakeService(name string, tweaks ...Tweak) *api.Service {
SetTypeClusterIP(svc)
// Default to 1 port
SetPorts(MakeServicePort("", 93, intstr.FromInt(76), api.ProtocolTCP))(svc)
// Default internalTrafficPolicy to "Cluster"
SetInternalTrafficPolicy(api.ServiceInternalTrafficPolicyCluster)(svc)
for _, tweak := range tweaks {
tweak(svc)
@ -151,3 +153,10 @@ func SetNodePorts(values ...int) Tweak {
}
}
}
// SetInternalTrafficPolicy sets the internalTrafficPolicy field for a Service.
func SetInternalTrafficPolicy(policy api.ServiceInternalTrafficPolicyType) Tweak {
return func(svc *api.Service) {
svc.Spec.InternalTrafficPolicy = &policy
}
}

View File

@ -297,6 +297,10 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} {
types := []core.ServiceExternalTrafficPolicyType{core.ServiceExternalTrafficPolicyTypeCluster, core.ServiceExternalTrafficPolicyTypeLocal}
*p = types[c.Rand.Intn(len(types))]
},
func(p *core.ServiceInternalTrafficPolicyType, c fuzz.Continue) {
types := []core.ServiceInternalTrafficPolicyType{core.ServiceInternalTrafficPolicyCluster, core.ServiceInternalTrafficPolicyLocal}
*p = types[c.Rand.Intn(len(types))]
},
func(ct *core.Container, c fuzz.Continue) {
c.FuzzNoCustom(ct) // fuzz self without calling this function again
ct.TerminationMessagePath = "/" + ct.TerminationMessagePath // Must be non-empty

View File

@ -10333,6 +10333,7 @@ func TestValidatePodStatusUpdate(t *testing.T) {
}
func makeValidService() core.Service {
clusterInternalTrafficPolicy := core.ServiceInternalTrafficPolicyCluster
return core.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "valid",
@ -10342,10 +10343,11 @@ func makeValidService() core.Service {
ResourceVersion: "1",
},
Spec: core.ServiceSpec{
Selector: map[string]string{"key": "val"},
SessionAffinity: "None",
Type: core.ServiceTypeClusterIP,
Ports: []core.ServicePort{{Name: "p", Protocol: "TCP", Port: 8675, TargetPort: intstr.FromInt(8675)}},
Selector: map[string]string{"key": "val"},
SessionAffinity: "None",
Type: core.ServiceTypeClusterIP,
Ports: []core.ServicePort{{Name: "p", Protocol: "TCP", Port: 8675, TargetPort: intstr.FromInt(8675)}},
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
},
}
}
@ -11286,6 +11288,22 @@ func TestValidateServiceCreate(t *testing.T) {
},
numErrs: 1,
},
{
name: "internalTrafficPolicy field set to Cluster",
tweakSvc: func(s *core.Service) {
cluster := core.ServiceInternalTrafficPolicyCluster
s.Spec.InternalTrafficPolicy = &cluster
},
numErrs: 0,
},
{
name: "internalTrafficPolicy field set to Local",
tweakSvc: func(s *core.Service) {
local := core.ServiceInternalTrafficPolicyLocal
s.Spec.InternalTrafficPolicy = &local
},
numErrs: 0,
},
{
name: "nagative healthCheckNodePort field",
tweakSvc: func(s *core.Service) {
@ -14370,6 +14388,28 @@ func TestValidateServiceUpdate(t *testing.T) {
},
numErrs: 2,
},
{
name: "update internalTrafficPolicy from Cluster to Local",
tweakSvc: func(oldSvc, newSvc *core.Service) {
cluster := core.ServiceInternalTrafficPolicyCluster
oldSvc.Spec.InternalTrafficPolicy = &cluster
local := core.ServiceInternalTrafficPolicyLocal
newSvc.Spec.InternalTrafficPolicy = &local
},
numErrs: 0,
},
{
name: "update internalTrafficPolicy from Local to Cluster",
tweakSvc: func(oldSvc, newSvc *core.Service) {
local := core.ServiceInternalTrafficPolicyLocal
oldSvc.Spec.InternalTrafficPolicy = &local
cluster := core.ServiceInternalTrafficPolicyCluster
newSvc.Spec.InternalTrafficPolicy = &cluster
},
numErrs: 0,
},
}
for _, tc := range testCases {

View File

@ -846,7 +846,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
ServiceLoadBalancerClass: {Default: true, PreRelease: featuregate.Beta},
LogarithmicScaleDown: {Default: false, PreRelease: featuregate.Alpha},
IngressClassNamespacedParams: {Default: true, PreRelease: featuregate.Beta},
ServiceInternalTrafficPolicy: {Default: false, PreRelease: featuregate.Alpha},
ServiceInternalTrafficPolicy: {Default: true, PreRelease: featuregate.Beta},
SuspendJob: {Default: true, PreRelease: featuregate.Beta},
KubeletPodResourcesGetAllocatable: {Default: false, PreRelease: featuregate.Alpha},
NamespaceDefaultLabelName: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24

View File

@ -4781,7 +4781,7 @@ func Test_EndpointSliceReadyAndTerminatingLocal(t *testing.T) {
fp.endpointsSynced = true
fp.endpointSlicesSynced = true
localInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyLocal
clusterInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyCluster
serviceName := "svc1"
// Add initial service
@ -4793,7 +4793,7 @@ func Test_EndpointSliceReadyAndTerminatingLocal(t *testing.T) {
Selector: map[string]string{"foo": "bar"},
Type: v1.ServiceTypeNodePort,
ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal,
InternalTrafficPolicy: &localInternalTrafficPolicy,
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
ExternalIPs: []string{
"1.2.3.4",
},
@ -4957,7 +4957,7 @@ func Test_EndpointSliceOnlyReadyAndTerminatingLocal(t *testing.T) {
fp.endpointsSynced = true
fp.endpointSlicesSynced = true
localInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyLocal
clusterInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyCluster
// Add initial service
serviceName := "svc1"
@ -4969,7 +4969,7 @@ func Test_EndpointSliceOnlyReadyAndTerminatingLocal(t *testing.T) {
Selector: map[string]string{"foo": "bar"},
Type: v1.ServiceTypeNodePort,
ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal,
InternalTrafficPolicy: &localInternalTrafficPolicy,
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
ExternalIPs: []string{
"1.2.3.4",
},
@ -5130,7 +5130,7 @@ func Test_EndpointSliceOnlyReadyAndTerminatingLocalWithFeatureGateDisabled(t *te
fp.endpointsSynced = true
fp.endpointSlicesSynced = true
localInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyLocal
clusterInternalTrafficPolicy := v1.ServiceInternalTrafficPolicyCluster
// Add initial service
serviceName := "svc1"
@ -5142,7 +5142,7 @@ func Test_EndpointSliceOnlyReadyAndTerminatingLocalWithFeatureGateDisabled(t *te
Selector: map[string]string{"foo": "bar"},
Type: v1.ServiceTypeNodePort,
ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal,
InternalTrafficPolicy: &localInternalTrafficPolicy,
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
ExternalIPs: []string{
"1.2.3.4",
},

View File

@ -1451,6 +1451,70 @@ func TestServiceRegistryExternalTrafficGlobal(t *testing.T) {
}
}
// Validate the internalTrafficPolicy field when set to "Cluster" then updated to "Local"
func TestServiceRegistryInternalTrafficPolicyClusterThenLocal(t *testing.T) {
ctx := genericapirequest.NewDefaultContext()
storage, server := NewTestREST(t, []api.IPFamily{api.IPv4Protocol})
defer server.Terminate(t)
svc := svctest.MakeService("internal-traffic-policy-cluster",
svctest.SetInternalTrafficPolicy(api.ServiceInternalTrafficPolicyCluster),
)
obj, err := storage.Create(ctx, svc, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
if obj == nil || err != nil {
t.Errorf("Unexpected failure creating service %v", err)
}
createdSvc := obj.(*api.Service)
if *createdSvc.Spec.InternalTrafficPolicy != api.ServiceInternalTrafficPolicyCluster {
t.Errorf("Expecting internalTrafficPolicy field to have value Cluster, got: %s", *createdSvc.Spec.InternalTrafficPolicy)
}
update := createdSvc.DeepCopy()
local := api.ServiceInternalTrafficPolicyLocal
update.Spec.InternalTrafficPolicy = &local
updatedSvc, _, errUpdate := storage.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(update), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc, false, &metav1.UpdateOptions{})
if errUpdate != nil {
t.Fatalf("unexpected error during update %v", errUpdate)
}
updatedService := updatedSvc.(*api.Service)
if *updatedService.Spec.InternalTrafficPolicy != api.ServiceInternalTrafficPolicyLocal {
t.Errorf("Expected internalTrafficPolicy to be Local, got: %s", *updatedService.Spec.InternalTrafficPolicy)
}
}
// Validate the internalTrafficPolicy field when set to "Local" and then updated to "Cluster"
func TestServiceRegistryInternalTrafficPolicyLocalThenCluster(t *testing.T) {
ctx := genericapirequest.NewDefaultContext()
storage, server := NewTestREST(t, []api.IPFamily{api.IPv4Protocol})
defer server.Terminate(t)
svc := svctest.MakeService("internal-traffic-policy-cluster",
svctest.SetInternalTrafficPolicy(api.ServiceInternalTrafficPolicyLocal),
)
obj, err := storage.Create(ctx, svc, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
if obj == nil || err != nil {
t.Errorf("Unexpected failure creating service %v", err)
}
createdSvc := obj.(*api.Service)
if *createdSvc.Spec.InternalTrafficPolicy != api.ServiceInternalTrafficPolicyLocal {
t.Errorf("Expecting internalTrafficPolicy field to have value Local, got: %s", *createdSvc.Spec.InternalTrafficPolicy)
}
update := createdSvc.DeepCopy()
cluster := api.ServiceInternalTrafficPolicyCluster
update.Spec.InternalTrafficPolicy = &cluster
updatedSvc, _, errUpdate := storage.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(update), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc, false, &metav1.UpdateOptions{})
if errUpdate != nil {
t.Fatalf("unexpected error during update %v", errUpdate)
}
updatedService := updatedSvc.(*api.Service)
if *updatedService.Spec.InternalTrafficPolicy != api.ServiceInternalTrafficPolicyCluster {
t.Errorf("Expected internalTrafficPolicy to be Cluster, got: %s", *updatedService.Spec.InternalTrafficPolicy)
}
}
func TestInitClusterIP(t *testing.T) {
testCases := []struct {
name string

View File

@ -54,6 +54,7 @@ func newStorage(t *testing.T) (*GenericREST, *StatusREST, *etcd3testing.EtcdTest
func validService() *api.Service {
singleStack := api.IPFamilyPolicySingleStack
clusterInternalTrafficPolicy := api.ServiceInternalTrafficPolicyCluster
return &api.Service{
ObjectMeta: metav1.ObjectMeta{
@ -73,6 +74,7 @@ func validService() *api.Service {
Protocol: api.ProtocolTCP,
TargetPort: intstr.FromInt(6502),
}},
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
},
}
}
@ -109,6 +111,8 @@ func TestCreate(t *testing.T) {
}
func TestUpdate(t *testing.T) {
clusterInternalTrafficPolicy := api.ServiceInternalTrafficPolicyCluster
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
@ -130,6 +134,7 @@ func TestUpdate(t *testing.T) {
Protocol: api.ProtocolTCP,
TargetPort: intstr.FromInt(6502),
}},
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
}
return object
},

View File

@ -67,6 +67,7 @@ func TestCheckGeneratedNameError(t *testing.T) {
func makeValidService() *api.Service {
preferDual := api.IPFamilyPolicyPreferDualStack
clusterInternalTrafficPolicy := api.ServiceInternalTrafficPolicyCluster
return &api.Service{
ObjectMeta: metav1.ObjectMeta{
@ -84,10 +85,11 @@ func makeValidService() *api.Service {
makeValidServicePort("p", "TCP", 8675),
makeValidServicePort("q", "TCP", 309),
},
ClusterIP: "1.2.3.4",
ClusterIPs: []string{"1.2.3.4", "5:6:7::8"},
IPFamilyPolicy: &preferDual,
IPFamilies: []api.IPFamily{"IPv4", "IPv6"},
ClusterIP: "1.2.3.4",
ClusterIPs: []string{"1.2.3.4", "5:6:7::8"},
IPFamilyPolicy: &preferDual,
IPFamilies: []api.IPFamily{"IPv4", "IPv6"},
InternalTrafficPolicy: &clusterInternalTrafficPolicy,
},
}
}