Merge pull request #77598 from danielqsj/unreserve
Add Un-reserve extension point for the scheduling framework
This commit is contained in:
@@ -33,6 +33,7 @@ type framework struct {
|
||||
plugins map[string]Plugin // a map of initialized plugins. Plugin name:plugin instance.
|
||||
reservePlugins []ReservePlugin
|
||||
prebindPlugins []PrebindPlugin
|
||||
unreservePlugins []UnreservePlugin
|
||||
}
|
||||
|
||||
var _ = Framework(&framework{})
|
||||
@@ -64,6 +65,9 @@ func NewFramework(r Registry, _ *runtime.Unknown) (Framework, error) {
|
||||
if pp, ok := p.(PrebindPlugin); ok {
|
||||
f.prebindPlugins = append(f.prebindPlugins, pp)
|
||||
}
|
||||
if up, ok := p.(UnreservePlugin); ok {
|
||||
f.unreservePlugins = append(f.unreservePlugins, up)
|
||||
}
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
@@ -105,6 +109,14 @@ func (f *framework) RunReservePlugins(
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunUnreservePlugins runs the set of configured unreserve plugins.
|
||||
func (f *framework) RunUnreservePlugins(
|
||||
pc *PluginContext, pod *v1.Pod, nodeName string) {
|
||||
for _, pl := range f.unreservePlugins {
|
||||
pl.Unreserve(pc, pod, nodeName)
|
||||
}
|
||||
}
|
||||
|
||||
// NodeInfoSnapshot returns the latest NodeInfo snapshot. The snapshot
|
||||
// is taken at the beginning of a scheduling cycle and remains unchanged until a
|
||||
// pod finishes "Reserve". There is no guarantee that the information remains
|
||||
|
@@ -113,6 +113,17 @@ type PrebindPlugin interface {
|
||||
Prebind(pc *PluginContext, p *v1.Pod, nodeName string) *Status
|
||||
}
|
||||
|
||||
// UnreservePlugin is an interface for Unreserve plugins. This is an informational
|
||||
// extension point. If a pod was reserved and then rejected in a later phase, then
|
||||
// un-reserve plugins will be notified. Un-reserve plugins should clean up state
|
||||
// associated with the reserved Pod.
|
||||
type UnreservePlugin interface {
|
||||
Plugin
|
||||
// Unreserve is called by the scheduling framework when a reserved pod was
|
||||
// rejected in a later phase.
|
||||
Unreserve(pc *PluginContext, p *v1.Pod, nodeName string)
|
||||
}
|
||||
|
||||
// Framework manages the set of plugins in use by the scheduling framework.
|
||||
// Configured plugins are called at specified points in a scheduling context.
|
||||
type Framework interface {
|
||||
@@ -128,6 +139,9 @@ type Framework interface {
|
||||
// plugins returns an error, it does not continue running the remaining ones and
|
||||
// returns the error. In such case, pod will not be scheduled.
|
||||
RunReservePlugins(pc *PluginContext, pod *v1.Pod, nodeName string) *Status
|
||||
|
||||
// RunUnreservePlugins runs the set of configured unreserve plugins.
|
||||
RunUnreservePlugins(pc *PluginContext, pod *v1.Pod, nodeName string)
|
||||
}
|
||||
|
||||
// FrameworkHandle provides data and some tools that plugins can use. It is
|
||||
|
@@ -515,6 +515,8 @@ func (sched *Scheduler) scheduleOne() {
|
||||
if err != nil {
|
||||
klog.Errorf("error assuming pod: %v", err)
|
||||
metrics.PodScheduleErrors.Inc()
|
||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||
fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost)
|
||||
return
|
||||
}
|
||||
// bind the pod to its host asynchronously (we can do this b/c of the assumption step above).
|
||||
@@ -525,6 +527,8 @@ func (sched *Scheduler) scheduleOne() {
|
||||
if err != nil {
|
||||
klog.Errorf("error binding volumes: %v", err)
|
||||
metrics.PodScheduleErrors.Inc()
|
||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||
fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -543,6 +547,8 @@ func (sched *Scheduler) scheduleOne() {
|
||||
klog.Errorf("scheduler cache ForgetPod failed: %v", forgetErr)
|
||||
}
|
||||
sched.recordSchedulingFailure(assumedPod, prebindStatus.AsError(), reason, prebindStatus.Message())
|
||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||
fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -558,6 +564,8 @@ func (sched *Scheduler) scheduleOne() {
|
||||
if err != nil {
|
||||
klog.Errorf("error binding pod: %v", err)
|
||||
metrics.PodScheduleErrors.Inc()
|
||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||
fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost)
|
||||
} else {
|
||||
klog.V(2).Infof("pod %v/%v is bound successfully on node %v, %d nodes evaluated, %d nodes were found feasible", assumedPod.Namespace, assumedPod.Name, scheduleResult.SuggestedHost, scheduleResult.EvaluatedNodes, scheduleResult.FeasibleNodes)
|
||||
metrics.PodScheduleSuccesses.Inc()
|
||||
|
Reference in New Issue
Block a user