背景
我們機(jī)器學(xué)習(xí)平臺(tái)上的任務(wù)最初是通過 Marathon 啟動(dòng)在Mesos集群上的炒瘟,分布式訓(xùn)練框架是 ps-lite妆艘。但隨著技術(shù)的變更升級(jí)偏窝,Mesos+Marathon 組合所用的技術(shù)越來(lái)越落后钢坦,K8s霸主的地位越來(lái)越穩(wěn)固兔港,我們決定用K8s替代 Mesos+Marathon 組合雹嗦。如何實(shí)現(xiàn)將任務(wù)從 Mesos 集群以用戶無(wú)感知的方式遷移到 K8s 集群是我們要解決的首要問題范舀。
舊的啟動(dòng)流程
ps-lite在 Mesos 集群上的啟動(dòng)過程大體可以分為4個(gè)步驟(如下圖所示):
- 向Marathon發(fā)送請(qǐng)求創(chuàng)建scheduler Task
- Marathon 向 Mesos 發(fā)送請(qǐng)求啟動(dòng) scheduler任務(wù)
- scheduler任務(wù)后再執(zhí)行腳本中的 run_worker 方法調(diào)用 Marathon 接口創(chuàng)建 worker Task
- Marathon 向 Mesos 發(fā)送請(qǐng)求啟動(dòng) worker 任務(wù)
流程倒是不復(fù)雜,但第3步的腳本是放在 Docker 鏡像中的了罪,腳本中寫死必須調(diào)用 Marathon 的接口
锭环。我們知道 Docker 鏡像一旦發(fā)布之后就難以再修改,并且由于之前沒有定義 Docker 鏡像命名規(guī)則泊藕,很難找到全部的 Docker 鏡像并逐一完成修改辅辩。由于之前沒有任何文字記錄,基礎(chǔ)鏡像的 Tag 也無(wú)從查找。
既然修改鏡像中腳本的方式不行,那就研究別的辦法吧汽久。
不過好在 Marathon 的域名是以參數(shù)的形式傳入的,如果我能利用“絞殺者模式
”鹤竭,新建一個(gè)服務(wù)模擬 Marathon 的接口,然后在啟動(dòng) scheduler 時(shí)傳入新服務(wù)的域名景醇,把創(chuàng)建 worker 的請(qǐng)求導(dǎo)入到新服務(wù)臀稚,新服務(wù)收到請(qǐng)求后再調(diào)用 K8s 的接口創(chuàng)建 worker,問題不就解決了嗎三痰?
絞殺者模式
通過使用新的應(yīng)用程序和服務(wù)逐漸替換遺留系統(tǒng)的特定功能部件來(lái)逐步遷移吧寺。由于替換遺留系統(tǒng)的功能,新系統(tǒng)最終將替代舊系統(tǒng)的所有功能散劫,絞殺并允許停用舊系統(tǒng)稚机。
通俗來(lái)講,就是用新的應(yīng)用程序和服務(wù)逐步替換特定的功能获搏。 創(chuàng)建一個(gè)外層來(lái)攔截請(qǐng)求前往后端舊版系統(tǒng)赖条。 外層可將這些請(qǐng)求路由到舊版應(yīng)用程序或新服務(wù)。 現(xiàn)有功能可逐步遷移到新系統(tǒng)常熙,使用者可繼續(xù)使用相同的接口纬乍,他們并不知道遷移已發(fā)生。
新的啟動(dòng)流程
于是裸卫,我在 alpha-exptmgr 模塊中新建了一個(gè) MarathonController 用于模擬 Marathon 的接口仿贬,同時(shí)在啟動(dòng) scheduler 時(shí)傳入 alpha-exptmgr 的域名,MarathonController 在接收到創(chuàng)建 worker 的請(qǐng)求后墓贿,調(diào)用 K8s 的接口創(chuàng)建 worker 任務(wù)(如下圖所示)茧泪。于是就成功實(shí)現(xiàn)了將任務(wù)從 Mesos 集群以用戶無(wú)感知的方式遷移到 K8s 集群。
總結(jié)
- 絞殺者模式在系統(tǒng)升級(jí)和任務(wù)遷移時(shí)可以用到
- 盡量不要在鏡像里寫死一些可能發(fā)生變化的值聋袋,最好是以啟動(dòng)參數(shù)的形式傳入