@@ -23,8 +23,11 @@ import (
2323
2424 apierrs "k8s.io/apimachinery/pkg/api/errors"
2525 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+ "k8s.io/apimachinery/pkg/labels"
27+ "k8s.io/apimachinery/pkg/util/sets"
2628
2729 "knative.dev/net-gateway-api/pkg/reconciler/ingress/config"
30+ "knative.dev/net-gateway-api/pkg/reconciler/ingress/resources"
2831 "knative.dev/net-gateway-api/pkg/status"
2932 "knative.dev/networking/pkg/apis/networking/v1alpha1"
3033 ingressreconciler "knative.dev/networking/pkg/client/injection/reconciler/networking/v1alpha1/ingress"
@@ -102,7 +105,11 @@ func (c *Reconciler) reconcileIngress(ctx context.Context, ing *v1alpha1.Ingress
102105
103106 routesReady := true
104107
108+ // 望ましいHTTPRoute名(ルールごとにLongestHostを採用)を収集
109+ desiredRouteNames := sets .New [string ]()
105110 for _ , rule := range ing .Spec .Rules {
111+ desiredRouteNames .Insert (resources .LongestHost (rule .Hosts ))
112+
106113 httproute , probeTargets , err := c .reconcileHTTPRoute (ctx , ingressHash , ing , & rule )
107114 if err != nil {
108115 return err
@@ -123,6 +130,26 @@ func (c *Reconciler) reconcileIngress(ctx context.Context, ing *v1alpha1.Ingress
123130 }
124131 }
125132
133+ // Delete HTTPRoutes that don't exist in the current Spec (i.e., tags removed and no longer referenced)
134+ {
135+ existingRoutes , err := c .httprouteLister .HTTPRoutes (ing .Namespace ).List (labels .Everything ())
136+ if err != nil {
137+ return fmt .Errorf ("failed to list HTTPRoutes: %w" , err )
138+ }
139+ for _ , r := range existingRoutes {
140+ // Don't touch routes not owned by this Ingress
141+ if ! metav1 .IsControlledBy (r , ing ) {
142+ continue
143+ }
144+ // Not in the desired set = unnecessary
145+ if ! desiredRouteNames .Has (r .Name ) {
146+ if err := c .gwapiclient .GatewayV1 ().HTTPRoutes (r .Namespace ).Delete (ctx , r .Name , metav1.DeleteOptions {}); err != nil && ! apierrs .IsNotFound (err ) {
147+ return fmt .Errorf ("failed to delete stale HTTPRoute %s/%s: %w" , r .Namespace , r .Name , err )
148+ }
149+ }
150+ }
151+ }
152+
126153 externalIngressTLS := ing .GetIngressTLSForVisibility (v1alpha1 .IngressVisibilityExternalIP )
127154 listeners := make ([]* gatewayapi.Listener , 0 , len (externalIngressTLS ))
128155 for _ , tls := range externalIngressTLS {
0 commit comments