From 14836deaf0e098e72b6d6c943965cc5f44110ae6 Mon Sep 17 00:00:00 2001 From: "David L. Chandler" Date: Tue, 28 Jul 2026 22:44:12 -0400 Subject: [PATCH 01/11] fix: stop endpoint events from rebuilding Gateway proxies # Description Prevent Pod and EndpointSlice events from triggering full Kubernetes Gateway proxy retranslation. These resources already flow through the KRT endpoint pipeline, which updates the affected xDS endpoint resources. The legacy controller-runtime watches additionally called the global proxy `Kick`, causing every Gateway proxy to be rebuilt as often as once per second in event-heavy clusters. ## Code changes - Remove the legacy Pod and EndpointSlice controller registrations. - Remove their reconcilers, whose only behavior was calling the global proxy `Kick`. - Add a regression test proving that Service events still request proxy recomputation while Pod and EndpointSlice events do not. - Add a changelog entry referencing solo-io/solo-projects#8013 with `resolvesIssue: false`. # Context Investigation of solo-io/solo-projects#8013 found sustained CPU usage and heap growth dominated by Gateway API route translation, including `buildProxy`, `translateGatewayHTTPRouteRule`, `setRouteAction`, and `RouteOptions.Clone`. Pod and EndpointSlice events currently enter two paths: 1. The KRT endpoint collections update endpoint resources in xDS. 2. The legacy controller-runtime reconcilers call `Kick`, causing all Gateway proxies and HTTPRoutes to be translated again. The second path is redundant for endpoint-only changes and creates substantial CPU and allocation churn in clusters with frequent workload or endpoint updates. This change addresses that unnecessary translation loop. It does not claim to fully resolve #8013; the independent cached Envoy snapshot retention addressed by #11309 has not yet landed. ## Interesting decisions The Pod and EndpointSlice controllers are removed instead of retained as no-op reconcilers. Their only behavior was calling `Kick`, and endpoint processing is already owned by the KRT collections. Service, Secret, route, policy, ReferenceGrant, and Namespace watches remain unchanged because those resources can affect proxy translation or validation. ## Testing steps ```bash CGO_ENABLED=0 go test -count=1 \ ./projects/gateway2/controller \ ./projects/gateway2/krtcollections \ ./projects/gateway2/proxy_syncer ``` The new envtest coverage uses a Service event as a positive control to verify that the `Kick` callback is active, then verifies that creating a Pod and EndpointSlice does not invoke it. ## Notes for reviewers Please verify that: - Pod and EndpointSlice events no longer reach the global proxy recompute trigger. - The KRT Pod and EndpointSlice collections remain unchanged and continue to update xDS endpoints. - Resources that can affect proxy translation continue to call `Kick`. - The changelog intentionally uses `resolvesIssue: false`. # Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] Documentation changes are not required because this does not change an API or user workflow - [x] I have added tests that prove my fix is effective ``` Signed-off-by: David L. Chandler --- .../stop-endpoint-proxy-recompute.yaml | 9 +++ projects/gateway2/controller/controller.go | 29 +------- .../controller/controller_suite_test.go | 4 +- .../gateway2/controller/recompute_test.go | 66 +++++++++++++++++++ 4 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml create mode 100644 projects/gateway2/controller/recompute_test.go diff --git a/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml new file mode 100644 index 00000000000..05916c3d663 --- /dev/null +++ b/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml @@ -0,0 +1,9 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/8013 + resolvesIssue: false + description: >- + Prevent Pod and EndpointSlice events from triggering full Kubernetes + Gateway proxy retranslation. Endpoint changes continue to update xDS + through the KRT endpoint pipeline, reducing unnecessary CPU and memory + churn in event-heavy clusters. diff --git a/projects/gateway2/controller/controller.go b/projects/gateway2/controller/controller.go index b90d307024b..4d06b9d4b0f 100644 --- a/projects/gateway2/controller/controller.go +++ b/projects/gateway2/controller/controller.go @@ -6,7 +6,6 @@ import ( "fmt" corev1 "k8s.io/api/core/v1" - discoveryv1 "k8s.io/api/discovery/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -93,8 +92,8 @@ func NewBaseGatewayController(ctx context.Context, cfg GatewayConfig) error { controllerBuilder.watchVirtualHostOptions, controllerBuilder.watchUpstreams, controllerBuilder.watchServices, - controllerBuilder.watchEndpointSlices, - controllerBuilder.watchPods, + // Pod and EndpointSlice updates flow through the KRT endpoint collections. + // Watching them here would unnecessarily rebuild every Gateway proxy. controllerBuilder.watchSecrets, controllerBuilder.addIndexes, controllerBuilder.addHttpLisOptIndexes, @@ -472,18 +471,6 @@ func (c *controllerBuilder) watchDirectResponses(_ context.Context) error { Complete(reconcile.Func(c.reconciler.ReconcileDirectResponses)) } -func (c *controllerBuilder) watchPods(ctx context.Context) error { - return ctrl.NewControllerManagedBy(c.cfg.Mgr). - For(&corev1.Pod{}). - Complete(reconcile.Func(c.reconciler.ReconcilePods)) -} - -func (c *controllerBuilder) watchEndpointSlices(ctx context.Context) error { - return ctrl.NewControllerManagedBy(c.cfg.Mgr). - For(&discoveryv1.EndpointSlice{}). - Complete(reconcile.Func(c.reconciler.ReconcileEndpointSlices)) -} - func (c *controllerBuilder) watchSecrets(ctx context.Context) error { return ctrl.NewControllerManagedBy(c.cfg.Mgr). For(&corev1.Secret{}). @@ -545,18 +532,6 @@ func (r *controllerReconciler) ReconcileServices(ctx context.Context, req ctrl.R return ctrl.Result{}, nil } -func (r *controllerReconciler) ReconcilePods(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - // eventually reconcile only effected listeners etc - r.kick(ctx) - return ctrl.Result{}, nil -} - -func (r *controllerReconciler) ReconcileEndpointSlices(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - // eventually reconcile only effected listeners etc - r.kick(ctx) - return ctrl.Result{}, nil -} - func (r *controllerReconciler) ReconcileSecrets(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // eventually reconcile only effected listeners etc r.kick(ctx) diff --git a/projects/gateway2/controller/controller_suite_test.go b/projects/gateway2/controller/controller_suite_test.go index 7a055798fc3..f34692c9f46 100644 --- a/projects/gateway2/controller/controller_suite_test.go +++ b/projects/gateway2/controller/controller_suite_test.go @@ -7,6 +7,7 @@ import ( "os/exec" "path/filepath" "strings" + "sync/atomic" "testing" "sigs.k8s.io/controller-runtime/pkg/config" @@ -45,6 +46,7 @@ var ( cancel context.CancelFunc kubeconfig string + kickCount atomic.Int64 gwClasses = sets.New(gatewayClassName, altGatewayClassName) ) @@ -124,7 +126,7 @@ var _ = BeforeSuite(func() { ControllerName: gatewayControllerName, GWClasses: gwClasses, AutoProvision: true, - Kick: func(ctx context.Context) { return }, + Kick: func(ctx context.Context) { kickCount.Add(1) }, Extensions: exts, } err = controller.NewBaseGatewayController(ctx, cfg) diff --git a/projects/gateway2/controller/recompute_test.go b/projects/gateway2/controller/recompute_test.go new file mode 100644 index 00000000000..34c59a7184d --- /dev/null +++ b/projects/gateway2/controller/recompute_test.go @@ -0,0 +1,66 @@ +package controller_test + +import ( + "fmt" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + discoveryv1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var _ = Describe("Proxy recomputation", func() { + const ( + timeout = 10 * time.Second + interval = 100 * time.Millisecond + ) + + It("does not kick for Pod or EndpointSlice events", func() { + suffix := fmt.Sprintf("%d", time.Now().UnixNano()) + + // Verify the callback is wired through a controller that still requires + // full proxy recomputation. + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "recompute-control-" + suffix, + Namespace: "default", + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{{Port: 8080}}, + }, + } + beforeService := kickCount.Load() + Expect(k8sClient.Create(ctx, service)).To(Succeed()) + Eventually(kickCount.Load, timeout, interval).Should(BeNumerically(">", beforeService)) + + beforeEndpoints := kickCount.Load() + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "no-recompute-" + suffix, + Namespace: "default", + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{{ + Name: "test", + Image: "test", + }}, + }, + } + endpointSlice := &discoveryv1.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Name: "no-recompute-" + suffix, + Namespace: "default", + }, + AddressType: discoveryv1.AddressTypeIPv4, + Endpoints: []discoveryv1.Endpoint{{ + Addresses: []string{"10.0.0.1"}, + }}, + } + + Expect(k8sClient.Create(ctx, pod)).To(Succeed()) + Expect(k8sClient.Create(ctx, endpointSlice)).To(Succeed()) + Consistently(kickCount.Load, time.Second, interval).Should(Equal(beforeEndpoints)) + }) +}) From 41aee698912ee1f0273f1828c8f7d423ad60d197 Mon Sep 17 00:00:00 2001 From: "David L. Chandler" Date: Wed, 29 Jul 2026 11:18:57 -0400 Subject: [PATCH 02/11] fixup test Signed-off-by: David L. Chandler --- .../gateway2/controller/recompute_test.go | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/projects/gateway2/controller/recompute_test.go b/projects/gateway2/controller/recompute_test.go index 34c59a7184d..b1bb42ff039 100644 --- a/projects/gateway2/controller/recompute_test.go +++ b/projects/gateway2/controller/recompute_test.go @@ -9,36 +9,36 @@ import ( corev1 "k8s.io/api/core/v1" discoveryv1 "k8s.io/api/discovery/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" ) -var _ = Describe("Proxy recomputation", func() { - const ( - timeout = 10 * time.Second - interval = 100 * time.Millisecond - ) +var _ = Describe("Proxy recomputation", Ordered, func() { + const timeout = 10 * time.Second - It("does not kick for Pod or EndpointSlice events", func() { + It("does not kick proxy translation for endpoint-only events", func() { suffix := fmt.Sprintf("%d", time.Now().UnixNano()) + serviceName := "kick-control-" + suffix - // Verify the callback is wired through a controller that still requires - // full proxy recomputation. - service := &corev1.Service{ + beforeService := kickCount.Load() + Expect(k8sClient.Create(ctx, &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ - Name: "recompute-control-" + suffix, + Name: serviceName, Namespace: "default", }, Spec: corev1.ServiceSpec{ - Ports: []corev1.ServicePort{{Port: 8080}}, + Ports: []corev1.ServicePort{{ + Name: "http", + Port: 8080, + }}, }, - } - beforeService := kickCount.Load() - Expect(k8sClient.Create(ctx, service)).To(Succeed()) - Eventually(kickCount.Load, timeout, interval).Should(BeNumerically(">", beforeService)) + })).To(Succeed()) + Eventually(kickCount.Load, timeout).Should(BeNumerically(">", beforeService), + "the positive control should prove that Kick is wired to the controller") - beforeEndpoints := kickCount.Load() - pod := &corev1.Pod{ + baseline := kickCount.Load() + Expect(k8sClient.Create(ctx, &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ - Name: "no-recompute-" + suffix, + Name: "no-kick-pod-" + suffix, Namespace: "default", }, Spec: corev1.PodSpec{ @@ -47,20 +47,25 @@ var _ = Describe("Proxy recomputation", func() { Image: "test", }}, }, - } - endpointSlice := &discoveryv1.EndpointSlice{ + })).To(Succeed()) + Expect(k8sClient.Create(ctx, &discoveryv1.EndpointSlice{ ObjectMeta: metav1.ObjectMeta{ - Name: "no-recompute-" + suffix, + Name: "no-kick-slice-" + suffix, Namespace: "default", + Labels: map[string]string{ + discoveryv1.LabelServiceName: serviceName, + }, }, AddressType: discoveryv1.AddressTypeIPv4, Endpoints: []discoveryv1.Endpoint{{ Addresses: []string{"10.0.0.1"}, }}, - } + Ports: []discoveryv1.EndpointPort{{ + Name: ptr.To("http"), + Port: ptr.To(int32(8080)), + }}, + })).To(Succeed()) - Expect(k8sClient.Create(ctx, pod)).To(Succeed()) - Expect(k8sClient.Create(ctx, endpointSlice)).To(Succeed()) - Consistently(kickCount.Load, time.Second, interval).Should(Equal(beforeEndpoints)) + Consistently(kickCount.Load, time.Second).Should(Equal(baseline)) }) }) From 29482989d1ab0a3a8ca04b4a6cac72c319c40e68 Mon Sep 17 00:00:00 2001 From: "David L. Chandler" Date: Wed, 29 Jul 2026 11:20:43 -0400 Subject: [PATCH 03/11] add another test re: non-gateway mode (custom CRD mode) Signed-off-by: David L. Chandler --- .../gateway2/krtcollections/endpoints_test.go | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/projects/gateway2/krtcollections/endpoints_test.go b/projects/gateway2/krtcollections/endpoints_test.go index 043d566f021..2322cadbc93 100644 --- a/projects/gateway2/krtcollections/endpoints_test.go +++ b/projects/gateway2/krtcollections/endpoints_test.go @@ -3,6 +3,7 @@ package krtcollections import ( "context" "testing" + "time" envoy_config_core_v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" endpointv3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3" @@ -21,6 +22,107 @@ import ( "k8s.io/utils/ptr" ) +func TestEndpointInputsRecomputeEndpoints(t *testing.T) { + g := gomega.NewWithT(t) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + upstream := UpstreamWrapper{ + Inner: &gloov1.Upstream{ + Metadata: &core.Metadata{Name: "upstream", Namespace: "ns"}, + UpstreamType: &gloov1.Upstream_Kube{ + Kube: &kubernetes.UpstreamSpec{ + ServiceName: "svc", + ServiceNamespace: "ns", + ServicePort: 8080, + }, + }, + }, + } + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{Name: "svc", Namespace: "ns"}, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{{ + Name: "http", + Port: 8080, + }}, + }, + } + endpointSlice := &discoveryv1.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Name: "svc-abcde", + Namespace: "ns", + Labels: map[string]string{ + discoveryv1.LabelServiceName: "svc", + }, + }, + AddressType: discoveryv1.AddressTypeIPv4, + Endpoints: []discoveryv1.Endpoint{{ + Addresses: []string{"10.0.0.1"}, + TargetRef: &corev1.ObjectReference{ + Kind: "Pod", + Name: "pod", + Namespace: "ns", + }, + }}, + Ports: []discoveryv1.EndpointPort{{ + Name: ptr.To("http"), + Port: ptr.To(int32(8080)), + }}, + } + pod := LocalityPod{ + Named: krt.Named{Name: "pod", Namespace: "ns"}, + AugmentedLabels: map[string]string{"version": "v1"}, + Addresses: []string{"10.0.0.1"}, + } + + upstreams := krt.NewStaticCollection(nil, []UpstreamWrapper{upstream}) + services := krt.NewStaticCollection(nil, []*corev1.Service{service}) + endpointSlices := krt.NewStaticCollection(nil, []*discoveryv1.EndpointSlice{endpointSlice}) + pods := krt.NewStaticCollection(nil, []LocalityPod{pod}) + endpointSettings := krt.NewStatic(&EndpointsSettings{}, true) + endpointSlicesByService := krt.NewIndex(endpointSlices, "TestRecomputeEndpointSlicesByService", func(es *discoveryv1.EndpointSlice) []types.NamespacedName { + return []types.NamespacedName{{ + Namespace: es.Namespace, + Name: es.Labels[discoveryv1.LabelServiceName], + }} + }) + + endpoints := NewGlooK8sEndpoints(ctx, EndpointsInputs{ + Upstreams: upstreams, + EndpointSlices: endpointSlices, + EndpointSlicesByService: endpointSlicesByService, + Pods: pods, + EndpointsSettings: endpointSettings, + Services: services, + }) + g.Eventually(endpoints.List, time.Second).Should(HaveLen(1)) + initialHash := endpoints.List()[0].LbEpsEqualityHash + + updatedEndpointSlice := endpointSlice.DeepCopy() + updatedEndpointSlice.Endpoints[0].Addresses = []string{"10.0.0.2"} + endpointSlices.Reset([]*discoveryv1.EndpointSlice{updatedEndpointSlice}) + g.Eventually(func() []uint64 { + current := endpoints.List() + if len(current) != 1 { + return nil + } + return []uint64{current[0].LbEpsEqualityHash} + }, time.Second).Should(SatisfyAll(HaveLen(1), Not(ContainElement(initialHash)))) + endpointSliceHash := endpoints.List()[0].LbEpsEqualityHash + + updatedPod := pod + updatedPod.AugmentedLabels = map[string]string{"version": "v2"} + pods.Reset([]LocalityPod{updatedPod}) + g.Eventually(func() []uint64 { + current := endpoints.List() + if len(current) != 1 { + return nil + } + return []uint64{current[0].LbEpsEqualityHash} + }, time.Second).Should(SatisfyAll(HaveLen(1), Not(ContainElement(endpointSliceHash)))) +} + func TestEndpointsForUpstreamOrderDoesntMatter(t *testing.T) { g := gomega.NewWithT(t) From 75a9372950ae051d626c186203401cab5fda8bf1 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 31 Jul 2026 18:03:08 +0000 Subject: [PATCH 04/11] Adding changelog file to new location --- .../v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml new file mode 100644 index 00000000000..05916c3d663 --- /dev/null +++ b/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml @@ -0,0 +1,9 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/8013 + resolvesIssue: false + description: >- + Prevent Pod and EndpointSlice events from triggering full Kubernetes + Gateway proxy retranslation. Endpoint changes continue to update xDS + through the KRT endpoint pipeline, reducing unnecessary CPU and memory + churn in event-heavy clusters. From 44bcb2330c6c04c3e7cf4d8e533cf0c373e98b77 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 31 Jul 2026 18:03:09 +0000 Subject: [PATCH 05/11] Deleting changelog file from old location --- .../v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml deleted file mode 100644 index 05916c3d663..00000000000 --- a/changelog/v1.22.0-beta11/stop-endpoint-proxy-recompute.yaml +++ /dev/null @@ -1,9 +0,0 @@ -changelog: - - type: FIX - issueLink: https://github.com/solo-io/solo-projects/issues/8013 - resolvesIssue: false - description: >- - Prevent Pod and EndpointSlice events from triggering full Kubernetes - Gateway proxy retranslation. Endpoint changes continue to update xDS - through the KRT endpoint pipeline, reducing unnecessary CPU and memory - churn in event-heavy clusters. From c8951cd395839cea20ff6d53b1ad7c073a4aa630 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Sun, 2 Aug 2026 23:12:01 +0000 Subject: [PATCH 06/11] Adding changelog file to new location --- .../v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml new file mode 100644 index 00000000000..05916c3d663 --- /dev/null +++ b/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml @@ -0,0 +1,9 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/8013 + resolvesIssue: false + description: >- + Prevent Pod and EndpointSlice events from triggering full Kubernetes + Gateway proxy retranslation. Endpoint changes continue to update xDS + through the KRT endpoint pipeline, reducing unnecessary CPU and memory + churn in event-heavy clusters. From 9512f99aec08b7cfa5c9bb47d7133e2b2c85f39b Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Sun, 2 Aug 2026 23:12:02 +0000 Subject: [PATCH 07/11] Deleting changelog file from old location --- .../v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml deleted file mode 100644 index 05916c3d663..00000000000 --- a/changelog/v1.22.0-beta12/stop-endpoint-proxy-recompute.yaml +++ /dev/null @@ -1,9 +0,0 @@ -changelog: - - type: FIX - issueLink: https://github.com/solo-io/solo-projects/issues/8013 - resolvesIssue: false - description: >- - Prevent Pod and EndpointSlice events from triggering full Kubernetes - Gateway proxy retranslation. Endpoint changes continue to update xDS - through the KRT endpoint pipeline, reducing unnecessary CPU and memory - churn in event-heavy clusters. From 34b6f4570d4efc4187a3d99a85405ba177e29812 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 4 Aug 2026 01:00:41 +0000 Subject: [PATCH 08/11] Adding changelog file to new location --- changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml new file mode 100644 index 00000000000..05916c3d663 --- /dev/null +++ b/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml @@ -0,0 +1,9 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/8013 + resolvesIssue: false + description: >- + Prevent Pod and EndpointSlice events from triggering full Kubernetes + Gateway proxy retranslation. Endpoint changes continue to update xDS + through the KRT endpoint pipeline, reducing unnecessary CPU and memory + churn in event-heavy clusters. From 0d3025a7a038a899efda976b3f5df2d47a9bbc3d Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 4 Aug 2026 01:00:42 +0000 Subject: [PATCH 09/11] Deleting changelog file from old location --- .../v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml deleted file mode 100644 index 05916c3d663..00000000000 --- a/changelog/v1.22.0-beta13/stop-endpoint-proxy-recompute.yaml +++ /dev/null @@ -1,9 +0,0 @@ -changelog: - - type: FIX - issueLink: https://github.com/solo-io/solo-projects/issues/8013 - resolvesIssue: false - description: >- - Prevent Pod and EndpointSlice events from triggering full Kubernetes - Gateway proxy retranslation. Endpoint changes continue to update xDS - through the KRT endpoint pipeline, reducing unnecessary CPU and memory - churn in event-heavy clusters. From 8b6aadc6cdf3242ebf154ae92d1714e11368834f Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 4 Aug 2026 22:04:30 +0000 Subject: [PATCH 10/11] Adding changelog file to new location --- changelog/v1.22.2/stop-endpoint-proxy-recompute.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 changelog/v1.22.2/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.2/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.2/stop-endpoint-proxy-recompute.yaml new file mode 100644 index 00000000000..05916c3d663 --- /dev/null +++ b/changelog/v1.22.2/stop-endpoint-proxy-recompute.yaml @@ -0,0 +1,9 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/8013 + resolvesIssue: false + description: >- + Prevent Pod and EndpointSlice events from triggering full Kubernetes + Gateway proxy retranslation. Endpoint changes continue to update xDS + through the KRT endpoint pipeline, reducing unnecessary CPU and memory + churn in event-heavy clusters. From 9554a80511e07649934044e1e5fe69d86e9bfe32 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 4 Aug 2026 22:04:31 +0000 Subject: [PATCH 11/11] Deleting changelog file from old location --- changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml diff --git a/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml b/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml deleted file mode 100644 index 05916c3d663..00000000000 --- a/changelog/v1.22.1/stop-endpoint-proxy-recompute.yaml +++ /dev/null @@ -1,9 +0,0 @@ -changelog: - - type: FIX - issueLink: https://github.com/solo-io/solo-projects/issues/8013 - resolvesIssue: false - description: >- - Prevent Pod and EndpointSlice events from triggering full Kubernetes - Gateway proxy retranslation. Endpoint changes continue to update xDS - through the KRT endpoint pipeline, reducing unnecessary CPU and memory - churn in event-heavy clusters.