diff --git a/cmd/karmada-search/app/options/options.go b/cmd/karmada-search/app/options/options.go index 1d20d6bf2..61c0f7912 100644 --- a/cmd/karmada-search/app/options/options.go +++ b/cmd/karmada-search/app/options/options.go @@ -47,6 +47,9 @@ type Options struct { KubeAPIBurst int ProfileOpts profileflag.Options + + DisableSearch bool + DisableProxy bool } // NewOptions returns a new Options. @@ -69,6 +72,8 @@ func (o *Options) AddFlags(flags *pflag.FlagSet) { flags.Float32Var(&o.KubeAPIQPS, "kube-api-qps", 40.0, "QPS to use while talking with karmada-apiserver. Doesn't cover events and node heartbeat apis which rate limiting is controlled by a different set of flags.") flags.IntVar(&o.KubeAPIBurst, "kube-api-burst", 60, "Burst to use while talking with karmada-apiserver. Doesn't cover events and node heartbeat apis which rate limiting is controlled by a different set of flags.") + flags.BoolVar(&o.DisableSearch, "disable-search", false, "Disable search feature that would save memory usage significantly.") + flags.BoolVar(&o.DisableProxy, "disable-proxy", false, "Disable proxy feature that would save memory usage significantly.") utilfeature.DefaultMutableFeatureGate.AddFlag(flags) o.ProfileOpts.AddFlags(flags) @@ -101,25 +106,29 @@ func (o *Options) Run(ctx context.Context) error { }) server.GenericAPIServer.AddPostStartHookOrDie("start-karmada-informers", func(context genericapiserver.PostStartHookContext) error { - config.KarmadaSharedInformerFactory.Start(context.StopCh) + config.ExtraConfig.KarmadaSharedInformerFactory.Start(context.StopCh) return nil }) - server.GenericAPIServer.AddPostStartHookOrDie("start-karmada-search-controller", func(context genericapiserver.PostStartHookContext) error { - // start ResourceRegistry controller - config.Controller.Start(context.StopCh) - return nil - }) + if config.ExtraConfig.Controller != nil { + server.GenericAPIServer.AddPostStartHookOrDie("start-karmada-search-controller", func(context genericapiserver.PostStartHookContext) error { + // start ResourceRegistry controller + config.ExtraConfig.Controller.Start(context.StopCh) + return nil + }) + } - server.GenericAPIServer.AddPostStartHookOrDie("start-karmada-proxy-controller", func(context genericapiserver.PostStartHookContext) error { - config.ProxyController.Start(context.StopCh) - return nil - }) + if config.ExtraConfig.ProxyController != nil { + server.GenericAPIServer.AddPostStartHookOrDie("start-karmada-proxy-controller", func(context genericapiserver.PostStartHookContext) error { + config.ExtraConfig.ProxyController.Start(context.StopCh) + return nil + }) - server.GenericAPIServer.AddPreShutdownHookOrDie("stop-karmada-proxy-controller", func() error { - config.ProxyController.Stop() - return nil - }) + server.GenericAPIServer.AddPreShutdownHookOrDie("stop-karmada-proxy-controller", func() error { + config.ExtraConfig.ProxyController.Stop() + return nil + }) + } return server.GenericAPIServer.PrepareRun().Run(ctx.Done()) } @@ -152,25 +161,33 @@ func (o *Options) Config() (*search.Config, error) { return nil, err } - ctl, err := search.NewController(serverConfig.ClientConfig) - if err != nil { - return nil, err - } - karmadaClient := karmadaclientset.NewForConfigOrDie(serverConfig.ClientConfig) factory := informerfactory.NewSharedInformerFactory(karmadaClient, 0) - proxyCtl, err := proxy.NewController(serverConfig.ClientConfig, restMapper, serverConfig.SharedInformerFactory, factory, - time.Second*time.Duration(serverConfig.Config.MinRequestTimeout)) - if err != nil { - return nil, err + var ctl *search.Controller + if !o.DisableSearch { + ctl, err = search.NewController(serverConfig.ClientConfig, factory, restMapper) + if err != nil { + return nil, err + } + } + + var proxyCtl *proxy.Controller + if !o.DisableProxy { + proxyCtl, err = proxy.NewController(serverConfig.ClientConfig, restMapper, serverConfig.SharedInformerFactory, factory, + time.Second*time.Duration(serverConfig.Config.MinRequestTimeout)) + if err != nil { + return nil, err + } } config := &search.Config{ - GenericConfig: serverConfig, - Controller: ctl, - ProxyController: proxyCtl, - KarmadaSharedInformerFactory: factory, + GenericConfig: serverConfig, + ExtraConfig: search.ExtraConfig{ + KarmadaSharedInformerFactory: factory, + Controller: ctl, + ProxyController: proxyCtl, + }, } return config, nil } diff --git a/pkg/search/apiserver.go b/pkg/search/apiserver.go index 5e31f1812..a27fddfb7 100644 --- a/pkg/search/apiserver.go +++ b/pkg/search/apiserver.go @@ -9,27 +9,22 @@ import ( searchapis "github.com/karmada-io/karmada/pkg/apis/search" searchscheme "github.com/karmada-io/karmada/pkg/apis/search/scheme" informerfactory "github.com/karmada-io/karmada/pkg/generated/informers/externalversions" - clusterlister "github.com/karmada-io/karmada/pkg/generated/listers/cluster/v1alpha1" searchstorage "github.com/karmada-io/karmada/pkg/registry/search/storage" "github.com/karmada-io/karmada/pkg/search/proxy" - "github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager" ) // ExtraConfig holds custom apiserver config type ExtraConfig struct { - MultiClusterInformerManager genericmanager.MultiClusterInformerManager - ClusterLister clusterlister.ClusterLister KarmadaSharedInformerFactory informerfactory.SharedInformerFactory + Controller *Controller ProxyController *proxy.Controller // Add custom config if necessary. } // Config defines the config for the APIServer. type Config struct { - GenericConfig *genericapiserver.RecommendedConfig - Controller *Controller - ProxyController *proxy.Controller - KarmadaSharedInformerFactory informerfactory.SharedInformerFactory + GenericConfig *genericapiserver.RecommendedConfig + ExtraConfig ExtraConfig } // APIServer contains state for karmada-search. @@ -51,12 +46,7 @@ type CompletedConfig struct { func (cfg *Config) Complete() CompletedConfig { c := completedConfig{ cfg.GenericConfig.Complete(), - &ExtraConfig{ - MultiClusterInformerManager: cfg.Controller.InformerManager, - ClusterLister: cfg.Controller.clusterLister, - KarmadaSharedInformerFactory: cfg.KarmadaSharedInformerFactory, - ProxyController: cfg.ProxyController, - }, + &cfg.ExtraConfig, } c.GenericConfig.Version = &version.Info{ @@ -84,14 +74,21 @@ func (c completedConfig) New() (*APIServer, error) { klog.Errorf("unable to create REST storage for a resource due to %v, will die", err) return nil, err } - searchREST := searchstorage.NewSearchREST(c.ExtraConfig.MultiClusterInformerManager, c.ExtraConfig.ClusterLister) - proxyingREST := searchstorage.NewProxyingREST(c.ExtraConfig.ProxyController) v1alpha1search := map[string]rest.Storage{} v1alpha1search["resourceregistries"] = resourceRegistryStorage.ResourceRegistry v1alpha1search["resourceregistries/status"] = resourceRegistryStorage.Status - v1alpha1search["search"] = searchREST - v1alpha1search["proxying"] = proxyingREST + + if c.ExtraConfig.Controller != nil { + searchREST := searchstorage.NewSearchREST(c.ExtraConfig.Controller.InformerManager, c.ExtraConfig.Controller.clusterLister) + v1alpha1search["search"] = searchREST + } + + if c.ExtraConfig.ProxyController != nil { + proxyingREST := searchstorage.NewProxyingREST(c.ExtraConfig.ProxyController) + v1alpha1search["proxying"] = proxyingREST + } + apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1search if err = server.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { diff --git a/pkg/search/controller.go b/pkg/search/controller.go index d8c42cd13..ef372c0e1 100644 --- a/pkg/search/controller.go +++ b/pkg/search/controller.go @@ -21,7 +21,6 @@ import ( clusterV1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1" policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1" searchv1alpha1 "github.com/karmada-io/karmada/pkg/apis/search/v1alpha1" - karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned" informerfactory "github.com/karmada-io/karmada/pkg/generated/informers/externalversions" clusterlister "github.com/karmada-io/karmada/pkg/generated/listers/cluster/v1alpha1" "github.com/karmada-io/karmada/pkg/search/backendstore" @@ -57,16 +56,8 @@ type Controller struct { } // NewController returns a new ResourceRegistry controller -func NewController(restConfig *rest.Config) (*Controller, error) { - karmadaClient := karmadaclientset.NewForConfigOrDie(restConfig) - factory := informerfactory.NewSharedInformerFactory(karmadaClient, 0) +func NewController(restConfig *rest.Config, factory informerfactory.SharedInformerFactory, restMapper meta.RESTMapper) (*Controller, error) { clusterLister := factory.Cluster().V1alpha1().Clusters().Lister() - restMapper, err := restmapper.MapperProvider(restConfig) - if err != nil { - klog.Errorf("Failed to create REST mapper: %v", err) - return nil, err - } - queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) c := &Controller{ @@ -115,7 +106,6 @@ func (c *Controller) Start(stopCh <-chan struct{}) { defer runtime.HandleCrash() - c.informerFactory.Start(stopCh) c.informerFactory.WaitForCacheSync(stopCh) go wait.Until(c.worker, time.Second, stopCh)