Skip to content

Commit d7b053f

Browse files
committed
fix: add selectors to gateway-specific Services for reliable endpoints
The infrastructure reconciler creates gateway-specific ClusterIP Services without selectors and manages EndpointSlices via snapshot version matching. When the dataplane has not acknowledged the current snapshot, no EndpointSlices are created, blocking Gateway convergence. Add 'app: nantian-gw-dataplane' selector to gateway Services so the Kubernetes EndpointSlice controller creates endpoints independently. Foreign EndpointSlices are no longer deleted for gateway Services, allowing them to serve as fallback when managed slices are not yet ready.
1 parent 3fd9706 commit d7b053f

5 files changed

Lines changed: 16 additions & 16 deletions

File tree

internal/infrastructure/reconciler.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,8 @@ func (r *Reconciler) reconcileGatewayServices(
450450
); err != nil {
451451
return err
452452
}
453-
if err := deleteFrontendEndpointSlices(ctx, r.client, state.foreignSlices[serviceID]); err != nil {
454-
return err
455-
}
453+
// Foreign EndpointSlices (e.g. created by Kubernetes when the Service
454+
// has a selector) are kept as a fallback for snapshot convergence.
456455
}
457456

458457
for _, service := range services.Items {

internal/infrastructure/reconciler_core_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ func TestReconcileCreatesGatewayInfrastructureServiceAndUpdatesSharedPorts(t *te
156156
if gatewayService.Annotations["example.com/trace"] != "enabled" {
157157
t.Fatalf("expected propagated annotation, got %#v", gatewayService.Annotations)
158158
}
159-
if gatewayService.Spec.Selector != nil {
160-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", gatewayService.Spec.Selector)
159+
if gatewayService.Spec.Selector == nil || gatewayService.Spec.Selector["app"] != "nantian-gw-dataplane" {
160+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", gatewayService.Spec.Selector)
161161
}
162162
assertServicePort(t, gatewayService.Spec.Ports, 8080, corev1.ProtocolTCP, 0)
163163
assertServicePort(t, gatewayService.Spec.Ports, 5300, corev1.ProtocolUDP, 0)

internal/infrastructure/reconciler_mesh_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -982,8 +982,8 @@ func TestReconcileFrontsSharedAndGatewayServicesOnlyWithAckedCurrentSnapshotNode
982982
if err != nil {
983983
t.Fatalf("Get gateway Service returned error: %v", err)
984984
}
985-
if gatewayService.Spec.Selector != nil {
986-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", gatewayService.Spec.Selector)
985+
if gatewayService.Spec.Selector == nil || gatewayService.Spec.Selector["app"] != "nantian-gw-dataplane" {
986+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", gatewayService.Spec.Selector)
987987
}
988988

989989
var sharedSlices discoveryv1.EndpointSliceList

internal/infrastructure/reconciler_parameters_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,8 @@ allocateLoadBalancerNodePorts: false
314314
if service.Spec.Type != corev1.ServiceTypeLoadBalancer {
315315
t.Fatalf("service type = %s, want LoadBalancer", service.Spec.Type)
316316
}
317-
if service.Spec.Selector != nil {
318-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", service.Spec.Selector)
317+
if service.Spec.Selector == nil || service.Spec.Selector["app"] != "nantian-gw-dataplane" {
318+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", service.Spec.Selector)
319319
}
320320
if service.Spec.ExternalTrafficPolicy != corev1.ServiceExternalTrafficPolicyLocal {
321321
t.Fatalf("externalTrafficPolicy = %s, want Local", service.Spec.ExternalTrafficPolicy)
@@ -574,8 +574,8 @@ func TestReconcileIgnoresInvalidGatewayInfrastructureParametersRef(t *testing.T)
574574
if service.Spec.Type != corev1.ServiceTypeClusterIP {
575575
t.Fatalf("service type = %s, want ClusterIP fallback", service.Spec.Type)
576576
}
577-
if service.Spec.Selector != nil {
578-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", service.Spec.Selector)
577+
if service.Spec.Selector == nil || service.Spec.Selector["app"] != "nantian-gw-dataplane" {
578+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", service.Spec.Selector)
579579
}
580580
if service.Spec.ExternalTrafficPolicy != "" {
581581
t.Fatalf("externalTrafficPolicy = %q, want empty", service.Spec.ExternalTrafficPolicy)
@@ -687,8 +687,8 @@ allocateLoadBalancerNodePorts: false
687687
if service.Spec.Type != corev1.ServiceTypeLoadBalancer {
688688
t.Fatalf("service type = %s, want LoadBalancer", service.Spec.Type)
689689
}
690-
if service.Spec.Selector != nil {
691-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", service.Spec.Selector)
690+
if service.Spec.Selector == nil || service.Spec.Selector["app"] != "nantian-gw-dataplane" {
691+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", service.Spec.Selector)
692692
}
693693
if service.Spec.ExternalTrafficPolicy != corev1.ServiceExternalTrafficPolicyLocal {
694694
t.Fatalf("externalTrafficPolicy = %s, want Local", service.Spec.ExternalTrafficPolicy)
@@ -783,8 +783,8 @@ func TestReconcileResetsGatewayServiceFieldsWhenParametersRefRemoved(t *testing.
783783
if service.Spec.Type != corev1.ServiceTypeClusterIP {
784784
t.Fatalf("service type = %s, want ClusterIP", service.Spec.Type)
785785
}
786-
if service.Spec.Selector != nil {
787-
t.Fatalf("gateway service selector = %#v, want nil with managed EndpointSlices", service.Spec.Selector)
786+
if service.Spec.Selector == nil || service.Spec.Selector["app"] != "nantian-gw-dataplane" {
787+
t.Fatalf("gateway service selector = %#v, want map[app:nantian-gw-dataplane]", service.Spec.Selector)
788788
}
789789
if service.Spec.ExternalTrafficPolicy != "" {
790790
t.Fatalf("externalTrafficPolicy = %q, want empty", service.Spec.ExternalTrafficPolicy)

internal/infrastructure/services.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ func desiredGatewayService(
9898
OwnerReferences: desiredGatewayServiceOwnerReferences(gateway),
9999
},
100100
Spec: corev1.ServiceSpec{
101-
Type: corev1.ServiceTypeClusterIP,
101+
Type: corev1.ServiceTypeClusterIP,
102+
Selector: map[string]string{"app": "nantian-gw-dataplane"},
102103
},
103104
}
104105

0 commit comments

Comments
 (0)