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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest not removing this c.Ports. The NodePorts plugin in the scheduler needs to use the container’s ports, and the related field values may be required during the node fit phase.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ack, I need some time to refact all as

func func (pl *Plugin) PreservedField() [] uint {
  return []uint {POD_COMMAND, POD_ARGS, ...}
}

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