Use indexer for EndpointSlice lookups to avoid O(n) scans in confd#11838
Open
haojiwu wants to merge 1 commit intoprojectcalico:masterfrom
Open
Use indexer for EndpointSlice lookups to avoid O(n) scans in confd#11838haojiwu wants to merge 1 commit intoprojectcalico:masterfrom
haojiwu wants to merge 1 commit intoprojectcalico:masterfrom
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Bug fix: Use a cache indexer for EndpointSlice lookups in confd's route generator to avoid O(n) full scans.
The k8s 1.33 bump (#10715, 0e18c27) migrated confd from the deprecated
v1.EndpointsAPI todiscovery/v1.EndpointSlice. Since a single Service can have multiple EndpointSlices,getEndpointsForServicewas changed to iterate all EndpointSlices viaList()and filter by label. This works correctly but is O(n) in the total number of EndpointSlices across all services.This PR adds a
svcKeyindexer on EndpointSlices keyed bynamespace/serviceNameand usesByIndexfor O(1) lookups.Changes:
confd/pkg/backends/calico/routes.go: AddendpointSliceServiceIndexindexer function, register it in the EndpointSlice informer, and rewritegetEndpointsForServiceto useByIndex()confd/pkg/backends/calico/routes_test.go: Register the indexer in test setup to match production initializationTesting:
Existing unit tests pass and cover the affected code paths.
We applied this change on top of
release-v3.31and deployed to our cluster. Thecalico-nodeCPU usage dropped significantly, from ~2 cores (left, v3.31.3) to ~0.8 cores (right, with fix):Related issues/PRs
Fixes performance regression introduced by #10715.
Todos
Release Note
Reminder for the reviewer
Make sure that this PR has the correct labels and milestone set.
Every PR needs one
docs-*label.docs-pr-required: This change requires a change to the documentation that has not been completed yet.docs-completed: This change has all necessary documentation completed.docs-not-required: This change has no user-facing impact and requires no docs.Every PR needs one
release-note-*label.release-note-required: This PR has user-facing changes. Most PRs should have this label.release-note-not-required: This PR has no user-facing changes.Other optional labels:
cherry-pick-candidate: This PR should be cherry-picked to an earlier release. For bug fixes only.needs-operator-pr: This PR is related to install and requires a corresponding change to the operator.