mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-08 03:33:56 +00:00
move NodeLabel priority logic to its Score plugin
This commit is contained in:
parent
9fad2e3201
commit
22a0f55a68
@ -17,7 +17,6 @@ go_library(
|
||||
"metadata.go",
|
||||
"most_requested.go",
|
||||
"node_affinity.go",
|
||||
"node_label.go",
|
||||
"node_prefer_avoid_pods.go",
|
||||
"priorities.go",
|
||||
"reduce.go",
|
||||
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package priorities
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
|
||||
)
|
||||
|
||||
// NodeLabelPrioritizer contains information to calculate node label priority.
|
||||
type NodeLabelPrioritizer struct {
|
||||
presentLabelsPreference []string
|
||||
absentLabelsPreference []string
|
||||
}
|
||||
|
||||
// NewNodeLabelPriority creates a NodeLabelPrioritizer.
|
||||
func NewNodeLabelPriority(presentLabelsPreference []string, absentLabelsPreference []string) (PriorityMapFunction, PriorityReduceFunction) {
|
||||
labelPrioritizer := &NodeLabelPrioritizer{
|
||||
presentLabelsPreference: presentLabelsPreference,
|
||||
absentLabelsPreference: absentLabelsPreference,
|
||||
}
|
||||
return labelPrioritizer.CalculateNodeLabelPriorityMap, nil
|
||||
}
|
||||
|
||||
// CalculateNodeLabelPriorityMap checks whether a particular label exists on a node or not, regardless of its value.
|
||||
// If presence is true, prioritizes nodes that have the specified label, regardless of value.
|
||||
// If presence is false, prioritizes nodes that do not have the specified label.
|
||||
func (n *NodeLabelPrioritizer) CalculateNodeLabelPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulernodeinfo.NodeInfo) (framework.NodeScore, error) {
|
||||
node := nodeInfo.Node()
|
||||
if node == nil {
|
||||
return framework.NodeScore{}, fmt.Errorf("node not found")
|
||||
}
|
||||
|
||||
score := int64(0)
|
||||
for _, label := range n.presentLabelsPreference {
|
||||
if labels.Set(node.Labels).Has(label) {
|
||||
score += framework.MaxNodeScore
|
||||
}
|
||||
}
|
||||
for _, label := range n.absentLabelsPreference {
|
||||
if !labels.Set(node.Labels).Has(label) {
|
||||
score += framework.MaxNodeScore
|
||||
}
|
||||
}
|
||||
// Take average score for each label to ensure the score doesn't exceed MaxNodeScore.
|
||||
score /= int64(len(n.presentLabelsPreference) + len(n.absentLabelsPreference))
|
||||
|
||||
return framework.NodeScore{
|
||||
Name: node.Name,
|
||||
Score: score,
|
||||
}, nil
|
||||
}
|
@ -399,10 +399,7 @@ func RegisterCustomPriorityFunction(policy schedulerapi.PriorityPolicy, configPr
|
||||
schedulerFactoryMutex.RUnlock()
|
||||
pcf = &PriorityConfigFactory{
|
||||
MapReduceFunction: func(_ AlgorithmFactoryArgs) (priorities.PriorityMapFunction, priorities.PriorityReduceFunction) {
|
||||
return priorities.NewNodeLabelPriority(
|
||||
configProducerArgs.NodeLabelArgs.PresentLabelsPreference,
|
||||
configProducerArgs.NodeLabelArgs.AbsentLabelsPreference,
|
||||
)
|
||||
return nil, nil
|
||||
},
|
||||
Weight: weight,
|
||||
}
|
||||
|
@ -7,11 +7,11 @@ go_library(
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//pkg/scheduler/algorithm/predicates:go_default_library",
|
||||
"//pkg/scheduler/algorithm/priorities:go_default_library",
|
||||
"//pkg/scheduler/framework/plugins/migration:go_default_library",
|
||||
"//pkg/scheduler/framework/v1alpha1:go_default_library",
|
||||
"//pkg/scheduler/nodeinfo:go_default_library",
|
||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||
],
|
||||
)
|
||||
|
@ -21,9 +21,9 @@ import (
|
||||
"fmt"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
|
||||
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
"k8s.io/kubernetes/pkg/scheduler/nodeinfo"
|
||||
@ -60,8 +60,8 @@ func validateNoConflict(presentLabels []string, absentLabels []string) error {
|
||||
|
||||
// New initializes a new plugin and returns it.
|
||||
func New(plArgs *runtime.Unknown, handle framework.FrameworkHandle) (framework.Plugin, error) {
|
||||
args := &Args{}
|
||||
if err := framework.DecodeInto(plArgs, args); err != nil {
|
||||
args := Args{}
|
||||
if err := framework.DecodeInto(plArgs, &args); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateNoConflict(args.PresentLabels, args.AbsentLabels); err != nil {
|
||||
@ -70,20 +70,18 @@ func New(plArgs *runtime.Unknown, handle framework.FrameworkHandle) (framework.P
|
||||
if err := validateNoConflict(args.PresentLabelsPreference, args.AbsentLabelsPreference); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Note that the reduce function is always nil therefore it's ignored.
|
||||
prioritize, _ := priorities.NewNodeLabelPriority(args.PresentLabelsPreference, args.AbsentLabelsPreference)
|
||||
return &NodeLabel{
|
||||
handle: handle,
|
||||
predicate: predicates.NewNodeLabelPredicate(args.PresentLabels, args.AbsentLabels),
|
||||
prioritize: prioritize,
|
||||
handle: handle,
|
||||
predicate: predicates.NewNodeLabelPredicate(args.PresentLabels, args.AbsentLabels),
|
||||
Args: args,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NodeLabel checks whether a pod can fit based on the node labels which match a filter that it requests.
|
||||
type NodeLabel struct {
|
||||
handle framework.FrameworkHandle
|
||||
predicate predicates.FitPredicate
|
||||
prioritize priorities.PriorityMapFunction
|
||||
handle framework.FrameworkHandle
|
||||
predicate predicates.FitPredicate
|
||||
Args
|
||||
}
|
||||
|
||||
var _ framework.FilterPlugin = &NodeLabel{}
|
||||
@ -107,9 +105,23 @@ func (pl *NodeLabel) Score(ctx context.Context, state *framework.CycleState, pod
|
||||
if err != nil {
|
||||
return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err))
|
||||
}
|
||||
// Note that node label priority function doesn't use metadata, hence passing nil here.
|
||||
s, err := pl.prioritize(pod, nil, nodeInfo)
|
||||
return s.Score, migration.ErrorToFrameworkStatus(err)
|
||||
|
||||
node := nodeInfo.Node()
|
||||
score := int64(0)
|
||||
for _, label := range pl.PresentLabelsPreference {
|
||||
if labels.Set(node.Labels).Has(label) {
|
||||
score += framework.MaxNodeScore
|
||||
}
|
||||
}
|
||||
for _, label := range pl.AbsentLabelsPreference {
|
||||
if !labels.Set(node.Labels).Has(label) {
|
||||
score += framework.MaxNodeScore
|
||||
}
|
||||
}
|
||||
// Take average score for each label to ensure the score doesn't exceed MaxNodeScore.
|
||||
score /= int64(len(pl.PresentLabelsPreference) + len(pl.AbsentLabelsPreference))
|
||||
|
||||
return score, nil
|
||||
}
|
||||
|
||||
// ScoreExtensions of the Score plugin.
|
||||
|
Loading…
Reference in New Issue
Block a user