Merge pull request #103468 from Huang-Wei/fix-sched-cc

instantiates scheduler ComponentConfig after parsing feature gates
This commit is contained in:
Kubernetes Prow Robot 2021-07-07 01:22:43 -07:00 committed by GitHub
commit 17f6f28621
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 101 additions and 27 deletions

View File

@ -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.

View File

@ -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 {

View File

@ -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 {

View File

@ -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)

View File

@ -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 {

View File

@ -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{}