Skip to content

Commit 737eb5a

Browse files
committed
Reduce memory by excluding Helm release Secrets and standard Secret types other than tls and Opaque
Signed-off-by: Richard Wall <[email protected]>
1 parent 473277b commit 737eb5a

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

pkg/datagatherer/k8s/dynamic.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,28 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
151151
}
152152
// init shared informer for selected namespaces
153153
fieldSelector := generateFieldSelector(c.ExcludeNamespaces)
154+
// Reduce the memory usage and reduce the load on the Kubernetes API server
155+
// by omitting various common Secret types when listing Secrets.
156+
// * https://kubernetes.io/docs/concepts/configuration/secret/#secret-types
157+
//
158+
// It would be better to include only TLS and Opaque Secrets rather than excluding the other types,
159+
// because we can never know all the possible Secret types that a cluster may have,
160+
// but field selectors do not yet support set based operators:
161+
// * https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/#supported-operators
162+
// * https://github.com/kubernetes/kubernetes/issues/32946
163+
if c.GroupVersionResource.Group == "" && c.GroupVersionResource.Version == "v1" && c.GroupVersionResource.Resource == "secrets" {
164+
fieldSelector = fields.AndSelectors(
165+
fieldSelector,
166+
fields.OneTermNotEqualSelector("type", "kubernetes.io/service-account-token"),
167+
fields.OneTermNotEqualSelector("type", "kubernetes.io/dockercfg"),
168+
fields.OneTermNotEqualSelector("type", "kubernetes.io/dockerconfigjson"),
169+
fields.OneTermNotEqualSelector("type", "kubernetes.io/basic-auth"),
170+
fields.OneTermNotEqualSelector("type", "kubernetes.io/ssh-auth"),
171+
fields.OneTermNotEqualSelector("type", "bootstrap.kubernetes.io/token"),
172+
fields.OneTermNotEqualSelector("type", "helm.sh/release.v1"),
173+
)
174+
}
175+
154176
// init cache to store gathered resources
155177
dgCache := cache.New(5*time.Minute, 30*time.Second)
156178

@@ -159,7 +181,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
159181
cl: cl,
160182
k8sClientSet: clientset,
161183
groupVersionResource: c.GroupVersionResource,
162-
fieldSelector: fieldSelector,
184+
fieldSelector: fieldSelector.String(),
163185
namespaces: c.IncludeNamespaces,
164186
cache: dgCache,
165187
}
@@ -177,7 +199,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
177199
60*time.Second,
178200
informers.WithNamespace(metav1.NamespaceAll),
179201
informers.WithTweakListOptions(func(options *metav1.ListOptions) {
180-
options.FieldSelector = fieldSelector
202+
options.FieldSelector = fieldSelector.String()
181203
}))
182204
newDataGatherer.nativeSharedInformer = factory
183205
informer := informerFunc(factory)
@@ -200,7 +222,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
200222
cl,
201223
60*time.Second,
202224
metav1.NamespaceAll,
203-
func(options *metav1.ListOptions) { options.FieldSelector = fieldSelector },
225+
func(options *metav1.ListOptions) { options.FieldSelector = fieldSelector.String() },
204226
)
205227
resourceInformer := factory.ForResource(c.GroupVersionResource)
206228
informer := resourceInformer.Informer()
@@ -422,15 +444,15 @@ func namespaceResourceInterface(iface dynamic.NamespaceableResourceInterface, na
422444

423445
// generateFieldSelector creates a field selector string from a list of
424446
// namespaces to exclude.
425-
func generateFieldSelector(excludeNamespaces []string) string {
447+
func generateFieldSelector(excludeNamespaces []string) fields.Selector {
426448
fieldSelector := fields.Nothing()
427449
for _, excludeNamespace := range excludeNamespaces {
428450
if excludeNamespace == "" {
429451
continue
430452
}
431453
fieldSelector = fields.AndSelectors(fields.OneTermNotEqualSelector("metadata.namespace", excludeNamespace), fieldSelector)
432454
}
433-
return fieldSelector.String()
455+
return fieldSelector
434456
}
435457

436458
func isIncludedNamespace(namespace string, namespaces []string) bool {

pkg/datagatherer/k8s/dynamic_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ func TestGenerateFieldSelector(t *testing.T) {
312312
}
313313

314314
for _, test := range tests {
315-
fieldSelector := generateFieldSelector(test.ExcludeNamespaces)
315+
fieldSelector := generateFieldSelector(test.ExcludeNamespaces).String()
316316
if fieldSelector != test.ExpectedFieldSelector {
317317
t.Errorf("ExpectedFieldSelector does not match: got=%+v want=%+v", fieldSelector, test.ExpectedFieldSelector)
318318
}

0 commit comments

Comments
 (0)