Skip to content

Commit b4db964

Browse files
authored
Merge pull request kubernetes#88002 from alculquicondor/rm_affinity_weight_2
Remove HardPodAffinitySymmetricWeight from v1alpha2 Component Config
2 parents a53b25a + 99bda6f commit b4db964

File tree

28 files changed

+469
-337
lines changed

28 files changed

+469
-337
lines changed

cmd/kube-scheduler/app/options/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ go_library(
2121
"//pkg/scheduler/apis/config/v1alpha1:go_default_library",
2222
"//pkg/scheduler/apis/config/v1alpha2:go_default_library",
2323
"//pkg/scheduler/apis/config/validation:go_default_library",
24+
"//pkg/scheduler/framework/plugins:go_default_library",
25+
"//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library",
2426
"//staging/src/k8s.io/api/core/v1:go_default_library",
2527
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2628
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",

cmd/kube-scheduler/app/options/deprecated.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,24 @@ import (
2020
"fmt"
2121

2222
"github.com/spf13/pflag"
23-
2423
"k8s.io/apimachinery/pkg/util/validation/field"
2524
"k8s.io/kubernetes/pkg/scheduler/algorithmprovider"
2625
kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
26+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins"
27+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/interpodaffinity"
2728
)
2829

2930
// DeprecatedOptions contains deprecated options and their flags.
3031
// TODO remove these fields once the deprecated flags are removed.
3132
type DeprecatedOptions struct {
3233
// The fields below here are placeholders for flags that can't be directly
3334
// mapped into componentconfig.KubeSchedulerConfiguration.
34-
PolicyConfigFile string
35-
PolicyConfigMapName string
36-
PolicyConfigMapNamespace string
37-
UseLegacyPolicyConfig bool
38-
AlgorithmProvider string
35+
PolicyConfigFile string
36+
PolicyConfigMapName string
37+
PolicyConfigMapNamespace string
38+
UseLegacyPolicyConfig bool
39+
AlgorithmProvider string
40+
HardPodAffinitySymmetricWeight int32
3941
}
4042

4143
// AddFlags adds flags for the deprecated options.
@@ -61,7 +63,7 @@ func (o *DeprecatedOptions) AddFlags(fs *pflag.FlagSet, cfg *kubeschedulerconfig
6163
fs.StringVar(&cfg.LeaderElection.ResourceNamespace, "lock-object-namespace", cfg.LeaderElection.ResourceNamespace, "DEPRECATED: define the namespace of the lock object. Will be removed in favor of leader-elect-resource-namespace.")
6264
fs.StringVar(&cfg.LeaderElection.ResourceName, "lock-object-name", cfg.LeaderElection.ResourceName, "DEPRECATED: define the name of the lock object. Will be removed in favor of leader-elect-resource-name")
6365

64-
fs.Int32Var(&cfg.HardPodAffinitySymmetricWeight, "hard-pod-affinity-symmetric-weight", cfg.HardPodAffinitySymmetricWeight,
66+
fs.Int32Var(&o.HardPodAffinitySymmetricWeight, "hard-pod-affinity-symmetric-weight", interpodaffinity.DefaultHardPodAffinityWeight,
6567
"DEPRECATED: RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule corresponding "+
6668
"to every RequiredDuringScheduling affinity rule. --hard-pod-affinity-symmetric-weight represents the weight of implicit PreferredDuringScheduling affinity rule. Must be in the range 0-100."+
6769
"This option was moved to the policy configuration file")
@@ -76,6 +78,11 @@ func (o *DeprecatedOptions) Validate() []error {
7678
if o.UseLegacyPolicyConfig && len(o.PolicyConfigFile) == 0 {
7779
errs = append(errs, field.Required(field.NewPath("policyConfigFile"), "required when --use-legacy-policy-config is true"))
7880
}
81+
82+
if err := interpodaffinity.ValidateHardPodAffinityWeight(field.NewPath("hardPodAffinitySymmetricWeight"), o.HardPodAffinitySymmetricWeight); err != nil {
83+
errs = append(errs, err)
84+
}
85+
7986
return errs
8087
}
8188

@@ -113,5 +120,12 @@ func (o *DeprecatedOptions) ApplyTo(cfg *kubeschedulerconfig.KubeSchedulerConfig
113120
}
114121
}
115122

123+
if o.HardPodAffinitySymmetricWeight != interpodaffinity.DefaultHardPodAffinityWeight {
124+
args := interpodaffinity.Args{
125+
HardPodAffinityWeight: &o.HardPodAffinitySymmetricWeight,
126+
}
127+
cfg.PluginConfig = append(cfg.PluginConfig, plugins.NewPluginConfig(interpodaffinity.Name, args))
128+
}
129+
116130
return nil
117131
}

cmd/kube-scheduler/app/options/deprecated_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func TestValidateDeprecatedKubeSchedulerConfiguration(t *testing.T) {
2626
config *DeprecatedOptions
2727
}{
2828
"good": {
29-
expectedToFail: false,
3029
config: &DeprecatedOptions{
3130
PolicyConfigFile: "/some/file",
3231
UseLegacyPolicyConfig: true,
@@ -41,6 +40,17 @@ func TestValidateDeprecatedKubeSchedulerConfiguration(t *testing.T) {
4140
AlgorithmProvider: "",
4241
},
4342
},
43+
"good affinity weight": {
44+
config: &DeprecatedOptions{
45+
HardPodAffinitySymmetricWeight: 50,
46+
},
47+
},
48+
"bad affinity weight": {
49+
expectedToFail: true,
50+
config: &DeprecatedOptions{
51+
HardPodAffinitySymmetricWeight: -1,
52+
},
53+
},
4454
}
4555

4656
for name, scenario := range scenarios {

cmd/kube-scheduler/app/options/options_test.go

Lines changed: 137 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,18 @@ leaderElection:
134134
t.Fatal(err)
135135
}
136136

137+
v1alpha1Config := filepath.Join(tmpDir, "kubeconfig_v1alpha1.yaml")
138+
if err := ioutil.WriteFile(v1alpha1Config, []byte(fmt.Sprintf(`
139+
apiVersion: kubescheduler.config.k8s.io/v1alpha1
140+
kind: KubeSchedulerConfiguration
141+
clientConnection:
142+
kubeconfig: "%s"
143+
leaderElection:
144+
leaderElect: true
145+
hardPodAffinitySymmetricWeight: 3`, configKubeconfig)), os.FileMode(0600)); err != nil {
146+
t.Fatal(err)
147+
}
148+
137149
unknownFieldConfigLenient := filepath.Join(tmpDir, "scheduler_invalid_unknown_field_lenient.yaml")
138150
if err := ioutil.WriteFile(unknownFieldConfigLenient, []byte(fmt.Sprintf(`
139151
apiVersion: kubescheduler.config.k8s.io/v1alpha1
@@ -307,11 +319,10 @@ plugins:
307319
},
308320
expectedUsername: "config",
309321
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
310-
SchedulerName: "default-scheduler",
311-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
312-
HardPodAffinitySymmetricWeight: 1,
313-
HealthzBindAddress: "0.0.0.0:10251",
314-
MetricsBindAddress: "0.0.0.0:10251",
322+
SchedulerName: "default-scheduler",
323+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
324+
HealthzBindAddress: "0.0.0.0:10251",
325+
MetricsBindAddress: "0.0.0.0:10251",
315326
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
316327
EnableProfiling: true,
317328
EnableContentionProfiling: true,
@@ -399,11 +410,10 @@ plugins:
399410
},
400411
expectedUsername: "flag",
401412
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
402-
SchedulerName: "default-scheduler",
403-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
404-
HardPodAffinitySymmetricWeight: 1,
405-
HealthzBindAddress: "", // defaults empty when not running from config file
406-
MetricsBindAddress: "", // defaults empty when not running from config file
413+
SchedulerName: "default-scheduler",
414+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
415+
HealthzBindAddress: "", // defaults empty when not running from config file
416+
MetricsBindAddress: "", // defaults empty when not running from config file
407417
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
408418
EnableProfiling: true,
409419
EnableContentionProfiling: true,
@@ -464,11 +474,10 @@ plugins:
464474
},
465475
},
466476
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
467-
SchedulerName: "default-scheduler",
468-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
469-
HardPodAffinitySymmetricWeight: 1,
470-
HealthzBindAddress: "", // defaults empty when not running from config file
471-
MetricsBindAddress: "", // defaults empty when not running from config file
477+
SchedulerName: "default-scheduler",
478+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
479+
HealthzBindAddress: "", // defaults empty when not running from config file
480+
MetricsBindAddress: "", // defaults empty when not running from config file
472481
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
473482
EnableProfiling: true,
474483
EnableContentionProfiling: true,
@@ -504,11 +513,10 @@ plugins:
504513
},
505514
expectedUsername: "config",
506515
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
507-
SchedulerName: "default-scheduler",
508-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
509-
HardPodAffinitySymmetricWeight: 1,
510-
HealthzBindAddress: "0.0.0.0:10251",
511-
MetricsBindAddress: "0.0.0.0:10251",
516+
SchedulerName: "default-scheduler",
517+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
518+
HealthzBindAddress: "0.0.0.0:10251",
519+
MetricsBindAddress: "0.0.0.0:10251",
512520
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
513521
EnableProfiling: true,
514522
EnableContentionProfiling: true,
@@ -578,11 +586,10 @@ plugins:
578586
},
579587
expectedUsername: "config",
580588
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
581-
SchedulerName: "default-scheduler",
582-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
583-
HardPodAffinitySymmetricWeight: 1,
584-
HealthzBindAddress: "0.0.0.0:10251",
585-
MetricsBindAddress: "0.0.0.0:10251",
589+
SchedulerName: "default-scheduler",
590+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
591+
HealthzBindAddress: "0.0.0.0:10251",
592+
MetricsBindAddress: "0.0.0.0:10251",
586593
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
587594
EnableProfiling: true,
588595
EnableContentionProfiling: true,
@@ -632,21 +639,114 @@ plugins:
632639
options: &Options{},
633640
expectedError: "no configuration has been provided",
634641
},
642+
{
643+
name: "Deprecated HardPodAffinitySymmetricWeight",
644+
options: &Options{
645+
ComponentConfig: func() kubeschedulerconfig.KubeSchedulerConfiguration {
646+
cfg, _ := newDefaultComponentConfig()
647+
cfg.ClientConnection.Kubeconfig = flagKubeconfig
648+
return *cfg
649+
}(),
650+
Deprecated: &DeprecatedOptions{
651+
HardPodAffinitySymmetricWeight: 5,
652+
},
653+
},
654+
expectedUsername: "flag",
655+
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
656+
SchedulerName: "default-scheduler",
657+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
658+
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
659+
EnableProfiling: true,
660+
EnableContentionProfiling: true,
661+
},
662+
LeaderElection: kubeschedulerconfig.KubeSchedulerLeaderElectionConfiguration{
663+
LeaderElectionConfiguration: componentbaseconfig.LeaderElectionConfiguration{
664+
LeaderElect: true,
665+
LeaseDuration: metav1.Duration{Duration: 15 * time.Second},
666+
RenewDeadline: metav1.Duration{Duration: 10 * time.Second},
667+
RetryPeriod: metav1.Duration{Duration: 2 * time.Second},
668+
ResourceLock: "endpointsleases",
669+
ResourceNamespace: "kube-system",
670+
ResourceName: "kube-scheduler",
671+
},
672+
},
673+
ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
674+
Kubeconfig: flagKubeconfig,
675+
QPS: 50,
676+
Burst: 100,
677+
ContentType: "application/vnd.kubernetes.protobuf",
678+
},
679+
PercentageOfNodesToScore: defaultPercentageOfNodesToScore,
680+
BindTimeoutSeconds: defaultBindTimeoutSeconds,
681+
PodInitialBackoffSeconds: defaultPodInitialBackoffSeconds,
682+
PodMaxBackoffSeconds: defaultPodMaxBackoffSeconds,
683+
PluginConfig: []kubeschedulerconfig.PluginConfig{
684+
{
685+
Name: "InterPodAffinity",
686+
Args: runtime.Unknown{
687+
Raw: []byte(`{"hardPodAffinityWeight":5}`),
688+
},
689+
},
690+
},
691+
},
692+
},
693+
{
694+
name: "v1alpha1 config with HardPodAffinitySymmetricWeight",
695+
options: &Options{
696+
ConfigFile: v1alpha1Config,
697+
},
698+
expectedUsername: "config",
699+
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
700+
SchedulerName: "default-scheduler",
701+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
702+
HealthzBindAddress: "0.0.0.0:10251",
703+
MetricsBindAddress: "0.0.0.0:10251",
704+
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
705+
EnableProfiling: true,
706+
EnableContentionProfiling: true,
707+
},
708+
LeaderElection: kubeschedulerconfig.KubeSchedulerLeaderElectionConfiguration{
709+
LeaderElectionConfiguration: componentbaseconfig.LeaderElectionConfiguration{
710+
LeaderElect: true,
711+
LeaseDuration: metav1.Duration{Duration: 15 * time.Second},
712+
RenewDeadline: metav1.Duration{Duration: 10 * time.Second},
713+
RetryPeriod: metav1.Duration{Duration: 2 * time.Second},
714+
ResourceLock: "endpointsleases",
715+
ResourceNamespace: "kube-system",
716+
ResourceName: "kube-scheduler",
717+
},
718+
},
719+
ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
720+
Kubeconfig: configKubeconfig,
721+
QPS: 50,
722+
Burst: 100,
723+
ContentType: "application/vnd.kubernetes.protobuf",
724+
},
725+
PercentageOfNodesToScore: defaultPercentageOfNodesToScore,
726+
BindTimeoutSeconds: defaultBindTimeoutSeconds,
727+
PodInitialBackoffSeconds: defaultPodInitialBackoffSeconds,
728+
PodMaxBackoffSeconds: defaultPodMaxBackoffSeconds,
729+
PluginConfig: []kubeschedulerconfig.PluginConfig{
730+
{
731+
Name: "InterPodAffinity",
732+
Args: runtime.Unknown{
733+
Raw: []byte(`{"hardPodAffinityWeight":3}`),
734+
},
735+
},
736+
},
737+
},
738+
},
635739
{
636740
name: "unknown field lenient (v1alpha1)",
637741
options: &Options{
638742
ConfigFile: unknownFieldConfigLenient,
639743
},
640-
// TODO (obitech): Remove this comment and add a new test for v1alpha2, when it's available, as this should fail then.
641-
// expectedError: "found unknown field: foo",
642-
// checkErrFn: runtime.IsStrictDecodingError,
643744
expectedUsername: "config",
644745
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
645-
SchedulerName: "default-scheduler",
646-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
647-
HardPodAffinitySymmetricWeight: 1,
648-
HealthzBindAddress: "0.0.0.0:10251",
649-
MetricsBindAddress: "0.0.0.0:10251",
746+
SchedulerName: "default-scheduler",
747+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
748+
HealthzBindAddress: "0.0.0.0:10251",
749+
MetricsBindAddress: "0.0.0.0:10251",
650750
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
651751
EnableProfiling: true,
652752
EnableContentionProfiling: true,
@@ -688,16 +788,12 @@ plugins:
688788
options: &Options{
689789
ConfigFile: duplicateFieldConfigLenient,
690790
},
691-
// TODO (obitech): Remove this comment and add a new test for v1alpha2, when it's available, as this should fail then.
692-
// expectedError: `key "leaderElect" already set`,
693-
// checkErrFn: runtime.IsStrictDecodingError,
694791
expectedUsername: "config",
695792
expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
696-
SchedulerName: "default-scheduler",
697-
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
698-
HardPodAffinitySymmetricWeight: 1,
699-
HealthzBindAddress: "0.0.0.0:10251",
700-
MetricsBindAddress: "0.0.0.0:10251",
793+
SchedulerName: "default-scheduler",
794+
AlgorithmSource: kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &defaultSource},
795+
HealthzBindAddress: "0.0.0.0:10251",
796+
MetricsBindAddress: "0.0.0.0:10251",
701797
DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
702798
EnableProfiling: true,
703799
EnableContentionProfiling: true,

cmd/kube-scheduler/app/server.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ func Run(ctx context.Context, cc schedulerserverconfig.CompletedConfig, outOfTre
188188
ctx.Done(),
189189
scheduler.WithName(cc.ComponentConfig.SchedulerName),
190190
scheduler.WithAlgorithmSource(cc.ComponentConfig.AlgorithmSource),
191-
scheduler.WithHardPodAffinitySymmetricWeight(cc.ComponentConfig.HardPodAffinitySymmetricWeight),
192191
scheduler.WithPreemptionDisabled(cc.ComponentConfig.DisablePreemption),
193192
scheduler.WithPercentageOfNodesToScore(cc.ComponentConfig.PercentageOfNodesToScore),
194193
scheduler.WithBindTimeoutSeconds(cc.ComponentConfig.BindTimeoutSeconds),

pkg/scheduler/apis/config/types.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ type KubeSchedulerConfiguration struct {
5151
SchedulerName string
5252
// AlgorithmSource specifies the scheduler algorithm source.
5353
AlgorithmSource SchedulerAlgorithmSource
54-
// RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule
55-
// corresponding to every RequiredDuringScheduling affinity rule.
56-
// HardPodAffinitySymmetricWeight represents the weight of implicit PreferredDuringScheduling affinity rule, in the range [0-100].
57-
HardPodAffinitySymmetricWeight int32
5854

5955
// LeaderElection defines the configuration of leader election client.
6056
LeaderElection KubeSchedulerLeaderElectionConfiguration

pkg/scheduler/apis/config/v1alpha1/BUILD

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ go_library(
1717
"//pkg/apis/core:go_default_library",
1818
"//pkg/master/ports:go_default_library",
1919
"//pkg/scheduler/apis/config:go_default_library",
20+
"//pkg/scheduler/framework/plugins:go_default_library",
21+
"//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library",
2022
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2123
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
2224
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
@@ -38,7 +40,6 @@ go_test(
3840
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
3941
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
4042
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
41-
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
4243
"//staging/src/k8s.io/component-base/config:go_default_library",
4344
"//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library",
4445
"//staging/src/k8s.io/kube-scheduler/config/v1alpha1:go_default_library",

0 commit comments

Comments
 (0)