深入分析kube-batch(4)——actions

深入分析kube-batch(4)——actions

action是真正的調(diào)度過程误墓,順序是reclaim -> allocate -> backfill -> preempt

interface

// Action is the interface of scheduler action.
type Action interface {
   // The unique name of Action.
   Name() string

   // Initialize initializes the allocator plugins.
   Initialize()

   // Execute allocates the cluster's resources into each queue.
   Execute(ssn *Session)

   // UnIntialize un-initializes the allocator plugins.
   UnInitialize()
}

重點(diǎn)關(guān)注Execute實(shí)現(xiàn)

reclaim

kube-batch\pkg\scheduler\actions\reclaim\reclaim.go

func (alloc *reclaimAction) Execute(ssn *framework.Session) {
   queues := util.NewPriorityQueue(ssn.QueueOrderFn)

   preemptorsMap := map[api.QueueID]*util.PriorityQueue{}
   preemptorTasks := map[api.JobID]*util.PriorityQueue{}

   for _, job := range ssn.Jobs {
      queues.Push(queue)

      if len(job.TaskStatusIndex[api.Pending]) != 0 {
         preemptorsMap[job.Queue].Push(job)
         
         for _, task := range job.TaskStatusIndex[api.Pending] {
            preemptorTasks[job.UID].Push(task)
         }
      }
   }

  1. 根據(jù)優(yōu)先級排序queue
  2. 將待調(diào)度的task保存為搶占者
for {
   if queues.Empty() {
      break
   }

   queue := queues.Pop().(*api.QueueInfo)
   jobs, found := preemptorsMap[queue.UID]
   tasks, found := preemptorTasks[job.UID]

   resreq := task.Resreq.Clone()
   reclaimed := api.EmptyResource()

   assigned := false

   for _, n := range ssn.Nodes {
      if err := ssn.PredicateFn(task, n); err != nil {
         continue
      }

      var reclaimees []*api.TaskInfo
      for _, task := range n.Tasks {
         if task.Status != api.Running {
            continue
         }

         reclaimees = append(reclaimees, task.Clone())
      }
      victims := ssn.Reclaimable(task, reclaimees)

      if len(victims) == 0 {
         continue
      }

      // If not enough resource, continue
      allRes := api.EmptyResource()
      for _, v := range victims {
         allRes.Add(v.Resreq)
      }
      if allRes.Less(resreq) {
         continue
      }

      // Reclaim victims for tasks.
      for _, reclaimee := range victims {
         ssn.Evict(reclaimee, "reclaim")
         
         reclaimed.Add(reclaimee.Resreq)
         if resreq.LessEqual(reclaimee.Resreq) {
            break
         }
         resreq.Sub(reclaimee.Resreq)
      }       
      break
   }

}
  1. 找到優(yōu)先級最高的queue赁咙,job,task
  2. 遍歷node奸鬓,首先過預(yù)選函數(shù)豪硅,很奇怪拷窜,沒有PodFitsResources,應(yīng)該是kube-batch自己管理資源
  3. 找到node上正在運(yùn)行的pod
  4. 找到受害者
  5. 如果受害者資源總量小于pod申請資源總量锡足,就跳過
  6. 驅(qū)逐受害者,調(diào)用刪除接口
  7. 如果釋放足夠的資源壳坪,就跳出驅(qū)逐

reclaim過程目前還沒遇到過舶得,回收函數(shù)也不是很理解。我覺得回收不是很必要爽蝴,驅(qū)逐邏輯不應(yīng)該在這里做沐批,kubelet已經(jīng)有了驅(qū)逐邏輯纫骑,不是很明白reclaim的必要性。而且不是每次都需要回收珠插,應(yīng)該判斷node是否自愿不足惧磺。我會(huì)在配置中移除reclaim的action,還能提高性能捻撑。

allocate

        for !tasks.Empty() {
            task := tasks.Pop().(*api.TaskInfo)

            for _, node := range ssn.Nodes {
                if err := ssn.PredicateFn(task, node); err != nil {
                    continue
                }

                // Allocate idle resource to the task.
                if task.Resreq.LessEqual(node.Idle) {
                    ssn.Allocate(task, node.Name)
                    break
                }
            }
        }

分配過程只看最核心的部分磨隘,

  1. 過一遍預(yù)選函數(shù),
  2. 比較pod資源申請和node空閑資源
  3. bind

這里解決了上面的疑問顾患,預(yù)選函數(shù)中沒有PodFitsResources番捂,是因?yàn)樵谶@里實(shí)現(xiàn)了類似功能;不過又多了一個(gè)疑問江解,這里如果node滿足pod要求设预,那么就直接bind了?沒有優(yōu)選過程嗎犁河?那soft親和性怎么辦鳖枕?

backfill

func (alloc *backfillAction) Execute(ssn *framework.Session) {

   for _, job := range ssn.Jobs {
      for _, task := range job.TaskStatusIndex[api.Pending] {
         
         if task.Resreq.IsEmpty() {
            for _, node := range ssn.Nodes {
               ssn.PredicateFn(task, node);

               ssn.Allocate(task, node.Name)
               break
            }
         }
      }
   }
}

backfill是為了處理BestEffort后加的action,相關(guān)issue桨螺。

preempt

搶占邏輯一直沒有很理解宾符,這里先暫時(shí)不分析了彬碱,會(huì)另外開一篇文章專門介紹搶占或辖,不過kube-batch的搶占跟K8S的不太一樣芝加。

總結(jié)

學(xué)習(xí)了馬達(dá)老師的kube-batch為我打開了一個(gè)新思路腹缩,不過對于我的項(xiàng)目可能有點(diǎn)重遣妥,不是很需要回收和搶占邏輯五督,還有貌似也不支持優(yōu)選邏輯兴猩,沒有優(yōu)選就沒有soft親和性埂陆,這個(gè)是個(gè)非常致命的問題煌张,所以后期應(yīng)該準(zhǔn)備參考default-scheduler和kube-batch自己寫一個(gè)調(diào)度器了呐赡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骏融,隨后出現(xiàn)的幾起案子罚舱,更是在濱河造成了極大的恐慌,老刑警劉巖绎谦,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件管闷,死亡現(xiàn)場離奇詭異,居然都是意外死亡窃肠,警方通過查閱死者的電腦和手機(jī)包个,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碧囊,你說我怎么就攤上這事树灶。” “怎么了糯而?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵天通,是天一觀的道長。 經(jīng)常有香客問我熄驼,道長像寒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任瓜贾,我火速辦了婚禮诺祸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祭芦。我一直安慰自己筷笨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布龟劲。 她就那樣靜靜地躺著胃夏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昌跌。 梳的紋絲不亂的頭發(fā)上仰禀,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音避矢,去河邊找鬼悼瘾。 笑死囊榜,一個(gè)胖子當(dāng)著我的面吹牛审胸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卸勺,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼砂沛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙求?” 一聲冷哼從身側(cè)響起碍庵,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悟狱,沒想到半個(gè)月后静浴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挤渐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年苹享,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浴麻。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡得问,死狀恐怖囤攀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宫纬,我是刑警寧澤焚挠,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站漓骚,受9級特大地震影響蝌衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜认境,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一胚委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叉信,春花似錦亩冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佳遂,卻和暖如春营袜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丑罪。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工荚板, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩屹。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓跪另,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煤搜。 傳聞我的和親對象是個(gè)殘疾皇子免绿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容