Skip to content

Commit fb4bbfb

Browse files
committed
optimize: preserving needed fields for memory efficiency
Signed-off-by: Colvin-Y <[email protected]>
1 parent 94d1825 commit fb4bbfb

File tree

2 files changed

+57
-11
lines changed

2 files changed

+57
-11
lines changed

pkg/descheduler/descheduler.go

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
policyv1 "k8s.io/api/policy/v1"
3535
schedulingv1 "k8s.io/api/scheduling/v1"
3636
apierrors "k8s.io/apimachinery/pkg/api/errors"
37-
"k8s.io/apimachinery/pkg/api/meta"
3837
"k8s.io/apimachinery/pkg/labels"
3938
"k8s.io/apimachinery/pkg/runtime"
4039
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -153,6 +152,60 @@ func metricsProviderListToMap(providersList []api.MetricsProvider) map[api.Metri
153152
return providersMap
154153
}
155154

155+
// preserveNeeded returns the obj preserving fields needed for memory efficiency.
156+
// Only keep scheduler related fields
157+
func preserveNeeded(obj interface{}) (interface{}, error) {
158+
if pod, ok := obj.(*v1.Pod); ok {
159+
preserveContainer := func(c *v1.Container) {
160+
c.Command = nil
161+
c.Args = nil
162+
c.WorkingDir = ""
163+
c.Ports = nil
164+
c.EnvFrom = nil
165+
c.Env = nil
166+
c.ResizePolicy = nil
167+
c.VolumeMounts = nil
168+
c.VolumeDevices = nil
169+
c.LivenessProbe = nil
170+
c.ReadinessProbe = nil
171+
c.StartupProbe = nil
172+
c.Lifecycle = nil
173+
c.TerminationMessagePath = ""
174+
c.TerminationMessagePolicy = ""
175+
c.ImagePullPolicy = ""
176+
c.SecurityContext = nil
177+
}
178+
179+
// metadata related
180+
pod.ManagedFields = nil
181+
pod.Finalizers = nil
182+
183+
// spec related
184+
for i := 0; i < len(pod.Spec.InitContainers); i++ {
185+
preserveContainer(&pod.Spec.InitContainers[i])
186+
}
187+
for i := 0; i < len(pod.Spec.Containers); i++ {
188+
preserveContainer(&pod.Spec.Containers[i])
189+
}
190+
pod.Spec.EphemeralContainers = nil
191+
pod.Spec.SecurityContext = nil
192+
pod.Spec.ImagePullSecrets = nil
193+
pod.Spec.Hostname = ""
194+
pod.Spec.Subdomain = ""
195+
pod.Spec.HostAliases = nil
196+
pod.Spec.PriorityClassName = ""
197+
pod.Spec.DNSConfig = nil
198+
pod.Spec.ReadinessGates = nil
199+
pod.Spec.RuntimeClassName = nil
200+
pod.Spec.PreemptionPolicy = nil
201+
}
202+
if node, ok := obj.(*v1.Node); ok {
203+
node.ManagedFields = nil
204+
node.Status.Images = nil
205+
}
206+
return obj, nil
207+
}
208+
156209
func newDescheduler(ctx context.Context, rs *options.DeschedulerServer, deschedulerPolicy *api.DeschedulerPolicy, evictionPolicyGroupVersion string, eventRecorder events.EventRecorder, sharedInformerFactory, namespacedSharedInformerFactory informers.SharedInformerFactory) (*descheduler, error) {
157210
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
158211

@@ -585,7 +638,7 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
585638
ctx, span = tracing.Tracer().Start(ctx, "RunDeschedulerStrategies")
586639
defer span.End()
587640

588-
sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(trimManagedFields))
641+
sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(preserveNeeded))
589642

590643
var nodeSelector string
591644
if deschedulerPolicy.NodeSelector != nil {
@@ -608,7 +661,7 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
608661
if prometheusProvider != nil && prometheusProvider.Prometheus != nil && prometheusProvider.Prometheus.URL != "" {
609662
if prometheusProvider.Prometheus.AuthToken != nil {
610663
// Will get reconciled
611-
namespacedSharedInformerFactory = informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(trimManagedFields), informers.WithNamespace(prometheusProvider.Prometheus.AuthToken.SecretReference.Namespace))
664+
namespacedSharedInformerFactory = informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(preserveNeeded), informers.WithNamespace(prometheusProvider.Prometheus.AuthToken.SecretReference.Namespace))
612665
metricProviderTokenReconciliation = secretReconciliation
613666
} else {
614667
// Use the sa token and assume it has the sufficient permissions to authenticate
@@ -711,10 +764,3 @@ func createClients(clientConnection componentbaseconfig.ClientConnectionConfigur
711764

712765
return kClient, eventClient, nil
713766
}
714-
715-
func trimManagedFields(obj interface{}) (interface{}, error) {
716-
if accessor, err := meta.Accessor(obj); err == nil {
717-
accessor.SetManagedFields(nil)
718-
}
719-
return obj, nil
720-
}

pkg/descheduler/descheduler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ func initDescheduler(t *testing.T, ctx context.Context, featureGates featuregate
190190
rs.DefaultFeatureGates = featureGates
191191
rs.MetricsClient = metricsClient
192192

193-
sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(trimManagedFields))
193+
sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(preserveNeeded))
194194
eventBroadcaster, eventRecorder := utils.GetRecorderAndBroadcaster(ctx, client)
195195

196196
descheduler, err := newDescheduler(ctx, rs, internalDeschedulerPolicy, "v1", eventRecorder, sharedInformerFactory, nil)

0 commit comments

Comments
 (0)