美文网首页
k8s scheduler plugin简单分析

k8s scheduler plugin简单分析

作者: wwq2020 | 来源:发表于2020-07-12 13:54 被阅读0次

    k8s scheduler plugin

    例子

    cmd/main.go 中

    func main() {
      ...
        command := app.NewSchedulerCommand(
            app.WithPlugin(coscheduling.Name, coscheduling.New),
            app.WithPlugin(qos.Name, qos.New),
        )
        if err := command.Execute(); err != nil {
            os.Exit(1)
        }
    }
    

    scheduler-plugins/pkg/qos/queue_sort.go 中

    package qos
    
    import (
        v1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/runtime"
        "k8s.io/kubernetes/pkg/api/v1/pod"
        v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
        framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
    )
    
    // Name is the name of the plugin used in the plugin registry and configurations.
    const Name = "QOSSort"
    
    // Sort is a plugin that implements QoS class based sorting.
    type Sort struct{}
    
    var _ framework.QueueSortPlugin = &Sort{}
    
    // Name returns name of the plugin.
    func (pl *Sort) Name() string {
        return Name
    }
    
    // Less is the function used by the activeQ heap algorithm to sort pods.
    // It sorts pods based on their priorities. When the priorities are equal, it uses
    // the Pod QoS classes to break the tie.
    func (*Sort) Less(pInfo1, pInfo2 *framework.PodInfo) bool {
        p1 := pod.GetPodPriority(pInfo1.Pod)
        p2 := pod.GetPodPriority(pInfo2.Pod)
        return (p1 > p2) || (p1 == p2 && compQOS(pInfo1.Pod, pInfo2.Pod))
    }
    
    func compQOS(p1, p2 *v1.Pod) bool {
        p1QOS, p2QOS := v1qos.GetPodQOS(p1), v1qos.GetPodQOS(p2)
        if p1QOS == v1.PodQOSGuaranteed {
            return true
        } else if p1QOS == v1.PodQOSBurstable {
            return p2QOS != v1.PodQOSGuaranteed
        } else {
            return p2QOS == v1.PodQOSBestEffort
        }
    }
    
    // New initializes a new plugin and returns it.
    func New(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
        return &Sort{}, nil
    }
    
    

    结合上文
    pkg/scheduler/framework/runtime/framework.go 中

    RunPreFilterPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod) (status *framework.Status)
    RunFilterPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) framework.PluginToStatus
    RunPostFilterPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, filteredNodeStatusMap framework.NodeToStatusMap)
    RunReservePluginsReserve(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string)
    RunReservePluginsUnreserve(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string)
    RunPreScorePlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodes []*v1.Node) (status *framework.Status)
    RunScorePlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodes []*v1.Node) (ps framework.PluginToNodeScores, status *framework.Status)
    RunPreBindPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (status *framework.Status)
    RunBindPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (status *framework.Status)
    RunPostBindPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string)
    RunPermitPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (status *framework.Status)
    Less(*QueuedPodInfo, *QueuedPodInfo) bool
    

    所有扩展点在 pkg/scheduler/framework/runtime/framework.go 中

    func (f *frameworkImpl) getExtensionPoints(plugins *config.Plugins) []extensionPoint {
        return []extensionPoint{
            {plugins.PreFilter, &f.preFilterPlugins},
            {plugins.Filter, &f.filterPlugins},
            {plugins.PostFilter, &f.postFilterPlugins},
            {plugins.Reserve, &f.reservePlugins},
            {plugins.PreScore, &f.preScorePlugins},
            {plugins.Score, &f.scorePlugins},
            {plugins.PreBind, &f.preBindPlugins},
            {plugins.Bind, &f.bindPlugins},
            {plugins.PostBind, &f.postBindPlugins},
            {plugins.Permit, &f.permitPlugins},
            {plugins.QueueSort, &f.queueSortPlugins},
        }
    }
    

    这个例子实现了 QueueSortPlugin

    相关文章

      网友评论

          本文标题:k8s scheduler plugin简单分析

          本文链接:https://www.haomeiwen.com/subject/kiigcktx.html