From 4c9c761bbb2b41eeb907520a640917b735c022dc Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Mon, 5 Jul 2021 14:18:12 -0700 Subject: [PATCH] instantiates scheduler ComponentConfig after parsing feature gates --- cmd/kube-scheduler/app/options/deprecated.go | 2 +- cmd/kube-scheduler/app/options/options.go | 93 ++++++++++++++++---- cmd/kube-scheduler/app/server.go | 6 +- cmd/kube-scheduler/app/server_test.go | 19 ++-- cmd/kube-scheduler/app/testing/testserver.go | 6 +- pkg/scheduler/apis/config/latest/latest.go | 2 +- 6 files changed, 101 insertions(+), 27 deletions(-) diff --git a/cmd/kube-scheduler/app/options/deprecated.go b/cmd/kube-scheduler/app/options/deprecated.go index 4b176dd9efa..accac10c295 100644 --- a/cmd/kube-scheduler/app/options/deprecated.go +++ b/cmd/kube-scheduler/app/options/deprecated.go @@ -69,7 +69,7 @@ func (o *DeprecatedOptions) Validate() []error { return errs } -// ApplyPolicySourceTo sets cfg.PolicySource from flags passed on the command line in the following precedence order: +// ApplyTo sets cfg.PolicySource from flags passed on the command line in the following precedence order: // // 1. --use-legacy-policy-config to use a policy file. // 2. --policy-configmap to use a policy config map value. diff --git a/cmd/kube-scheduler/app/options/options.go b/cmd/kube-scheduler/app/options/options.go index 3986b5c8d3a..801cf7b7df1 100644 --- a/cmd/kube-scheduler/app/options/options.go +++ b/cmd/kube-scheduler/app/options/options.go @@ -71,28 +71,14 @@ type Options struct { // NewOptions returns default scheduler app options. func NewOptions() (*Options, error) { - cfg, err := latest.Default() - if err != nil { - return nil, err - } - - hhost, hport, err := splitHostIntPort(cfg.HealthzBindAddress) - if err != nil { - return nil, err - } - o := &Options{ - ComponentConfig: *cfg, - SecureServing: apiserveroptions.NewSecureServingOptions().WithLoopback(), + SecureServing: apiserveroptions.NewSecureServingOptions().WithLoopback(), CombinedInsecureServing: &CombinedInsecureServingOptions{ Healthz: (&apiserveroptions.DeprecatedInsecureServingOptions{ BindNetwork: "tcp", }).WithLoopback(), Metrics: (&apiserveroptions.DeprecatedInsecureServingOptions{ - BindNetwork: "tcp", - }).WithLoopback(), - BindPort: hport, - BindAddress: hhost, + BindNetwork: "tcp"}).WithLoopback(), }, Authentication: apiserveroptions.NewDelegatingAuthenticationOptions(), Authorization: apiserveroptions.NewDelegatingAuthorizationOptions(), @@ -116,6 +102,81 @@ func NewOptions() (*Options, error) { return o, nil } +// Complete completes the remaining instantiation of the options obj. +// In particular, it injects the latest internal versioned ComponentConfig. +func (o *Options) Complete(nfs *cliflag.NamedFlagSets) error { + cfg, err := latest.Default() + if err != nil { + return err + } + + hhost, hport, err := splitHostIntPort(cfg.HealthzBindAddress) + if err != nil { + return err + } + // Obtain CLI args related with insecure serving. + // If not specified in command line, derive the default settings from cfg. + insecureServing := nfs.FlagSet("insecure serving") + if !insecureServing.Changed("address") { + o.CombinedInsecureServing.BindAddress = hhost + } + if !insecureServing.Changed("port") { + o.CombinedInsecureServing.BindPort = hport + } + // Obtain deprecated CLI args. Set them to cfg if specified in command line. + deprecated := nfs.FlagSet("deprecated") + if deprecated.Changed("profiling") { + cfg.EnableProfiling = o.ComponentConfig.EnableProfiling + } + if deprecated.Changed("contention-profiling") { + cfg.EnableContentionProfiling = o.ComponentConfig.EnableContentionProfiling + } + if deprecated.Changed("kubeconfig") { + cfg.ClientConnection.Kubeconfig = o.ComponentConfig.ClientConnection.Kubeconfig + } + if deprecated.Changed("kube-api-content-type") { + cfg.ClientConnection.ContentType = o.ComponentConfig.ClientConnection.ContentType + } + if deprecated.Changed("kube-api-qps") { + cfg.ClientConnection.QPS = o.ComponentConfig.ClientConnection.QPS + } + if deprecated.Changed("kube-api-burst") { + cfg.ClientConnection.Burst = o.ComponentConfig.ClientConnection.Burst + } + if deprecated.Changed("lock-object-namespace") { + cfg.LeaderElection.ResourceNamespace = o.ComponentConfig.LeaderElection.ResourceNamespace + } + if deprecated.Changed("lock-object-name") { + cfg.LeaderElection.ResourceName = o.ComponentConfig.LeaderElection.ResourceName + } + // Obtain CLI args related with leaderelection. Set them to cfg if specified in command line. + leaderelection := nfs.FlagSet("leader election") + if leaderelection.Changed("leader-elect") { + cfg.LeaderElection.LeaderElect = o.ComponentConfig.LeaderElection.LeaderElect + } + if leaderelection.Changed("leader-elect-lease-duration") { + cfg.LeaderElection.LeaseDuration = o.ComponentConfig.LeaderElection.LeaseDuration + } + if leaderelection.Changed("leader-elect-renew-deadline") { + cfg.LeaderElection.RenewDeadline = o.ComponentConfig.LeaderElection.RenewDeadline + } + if leaderelection.Changed("leader-elect-retry-period") { + cfg.LeaderElection.RetryPeriod = o.ComponentConfig.LeaderElection.RetryPeriod + } + if leaderelection.Changed("leader-elect-resource-lock") { + cfg.LeaderElection.ResourceLock = o.ComponentConfig.LeaderElection.ResourceLock + } + if leaderelection.Changed("leader-elect-resource-name") { + cfg.LeaderElection.ResourceName = o.ComponentConfig.LeaderElection.ResourceName + } + if leaderelection.Changed("leader-elect-resource-namespace") { + cfg.LeaderElection.ResourceNamespace = o.ComponentConfig.LeaderElection.ResourceNamespace + } + + o.ComponentConfig = *cfg + return nil +} + func splitHostIntPort(s string) (string, int, error) { host, port, err := net.SplitHostPort(s) if err != nil { diff --git a/cmd/kube-scheduler/app/server.go b/cmd/kube-scheduler/app/server.go index dc6cc055415..0234379dac2 100644 --- a/cmd/kube-scheduler/app/server.go +++ b/cmd/kube-scheduler/app/server.go @@ -68,6 +68,7 @@ func NewSchedulerCommand(registryOptions ...Option) *cobra.Command { klog.Fatalf("unable to initialize command options: %v", err) } + namedFlagSets := opts.Flags() cmd := &cobra.Command{ Use: "kube-scheduler", Long: `The Kubernetes scheduler is a control plane process which assigns @@ -79,6 +80,10 @@ kube-scheduler is the reference implementation. See [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/) for more information about scheduling and the kube-scheduler component.`, Run: func(cmd *cobra.Command, args []string) { + if err := opts.Complete(&namedFlagSets); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } if err := runCommand(cmd, opts, registryOptions...); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) @@ -94,7 +99,6 @@ for more information about scheduling and the kube-scheduler component.`, }, } fs := cmd.Flags() - namedFlagSets := opts.Flags() verflag.AddFlags(namedFlagSets.FlagSet("global")) globalflag.AddGlobalFlags(namedFlagSets.FlagSet("global"), cmd.Name()) for _, f := range namedFlagSets.FlagSets { diff --git a/cmd/kube-scheduler/app/server_test.go b/cmd/kube-scheduler/app/server_test.go index 489bb6c3a24..bd121c21749 100644 --- a/cmd/kube-scheduler/app/server_test.go +++ b/cmd/kube-scheduler/app/server_test.go @@ -249,6 +249,18 @@ profiles: t.Fatal(err) } + nfs := opts.Flags() + for _, f := range nfs.FlagSets { + fs.AddFlagSet(f) + } + if err := fs.Parse(tc.flags); err != nil { + t.Fatal(err) + } + + if err := opts.Complete(&nfs); err != nil { + t.Fatal(err) + } + // use listeners instead of static ports so parallel test runs don't conflict opts.SecureServing.Listener = makeListener(t) defer opts.SecureServing.Listener.Close() @@ -257,13 +269,6 @@ profiles: opts.CombinedInsecureServing.Healthz.Listener = makeListener(t) defer opts.CombinedInsecureServing.Healthz.Listener.Close() - for _, f := range opts.Flags().FlagSets { - fs.AddFlagSet(f) - } - if err := fs.Parse(tc.flags); err != nil { - t.Fatal(err) - } - ctx, cancel := context.WithCancel(context.Background()) defer cancel() _, sched, err := Setup(ctx, opts) diff --git a/cmd/kube-scheduler/app/testing/testserver.go b/cmd/kube-scheduler/app/testing/testserver.go index 080f93ccdd4..b40da740cee 100644 --- a/cmd/kube-scheduler/app/testing/testserver.go +++ b/cmd/kube-scheduler/app/testing/testserver.go @@ -86,13 +86,17 @@ func StartTestServer(t Logger, customFlags []string) (result TestServer, err err if err != nil { return TestServer{}, err } + namedFlagSets := opts.Flags() for _, f := range namedFlagSets.FlagSets { fs.AddFlagSet(f) } - fs.Parse(customFlags) + if err := opts.Complete(&namedFlagSets); err != nil { + return TestServer{}, err + } + if opts.SecureServing.BindPort != 0 { opts.SecureServing.Listener, opts.SecureServing.BindPort, err = createListenerOnFreePort() if err != nil { diff --git a/pkg/scheduler/apis/config/latest/latest.go b/pkg/scheduler/apis/config/latest/latest.go index 7fd192646bf..b9fb3ff186b 100644 --- a/pkg/scheduler/apis/config/latest/latest.go +++ b/pkg/scheduler/apis/config/latest/latest.go @@ -23,7 +23,7 @@ import ( "k8s.io/kubernetes/pkg/scheduler/apis/config/scheme" ) -// Default creates a default configuration of the latset versioned type. +// Default creates a default configuration of the latest versioned type. // This function needs to be updated whenever we bump the scheduler's component config version. func Default() (*config.KubeSchedulerConfiguration, error) { versionedCfg := v1beta2.KubeSchedulerConfiguration{}