1 Star 0 Fork 0

iscas-system/fleet-scheduler

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
dev_fliter.go 3.15 KB
一键复制 编辑 原始数据 按行查看 历史
yyyfish 提交于 2024-07-09 16:06 . fix return status
package device_plugin
import (
"context"
"sync"
"time"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/klog"
framework "k8s.io/kubernetes/pkg/scheduler/framework"
)
var _ framework.FilterPlugin = &DevFilterPlugin{}
// 插件名称
const Name = "DevFilter"
var (
DeletePodCache []*v1.Pod
DelMutex sync.Mutex
)
type DevFilterPlugin struct {
handle framework.Handle
}
func (s *DevFilterPlugin) Name() string {
return Name
}
func New(_ context.Context, _ runtime.Object, handle framework.Handle) (framework.Plugin, error) {
return &DevFilterPlugin{
handle: handle,
}, nil
}
// Filter(ctx context.Context, state *CycleState, pod *v1.Pod, nodeInfo *NodeInfo) *Status
func (s *DevFilterPlugin) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
klog.Infof("pod %s waiting for filtration", pod.GetName())
return s.getFitnessGpuNode(pod, nodeInfo)
}
func (s *DevFilterPlugin) getFitnessGpuNode(pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
/*
判断是否需求gpu的pod
不是返回?状态,是继续
等待调度结果,轮询是否有标签,超时返回unschedule
获取pod标签中调度的node,不匹配返回unschedule
*/
gpuCoreReq, gpuMemReq, mluCoreReq, mluMemReq, dcuCoreReq, dcuMemReq := int64(0), int64(0), int64(0), int64(0), int64(0), int64(0)
for _, cont := range pod.Spec.Containers {
gpuCore := cont.Resources.Limits[ResourceCore]
mluCore := cont.Resources.Limits[MluResourceCore]
gpuMem := cont.Resources.Limits[ResourceMemory]
mluMem := cont.Resources.Limits[MluResourceMemory]
dcuCore := cont.Resources.Limits[DcuResourceCore]
dcuMem := cont.Resources.Limits[DcuResourceMemory]
gpuCoreReq += int64(gpuCore.Value())
mluCoreReq += int64(mluCore.Value())
gpuMemReq += int64(gpuMem.Value())
mluMemReq += int64(mluMem.Value())
dcuCoreReq += int64(dcuCore.Value())
dcuMemReq += int64(dcuMem.Value())
}
if gpuCoreReq != 0 || mluCoreReq != 0 || dcuCoreReq != 0 {
hasDevAnn := false
count := 0
for !hasDevAnn {
podNew, err := kubeClientGlobal.CoreV1().Pods(pod.GetNamespace()).Get(context.TODO(), pod.GetName(), metav1.GetOptions{})
if err != nil {
klog.Errorf("get pod %s error:%s", pod.GetName(), err)
continue
}
schedulerNode, ok := podNew.Annotations[AnnScheduleNode]
if ok {
if schedulerNode == nodeInfo.Node().GetName() {
klog.Infof("pod %s has scheduled by manager, node %s select", podNew.GetName(), nodeInfo.Node().GetName())
return framework.NewStatus(framework.Success, "")
} else {
klog.Infof("pod %s has scheduled by manager,but node %s has not enough resource, skip", podNew.GetName(), nodeInfo.Node().GetName())
return framework.NewStatus(framework.UnschedulableAndUnresolvable, "")
}
} else {
klog.Info("pod has not scheduler by manager, waiting for scheduler", podNew.Annotations)
time.Sleep(time.Millisecond * 500)
count++
if count == 30 {
break
}
}
}
framework.NewStatus(framework.UnschedulableAndUnresolvable, "")
}
return framework.NewStatus(framework.Success, "")
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/iscas-system/scheduler.git
git@gitee.com:iscas-system/scheduler.git
iscas-system
scheduler
fleet-scheduler
v0.1.4

搜索帮助

Cb406eda 1850385 E526c682 1850385