diff --git a/cmd/scheduler/app/options/options.go b/cmd/scheduler/app/options/options.go index 0fe06bb0e..c66a82101 100644 --- a/cmd/scheduler/app/options/options.go +++ b/cmd/scheduler/app/options/options.go @@ -14,6 +14,7 @@ import ( "github.com/karmada-io/karmada/pkg/scheduler" frameworkplugins "github.com/karmada-io/karmada/pkg/scheduler/framework/plugins" "github.com/karmada-io/karmada/pkg/sharedcli/profileflag" + "github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag" "github.com/karmada-io/karmada/pkg/util" ) @@ -68,6 +69,9 @@ type Options struct { // SchedulerName represents the name of the scheduler. // default is "default-scheduler". SchedulerName string + + // RateLimiterOpts contains the options for rate limiter. + RateLimiterOpts ratelimiterflag.Options } // NewOptions builds an default scheduler options. @@ -111,4 +115,5 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&o.SchedulerName, "scheduler-name", scheduler.DefaultScheduler, "SchedulerName represents the name of the scheduler. default is 'default-scheduler'.") features.FeatureGate.AddFlag(fs) o.ProfileOpts.AddFlags(fs) + o.RateLimiterOpts.AddFlags(fs) } diff --git a/cmd/scheduler/app/scheduler.go b/cmd/scheduler/app/scheduler.go index c779ee542..69822c53d 100644 --- a/cmd/scheduler/app/scheduler.go +++ b/cmd/scheduler/app/scheduler.go @@ -159,6 +159,7 @@ func run(opts *options.Options, stopChan <-chan struct{}, registryOptions ...Opt scheduler.WithEnableEmptyWorkloadPropagation(opts.EnableEmptyWorkloadPropagation), scheduler.WithEnableSchedulerPlugin(opts.Plugins), scheduler.WithSchedulerName(opts.SchedulerName), + scheduler.WithRateLimiterOptions(opts.RateLimiterOpts), ) if err != nil { return fmt.Errorf("couldn't create scheduler: %w", err) diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index dc7b4d688..2ad65324b 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -37,6 +37,7 @@ import ( frameworkplugins "github.com/karmada-io/karmada/pkg/scheduler/framework/plugins" "github.com/karmada-io/karmada/pkg/scheduler/framework/runtime" "github.com/karmada-io/karmada/pkg/scheduler/metrics" + "github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag" "github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util/helper" utilmetrics "github.com/karmada-io/karmada/pkg/util/metrics" @@ -114,6 +115,8 @@ type schedulerOptions struct { outOfTreeRegistry runtime.Registry // plugins is the list of plugins to enable or disable plugins []string + // contains the options for rate limiter. + RateLimiterOptions ratelimiterflag.Options } // Option configures a Scheduler @@ -183,20 +186,26 @@ func WithOutOfTreeRegistry(registry runtime.Registry) Option { } } +// WithRateLimiterOptions sets the rateLimiterOptions for scheduler +func WithRateLimiterOptions(rateLimiterOptions ratelimiterflag.Options) Option { + return func(o *schedulerOptions) { + o.RateLimiterOptions = rateLimiterOptions + } +} + // NewScheduler instantiates a scheduler func NewScheduler(dynamicClient dynamic.Interface, karmadaClient karmadaclientset.Interface, kubeClient kubernetes.Interface, opts ...Option) (*Scheduler, error) { factory := informerfactory.NewSharedInformerFactory(karmadaClient, 0) bindingLister := factory.Work().V1alpha2().ResourceBindings().Lister() clusterBindingLister := factory.Work().V1alpha2().ClusterResourceBindings().Lister() clusterLister := factory.Cluster().V1alpha1().Clusters().Lister() - queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "scheduler-queue") schedulerCache := schedulercache.NewCache(clusterLister) options := schedulerOptions{} for _, opt := range opts { opt(&options) } - + queue := workqueue.NewRateLimitingQueueWithConfig(ratelimiterflag.DefaultControllerRateLimiter(options.RateLimiterOptions), workqueue.RateLimitingQueueConfig{Name: "scheduler-queue"}) registry := frameworkplugins.NewInTreeRegistry() if err := registry.Merge(options.outOfTreeRegistry); err != nil { return nil, err