Merge pull request #127450 from googs1025/scheduler/Fine_grain_QueueHints

feature(scheduler): more fine-grained Node QHint for nodeunschedulable plugin
This commit is contained in:
Kubernetes Prow Robot 2024-09-19 11:06:44 +01:00 committed by GitHub
commit cdfabdc86e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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{},