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
// pod schedulable.
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 {
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))
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))
return framework.QueueSkip, nil
}

View File

@ -135,7 +135,7 @@ func TestIsSchedulableAfterNodeChange(t *testing.T) {
expectedHint: framework.Queue,
},
{
name: "skip-unrelated-change",
name: "skip-unrelated-change-unschedulable-true",
pod: &v1.Pod{},
newObj: &v1.Node{
Spec: v1.NodeSpec{
@ -155,6 +155,27 @@ func TestIsSchedulableAfterNodeChange(t *testing.T) {
},
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",
pod: &v1.Pod{},