feature(scheduler): more fine-grained QHints for nodeunschedulable plugin

This commit is contained in:
googs1025 2024-09-18 23:18:56 +08:00
parent e367afe3bb
commit 86aee8cbc7
2 changed files with 28 additions and 6 deletions

View File

@ -61,19 +61,20 @@ func (pl *NodeUnschedulable) EventsToRegister(_ context.Context) ([]framework.Cl
// an informer. It checks whether that change made a previously unschedulable // an informer. It checks whether that change made a previously unschedulable
// pod schedulable. // pod schedulable.
func (pl *NodeUnschedulable) isSchedulableAfterNodeChange(logger klog.Logger, pod *v1.Pod, oldObj, newObj interface{}) (framework.QueueingHint, error) { func (pl *NodeUnschedulable) isSchedulableAfterNodeChange(logger klog.Logger, pod *v1.Pod, oldObj, newObj interface{}) (framework.QueueingHint, error) {
_, modifiedNode, err := util.As[*v1.Node](oldObj, newObj) originalNode, modifiedNode, err := util.As[*v1.Node](oldObj, newObj)
if err != nil { if err != nil {
return framework.Queue, err return framework.Queue, err
} }
if !modifiedNode.Spec.Unschedulable { // We queue this Pod when -
// 1. the node is updated from unschedulable to schedulable.
// 2. the node is added and is schedulable.
if (originalNode != nil && originalNode.Spec.Unschedulable && !modifiedNode.Spec.Unschedulable) ||
(originalNode == nil && !modifiedNode.Spec.Unschedulable) {
logger.V(5).Info("node was created or updated, pod may be schedulable now", "pod", klog.KObj(pod), "node", klog.KObj(modifiedNode)) logger.V(5).Info("node was created or updated, pod may be schedulable now", "pod", klog.KObj(pod), "node", klog.KObj(modifiedNode))
return framework.Queue, nil return framework.Queue, nil
} }
// TODO: also check if the original node meets the pod's requestments once preCheck is completely removed.
// See: https://github.com/kubernetes/kubernetes/issues/110175
logger.V(5).Info("node was created or updated, but it doesn't make this pod schedulable", "pod", klog.KObj(pod), "node", klog.KObj(modifiedNode)) logger.V(5).Info("node was created or updated, but it doesn't make this pod schedulable", "pod", klog.KObj(pod), "node", klog.KObj(modifiedNode))
return framework.QueueSkip, nil return framework.QueueSkip, nil
} }

View File

@ -135,7 +135,7 @@ func TestIsSchedulableAfterNodeChange(t *testing.T) {
expectedHint: framework.Queue, expectedHint: framework.Queue,
}, },
{ {
name: "skip-unrelated-change", name: "skip-unrelated-change-unschedulable-true",
pod: &v1.Pod{}, pod: &v1.Pod{},
newObj: &v1.Node{ newObj: &v1.Node{
Spec: v1.NodeSpec{ Spec: v1.NodeSpec{
@ -155,6 +155,27 @@ func TestIsSchedulableAfterNodeChange(t *testing.T) {
}, },
expectedHint: framework.QueueSkip, expectedHint: framework.QueueSkip,
}, },
{
name: "skip-unrelated-change-unschedulable-false",
pod: &v1.Pod{},
newObj: &v1.Node{
Spec: v1.NodeSpec{
Unschedulable: false,
Taints: []v1.Taint{
{
Key: v1.TaintNodeNotReady,
Effect: v1.TaintEffectNoExecute,
},
},
},
},
oldObj: &v1.Node{
Spec: v1.NodeSpec{
Unschedulable: false,
},
},
expectedHint: framework.QueueSkip,
},
{ {
name: "queue-on-unschedulable-field-change", name: "queue-on-unschedulable-field-change",
pod: &v1.Pod{}, pod: &v1.Pod{},