From 89867e1c21816d1b8bf909c3db6325c3bf3acbf0 Mon Sep 17 00:00:00 2001 From: zouyee Date: Thu, 26 Dec 2019 21:38:27 +0800 Subject: [PATCH] Move CheckNodeUnschedulable predicate to its filter plugin Signed-off-by: Zou Nengren --- .../algorithm/predicates/predicates.go | 20 ------ .../algorithm/predicates/predicates_test.go | 62 ------------------- .../framework/plugins/nodeunschedulable/BUILD | 2 +- .../nodeunschedulable/node_unschedulable.go | 17 ++++- 4 files changed, 15 insertions(+), 86 deletions(-) diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index de53026885a..e00a0776ee2 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -913,26 +913,6 @@ func GeneralPredicates(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.N return len(predicateFails) == 0, predicateFails, nil } -// CheckNodeUnschedulablePredicate checks if a pod can be scheduled on a node with Unschedulable spec. -func CheckNodeUnschedulablePredicate(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.NodeInfo) (bool, []PredicateFailureReason, error) { - if nodeInfo == nil || nodeInfo.Node() == nil { - return false, []PredicateFailureReason{ErrNodeUnknownCondition}, nil - } - - // If pod tolerate unschedulable taint, it's also tolerate `node.Spec.Unschedulable`. - podToleratesUnschedulable := v1helper.TolerationsTolerateTaint(pod.Spec.Tolerations, &v1.Taint{ - Key: v1.TaintNodeUnschedulable, - Effect: v1.TaintEffectNoSchedule, - }) - - // TODO (k82cn): deprecates `node.Spec.Unschedulable` in 1.13. - if nodeInfo.Node().Spec.Unschedulable && !podToleratesUnschedulable { - return false, []PredicateFailureReason{ErrNodeUnschedulable}, nil - } - - return true, nil, nil -} - // PodToleratesNodeTaints checks if a pod tolerations can tolerate the node taints. func PodToleratesNodeTaints(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.NodeInfo) (bool, []PredicateFailureReason, error) { if nodeInfo == nil || nodeInfo.Node() == nil { diff --git a/pkg/scheduler/algorithm/predicates/predicates_test.go b/pkg/scheduler/algorithm/predicates/predicates_test.go index cdb0f337198..f94e400fbdd 100644 --- a/pkg/scheduler/algorithm/predicates/predicates_test.go +++ b/pkg/scheduler/algorithm/predicates/predicates_test.go @@ -2120,65 +2120,3 @@ func TestGetMaxVols(t *testing.T) { os.Setenv(KubeMaxPDVols, previousValue) } } - -func TestCheckNodeUnschedulablePredicate(t *testing.T) { - testCases := []struct { - name string - pod *v1.Pod - node *v1.Node - fit bool - }{ - { - name: "Does not schedule pod to unschedulable node (node.Spec.Unschedulable==true)", - pod: &v1.Pod{}, - node: &v1.Node{ - Spec: v1.NodeSpec{ - Unschedulable: true, - }, - }, - fit: false, - }, - { - name: "Schedule pod to normal node", - pod: &v1.Pod{}, - node: &v1.Node{ - Spec: v1.NodeSpec{ - Unschedulable: false, - }, - }, - fit: true, - }, - { - name: "Schedule pod with toleration to unschedulable node (node.Spec.Unschedulable==true)", - pod: &v1.Pod{ - Spec: v1.PodSpec{ - Tolerations: []v1.Toleration{ - { - Key: v1.TaintNodeUnschedulable, - Effect: v1.TaintEffectNoSchedule, - }, - }, - }, - }, - node: &v1.Node{ - Spec: v1.NodeSpec{ - Unschedulable: true, - }, - }, - fit: true, - }, - } - - for _, test := range testCases { - nodeInfo := schedulernodeinfo.NewNodeInfo() - nodeInfo.SetNode(test.node) - fit, _, err := CheckNodeUnschedulablePredicate(test.pod, nil, nodeInfo) - if err != nil { - t.Fatalf("Failed to check node unschedulable: %v", err) - } - - if fit != test.fit { - t.Errorf("Unexpected fit: expected %v, got %v", test.fit, fit) - } - } -} diff --git a/pkg/scheduler/framework/plugins/nodeunschedulable/BUILD b/pkg/scheduler/framework/plugins/nodeunschedulable/BUILD index 76c1f649e14..c9b05effe45 100644 --- a/pkg/scheduler/framework/plugins/nodeunschedulable/BUILD +++ b/pkg/scheduler/framework/plugins/nodeunschedulable/BUILD @@ -6,8 +6,8 @@ go_library( importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeunschedulable", visibility = ["//visibility:public"], deps = [ + "//pkg/apis/core/v1/helper:go_default_library", "//pkg/scheduler/algorithm/predicates: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", diff --git a/pkg/scheduler/framework/plugins/nodeunschedulable/node_unschedulable.go b/pkg/scheduler/framework/plugins/nodeunschedulable/node_unschedulable.go index 749a6b07b28..9411d80159d 100644 --- a/pkg/scheduler/framework/plugins/nodeunschedulable/node_unschedulable.go +++ b/pkg/scheduler/framework/plugins/nodeunschedulable/node_unschedulable.go @@ -21,8 +21,8 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" - "k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" "k8s.io/kubernetes/pkg/scheduler/nodeinfo" ) @@ -44,8 +44,19 @@ func (pl *NodeUnschedulable) Name() string { // Filter invoked at the filter extension point. func (pl *NodeUnschedulable) Filter(ctx context.Context, _ *framework.CycleState, pod *v1.Pod, nodeInfo *nodeinfo.NodeInfo) *framework.Status { - _, reasons, err := predicates.CheckNodeUnschedulablePredicate(pod, nil, nodeInfo) - return migration.PredicateResultToFrameworkStatus(reasons, err) + if nodeInfo == nil || nodeInfo.Node() == nil { + return framework.NewStatus(framework.UnschedulableAndUnresolvable, predicates.ErrNodeUnknownCondition.GetReason()) + } + // If pod tolerate unschedulable taint, it's also tolerate `node.Spec.Unschedulable`. + podToleratesUnschedulable := v1helper.TolerationsTolerateTaint(pod.Spec.Tolerations, &v1.Taint{ + Key: v1.TaintNodeUnschedulable, + Effect: v1.TaintEffectNoSchedule, + }) + // TODO (k82cn): deprecates `node.Spec.Unschedulable` in 1.13. + if nodeInfo.Node().Spec.Unschedulable && !podToleratesUnschedulable { + return framework.NewStatus(framework.UnschedulableAndUnresolvable, predicates.ErrNodeUnschedulable.GetReason()) + } + return nil } // New initializes a new plugin and returns it.