mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-12-08 02:15:27 +00:00
Add PodTopologySpread plugin arg types to kube-scheduler.config.k8s.io
This commit is contained in:
@@ -24,6 +24,7 @@ go_library(
|
||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
|
||||
"//staging/src/k8s.io/kube-scheduler/config/v1alpha2:go_default_library",
|
||||
"//vendor/k8s.io/klog:go_default_library",
|
||||
],
|
||||
)
|
||||
@@ -49,6 +50,7 @@ go_test(
|
||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||
"//staging/src/k8s.io/kube-scheduler/config/v1alpha2:go_default_library",
|
||||
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
|
||||
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||
],
|
||||
|
||||
@@ -42,7 +42,7 @@ type topologySpreadConstraint struct {
|
||||
// .DefaultConstraints and the selectors from the services, replication
|
||||
// controllers, replica sets and stateful sets that match the pod.
|
||||
func (pl *PodTopologySpread) defaultConstraints(p *v1.Pod, action v1.UnsatisfiableConstraintAction) ([]topologySpreadConstraint, error) {
|
||||
constraints, err := filterTopologySpreadConstraints(pl.DefaultConstraints, action)
|
||||
constraints, err := filterTopologySpreadConstraints(pl.args.DefaultConstraints, action)
|
||||
if err != nil || len(constraints) == 0 {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/client-go/informers"
|
||||
"k8s.io/client-go/kubernetes/fake"
|
||||
schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/parallelize"
|
||||
@@ -517,7 +518,7 @@ func TestPreFilterState(t *testing.T) {
|
||||
informerFactory := informers.NewSharedInformerFactory(fake.NewSimpleClientset(tt.objs...), 0)
|
||||
pl := PodTopologySpread{
|
||||
sharedLister: cache.NewSnapshot(tt.existingPods, tt.nodes),
|
||||
Args: Args{
|
||||
args: schedulerv1alpha2.PodTopologySpreadArgs{
|
||||
DefaultConstraints: tt.defaultConstraints,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ package podtopologyspread
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
"k8s.io/client-go/informers"
|
||||
appslisters "k8s.io/client-go/listers/apps/v1"
|
||||
corelisters "k8s.io/client-go/listers/core/v1"
|
||||
schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
)
|
||||
|
||||
@@ -39,22 +40,9 @@ var (
|
||||
supportedScheduleActions = sets.NewString(string(v1.DoNotSchedule), string(v1.ScheduleAnyway))
|
||||
)
|
||||
|
||||
// Args holds the arguments to configure the plugin.
|
||||
type Args struct {
|
||||
// DefaultConstraints defines topology spread constraints to be applied to
|
||||
// pods that don't define any in `pod.spec.topologySpreadConstraints`.
|
||||
// `topologySpreadConstraint.labelSelectors` must be empty, as they are
|
||||
// deduced the pods' membership to Services, Replication Controllers, Replica
|
||||
// Sets or Stateful Sets.
|
||||
// Empty by default.
|
||||
// +optional
|
||||
// +listType=atomic
|
||||
DefaultConstraints []v1.TopologySpreadConstraint `json:"defaultConstraints"`
|
||||
}
|
||||
|
||||
// PodTopologySpread is a plugin that ensures pod's topologySpreadConstraints is satisfied.
|
||||
type PodTopologySpread struct {
|
||||
Args
|
||||
args schedulerv1alpha2.PodTopologySpreadArgs
|
||||
sharedLister framework.SharedLister
|
||||
services corelisters.ServiceLister
|
||||
replicationCtrls corelisters.ReplicationControllerLister
|
||||
@@ -79,7 +67,7 @@ func (pl *PodTopologySpread) Name() string {
|
||||
|
||||
// BuildArgs returns the arguments used to build the plugin.
|
||||
func (pl *PodTopologySpread) BuildArgs() interface{} {
|
||||
return pl.Args
|
||||
return pl.args
|
||||
}
|
||||
|
||||
// New initializes a new plugin and returns it.
|
||||
@@ -88,13 +76,13 @@ func New(args runtime.Object, h framework.FrameworkHandle) (framework.Plugin, er
|
||||
return nil, fmt.Errorf("SnapshotSharedlister is nil")
|
||||
}
|
||||
pl := &PodTopologySpread{sharedLister: h.SnapshotSharedLister()}
|
||||
if err := framework.DecodeInto(args, &pl.Args); err != nil {
|
||||
if err := framework.DecodeInto(args, &pl.args); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateArgs(&pl.Args); err != nil {
|
||||
if err := validateArgs(&pl.args); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(pl.DefaultConstraints) != 0 {
|
||||
if len(pl.args.DefaultConstraints) != 0 {
|
||||
if h.SharedInformerFactory() == nil {
|
||||
return nil, fmt.Errorf("SharedInformerFactory is nil")
|
||||
}
|
||||
@@ -113,7 +101,7 @@ func (pl *PodTopologySpread) setListers(factory informers.SharedInformerFactory)
|
||||
// validateArgs replicates the validation from
|
||||
// pkg/apis/core/validation.validateTopologySpreadConstraints.
|
||||
// This has the additional check for .labelSelector to be nil.
|
||||
func validateArgs(args *Args) error {
|
||||
func validateArgs(args *schedulerv1alpha2.PodTopologySpreadArgs) error {
|
||||
var allErrs field.ErrorList
|
||||
path := field.NewPath("defaultConstraints")
|
||||
for i, c := range args.DefaultConstraints {
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/client-go/informers"
|
||||
"k8s.io/client-go/kubernetes/fake"
|
||||
schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
|
||||
)
|
||||
@@ -34,7 +35,7 @@ func TestNew(t *testing.T) {
|
||||
name string
|
||||
args runtime.Unknown
|
||||
wantErr string
|
||||
wantArgs Args
|
||||
wantArgs schedulerv1alpha2.PodTopologySpreadArgs
|
||||
}{
|
||||
{name: "empty args"},
|
||||
{
|
||||
@@ -50,7 +51,7 @@ func TestNew(t *testing.T) {
|
||||
whenUnsatisfiable: "DoNotSchedule"
|
||||
`),
|
||||
},
|
||||
wantArgs: Args{
|
||||
wantArgs: schedulerv1alpha2.PodTopologySpreadArgs{
|
||||
DefaultConstraints: []v1.TopologySpreadConstraint{
|
||||
{
|
||||
MaxSkew: 1,
|
||||
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/client-go/informers"
|
||||
"k8s.io/client-go/kubernetes/fake"
|
||||
schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/parallelize"
|
||||
@@ -194,7 +195,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) {
|
||||
informerFactory := informers.NewSharedInformerFactory(fake.NewSimpleClientset(tt.objs...), 0)
|
||||
pl := PodTopologySpread{
|
||||
sharedLister: cache.NewSnapshot(nil, tt.nodes),
|
||||
Args: Args{
|
||||
args: schedulerv1alpha2.PodTopologySpreadArgs{
|
||||
DefaultConstraints: tt.defaultConstraints,
|
||||
},
|
||||
}
|
||||
@@ -728,7 +729,7 @@ func BenchmarkTestDefaultEvenPodsSpreadPriority(b *testing.B) {
|
||||
snapshot := cache.NewSnapshot(existingPods, allNodes)
|
||||
p := &PodTopologySpread{
|
||||
sharedLister: snapshot,
|
||||
Args: Args{
|
||||
args: schedulerv1alpha2.PodTopologySpreadArgs{
|
||||
DefaultConstraints: []v1.TopologySpreadConstraint{
|
||||
{MaxSkew: 1, TopologyKey: v1.LabelHostname, WhenUnsatisfiable: v1.ScheduleAnyway},
|
||||
{MaxSkew: 1, TopologyKey: v1.LabelZoneFailureDomain, WhenUnsatisfiable: v1.ScheduleAnyway},
|
||||
|
||||
Reference in New Issue
Block a user