Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 57 additions & 9 deletions pkg/descheduler/descheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,61 @@ func metricsProviderListToMap(providersList []api.MetricsProvider) map[api.Metri
return providersMap
}

// preserveNeeded returns the obj preserving fields needed for memory efficiency.
// Only keep scheduler related fields
func preserveNeeded(obj interface{}) (interface{}, error) {
// metadata related
if accessor, err := meta.Accessor(obj); err == nil {
accessor.SetManagedFields(nil)
accessor.SetFinalizers(nil)
}

if pod, ok := obj.(*v1.Pod); ok {
preserveContainer := func(c *v1.Container) {
c.Command = nil
c.Args = nil
c.WorkingDir = ""
c.Ports = nil
c.EnvFrom = nil
c.Env = nil
c.ResizePolicy = nil
c.VolumeMounts = nil
c.VolumeDevices = nil
c.LivenessProbe = nil
c.ReadinessProbe = nil
c.StartupProbe = nil
c.Lifecycle = nil
c.TerminationMessagePath = ""
c.TerminationMessagePolicy = ""
c.ImagePullPolicy = ""
c.SecurityContext = nil
}

// spec related
for i := 0; i < len(pod.Spec.InitContainers); i++ {
preserveContainer(&pod.Spec.InitContainers[i])
}
for i := 0; i < len(pod.Spec.Containers); i++ {
preserveContainer(&pod.Spec.Containers[i])
}
pod.Spec.EphemeralContainers = nil
pod.Spec.SecurityContext = nil
pod.Spec.ImagePullSecrets = nil
pod.Spec.Hostname = ""
pod.Spec.Subdomain = ""
pod.Spec.HostAliases = nil
pod.Spec.PriorityClassName = ""
pod.Spec.DNSConfig = nil
pod.Spec.ReadinessGates = nil
pod.Spec.RuntimeClassName = nil
pod.Spec.PreemptionPolicy = nil
}
if node, ok := obj.(*v1.Node); ok {
node.Status.Images = nil
}
return obj, nil
}

func newDescheduler(ctx context.Context, rs *options.DeschedulerServer, deschedulerPolicy *api.DeschedulerPolicy, evictionPolicyGroupVersion string, eventRecorder events.EventRecorder, sharedInformerFactory, namespacedSharedInformerFactory informers.SharedInformerFactory) (*descheduler, error) {
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()

Expand Down Expand Up @@ -585,7 +640,7 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
ctx, span = tracing.Tracer().Start(ctx, "RunDeschedulerStrategies")
defer span.End()

sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(trimManagedFields))
sharedInformerFactory := informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(preserveNeeded))

var nodeSelector string
if deschedulerPolicy.NodeSelector != nil {
Expand All @@ -608,7 +663,7 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
if prometheusProvider != nil && prometheusProvider.Prometheus != nil && prometheusProvider.Prometheus.URL != "" {
if prometheusProvider.Prometheus.AuthToken != nil {
// Will get reconciled
namespacedSharedInformerFactory = informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(trimManagedFields), informers.WithNamespace(prometheusProvider.Prometheus.AuthToken.SecretReference.Namespace))
namespacedSharedInformerFactory = informers.NewSharedInformerFactoryWithOptions(rs.Client, 0, informers.WithTransform(preserveNeeded), informers.WithNamespace(prometheusProvider.Prometheus.AuthToken.SecretReference.Namespace))
metricProviderTokenReconciliation = secretReconciliation
} else {
// Use the sa token and assume it has the sufficient permissions to authenticate
Expand Down Expand Up @@ -711,10 +766,3 @@ func createClients(clientConnection componentbaseconfig.ClientConnectionConfigur

return kClient, eventClient, nil
}

func trimManagedFields(obj interface{}) (interface{}, error) {
if accessor, err := meta.Accessor(obj); err == nil {
accessor.SetManagedFields(nil)
}
return obj, nil
}
2 changes: 1 addition & 1 deletion pkg/descheduler/descheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ func initDescheduler(t *testing.T, ctx context.Context, featureGates featuregate
rs.DefaultFeatureGates = featureGates
rs.MetricsClient = metricsClient

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

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