diff --git a/pkg/controller/common/service_control.go b/pkg/controller/common/service_control.go index 011eb450a63..ece02911154 100644 --- a/pkg/controller/common/service_control.go +++ b/pkg/controller/common/service_control.go @@ -149,6 +149,13 @@ func applyServerSideValues(expected, reconciled *corev1.Service) { if expected.Spec.Type == corev1.ServiceTypeLoadBalancer && expected.Spec.LoadBalancerClass == nil { expected.Spec.LoadBalancerClass = reconciled.Spec.LoadBalancerClass } + + if expected.Spec.AllocateLoadBalancerNodePorts == nil { + expected.Spec.AllocateLoadBalancerNodePorts = reconciled.Spec.AllocateLoadBalancerNodePorts + } + if expected.Spec.ExternalTrafficPolicy == "" { + expected.Spec.ExternalTrafficPolicy = reconciled.Spec.ExternalTrafficPolicy + } } // hasNodePort returns for a given service type, if the service ports have a NodePort or not. diff --git a/pkg/controller/common/service_control_test.go b/pkg/controller/common/service_control_test.go index b6aef467f45..64040179077 100644 --- a/pkg/controller/common/service_control_test.go +++ b/pkg/controller/common/service_control_test.go @@ -564,29 +564,39 @@ func Test_applyServerSideValues(t *testing.T) { }}, }, { - name: "Reconciled InternalTrafficPolicy is used if the expected one is empty", + name: "Reconciled InternalTrafficPolicy/ExternalTrafficPolicy/AllocateLoadBalancerPorts are used if the expected one is empty", args: args{ expected: corev1.Service{Spec: corev1.ServiceSpec{}}, reconciled: corev1.Service{Spec: corev1.ServiceSpec{ - InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyCluster, + AllocateLoadBalancerNodePorts: ptr.To(true), }}, }, want: corev1.Service{Spec: corev1.ServiceSpec{ - InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyCluster, + AllocateLoadBalancerNodePorts: ptr.To(true), }}, }, { - name: "Expected InternalTrafficPolicy is used if not empty", + name: "Expected InternalTrafficPolicy/ExternalTrafficPolicy/AllocateLoadBalancerPorts are used if not empty", args: args{ expected: corev1.Service{Spec: corev1.ServiceSpec{ - InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyLocal), + InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyLocal), + ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal, + AllocateLoadBalancerNodePorts: ptr.To(false), }}, reconciled: corev1.Service{Spec: corev1.ServiceSpec{ - InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyCluster), + ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyCluster, + AllocateLoadBalancerNodePorts: ptr.To(true), }}, }, want: corev1.Service{Spec: corev1.ServiceSpec{ - InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyLocal), + InternalTrafficPolicy: pointer(corev1.ServiceInternalTrafficPolicyLocal), + ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal, + AllocateLoadBalancerNodePorts: ptr.To(false), }}, }, {