@@ -151,6 +151,28 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
151
151
}
152
152
// init shared informer for selected namespaces
153
153
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
+
154
176
// init cache to store gathered resources
155
177
dgCache := cache .New (5 * time .Minute , 30 * time .Second )
156
178
@@ -159,7 +181,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
159
181
cl : cl ,
160
182
k8sClientSet : clientset ,
161
183
groupVersionResource : c .GroupVersionResource ,
162
- fieldSelector : fieldSelector ,
184
+ fieldSelector : fieldSelector . String () ,
163
185
namespaces : c .IncludeNamespaces ,
164
186
cache : dgCache ,
165
187
}
@@ -177,7 +199,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
177
199
60 * time .Second ,
178
200
informers .WithNamespace (metav1 .NamespaceAll ),
179
201
informers .WithTweakListOptions (func (options * metav1.ListOptions ) {
180
- options .FieldSelector = fieldSelector
202
+ options .FieldSelector = fieldSelector . String ()
181
203
}))
182
204
newDataGatherer .nativeSharedInformer = factory
183
205
informer := informerFunc (factory )
@@ -200,7 +222,7 @@ func (c *ConfigDynamic) newDataGathererWithClient(ctx context.Context, cl dynami
200
222
cl ,
201
223
60 * time .Second ,
202
224
metav1 .NamespaceAll ,
203
- func (options * metav1.ListOptions ) { options .FieldSelector = fieldSelector },
225
+ func (options * metav1.ListOptions ) { options .FieldSelector = fieldSelector . String () },
204
226
)
205
227
resourceInformer := factory .ForResource (c .GroupVersionResource )
206
228
informer := resourceInformer .Informer ()
@@ -422,15 +444,15 @@ func namespaceResourceInterface(iface dynamic.NamespaceableResourceInterface, na
422
444
423
445
// generateFieldSelector creates a field selector string from a list of
424
446
// namespaces to exclude.
425
- func generateFieldSelector (excludeNamespaces []string ) string {
447
+ func generateFieldSelector (excludeNamespaces []string ) fields. Selector {
426
448
fieldSelector := fields .Nothing ()
427
449
for _ , excludeNamespace := range excludeNamespaces {
428
450
if excludeNamespace == "" {
429
451
continue
430
452
}
431
453
fieldSelector = fields .AndSelectors (fields .OneTermNotEqualSelector ("metadata.namespace" , excludeNamespace ), fieldSelector )
432
454
}
433
- return fieldSelector . String ()
455
+ return fieldSelector
434
456
}
435
457
436
458
func isIncludedNamespace (namespace string , namespaces []string ) bool {
0 commit comments