聊聊容器調度框架,看又拍雲如何基於mesos實現

內容來源:2017年8月5日,又拍雲系統開發工程師黃勵博在「Gopher 杭州 meetup」進行《基於mesos的容器調度框架》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
算法

閱讀字數:2715 | 7分鐘閱讀docker

嘉賓演講視頻及PPT回顧:t.cn/RnjCuniapi

摘要

爲了更好地完成雲處理服務的負載均衡, 零停機升級, 自定義策略調度等功能, 又拍雲用 Go 實現了本身的容器調度框架, 管理長期服務和定時任務。服務器

Mesos介紹

Mesos官方稱之爲分佈式系統內核,它把數據中心的CPU、內存、磁盤等抽象成一個資源池。微信


它主要是一個兩級調度系統。首先能夠看到上圖中左側的Mesos agent會在全部集羣的每一臺機器上部署一個agent。當這個agent啓動後會向master註冊,攜帶了一些每一個機器的統計資源,由master來決定給每一個框架分配多少資源。分配算法默認採用的是分級主導資源分配算法。所謂分級就是各個框架它是有角色的概念,每一個角色能夠選擇它的一個權重。它的主導資源公平是指每一個框架可能有一些是以CPU爲主導,有一些是之內存爲主導的,諸如此類。負載均衡

主導資源公平就是說這些主導資源所在整個資源中佔據的比例是公平的。固然也能夠選擇本身定義一個算法來替換這個分配算法。框架

上圖中右側是部署在Mesos上的一系列框架,當這些框架收到資源以後,它就會根據本身的需求來調度自身的任務。異步

Upone

Upone是爲雲處理服務定製的容器調度框架,支持長期服務和按期服務。分佈式

MARATHON是一個在Mesos上一個比較著名的跑長時任務的一個調度框架。CHR是一個跑定時任務的框架。工具

而Upone同時能夠支持跑定時任務和長期任務,而且擁有一些MARATHON和CHR都沒有的功能。

上圖是一個Mesos啓動任務的流程圖。中間的綠色部分是調度器,也就是upone。如圖所示,第一步是client來完成一個註冊的功能,當任務沒有到來的時候,master會不停地給upone發送一個offer,這個offer就是裏面包含了一些資源的信息。當upone沒有收到任何啓動任務的時候,它會不停拒絕這個offer,以便Mesos master上面還有其它一些框架,它們能夠利用這些offer。當這個任務到來的時候,upone會把這個任務放到任務隊列裏,等到下一個offer到來的時候就能夠選擇它想要的選擇的那些offer,把這些任務放到這個上面去,而後告訴master,由master通知Mesos agent,告訴它須要啓哪些任務,以及須要哪些CPU和內存。最後agent就會通知對應的執行器。

Upone是一個容器調度的方案,因此它的執行器都是docker的執行器。這樣一個啓動流程就完成了。

接下來它的狀態反饋都是異步的通知,咱們須要upone來訂閱它的一些通知來完成。

消息交互

Upone跟Mesos master的交互是經過Mesos提供的api/v1/scheduler方案來處理的。

訂閱

當要和Mesos進行通信的時候,首先要開啓一個長連接來訂閱Mesos的一些事件。

上圖列出的是一些經常使用的事件。第一個是已經訂閱成功的事件,還有就是以前提到的offer的事件。包含了一些機器的資源的信息,可能會通知你這個資源再也不有效了。還會告知一些狀態變動的事件。接下來是一個失敗的事件,它會告訴咱們整個節點已經丟失或執行器已經被無故中止了。這時一般會伴隨update事件,由於在上面會跑不一樣的任務,當一個失敗的事件發生的時候,伴隨這些任務其實都已經丟失了。最後一個是心跳的事件。

Offers事件處理

對於offer的處理,upone主要提供了兩種消息,一種是接受。若是接受這個offer,它要把啓動的信息還有它所需的資源信息通通告知master;若是要拒絕了offer,它能夠選擇拒絕這個offer須要有多長時間。固然也能夠用一個消息來取消以前設定的拒絕時間。

Updata事件處理

任務狀態的變動和upone可能產生聯動,當一個任務變成running狀態的時候,upone會更新負載均衡器。若是任務已經丟失以後,咱們須要經過upone的調度來完成任務的遷移工做。

負載均衡

咱們開源了一個基於ngx_lua的動態負載均衡方案Slardar。


當任務下發到Mesos,它幫你把任務建立出來以後,它會有一個running的事件告知upone。這時就能夠把它更新到Slardar負載均衡器上。

零停機更新

Upone的更新是採用藍綠更新的方案,就是當更新的請求發出以後,upone首先會根據新的配置去告知Mesos它要建立一篇新的APP。當這些APP成功地運行以後,upone會去把新的APP地址更新到Slardar裏面,同時會摘掉舊的地址。等到一個可配置的時間以後,若是是短連接,就能夠把舊的任務關閉了。

健康檢查

對任務進行健康檢查的第一項就是是否開啓這個健康檢查,第二個是上一次健康檢查的時間,下面是一些健康檢查的服務列表。

預處理

預處理功能就是能夠在接入到APP以前能夠載入相關的動態腳原本執行一些預處理的功能。好比對APP進行一些頻率限制,或者對APP進行一些參數的轉換。


以頻率限制爲例,能夠在訪問APP前載入引入limit相關腳本完成處理。

命令行工具

同時,咱們還提供命令行工具,以便APP全部者經過upone手動操做上述負載均衡和更新部署的相關功能。

自定義策略

收到Mesos offer後,能夠自定義策略來決定任務調度方案。

隨機調度是儘量讓同一應用的各個任務分佈到不一樣的機器。


但隨機調度有一個缺點就是它認爲全部的Slave都具有了相同的特質, 因此咱們加入了對機器和任務屬性的調度方案。


Consul是一個配置中心和註冊服務中心。上圖是一個GPU的例子。好比它給這個任務貼了一個GPU的標籤,當offer到來的時候,upone能夠去consul中獲取全部slave的一些相關信息。

咱們還須要一個實時的策略,根據機器的weight/local進行動態調度。


上圖是一個監控系統,咱們能夠從這個監控系統中獲取咱們全部節點的load狀況。

配置與服務發現


基本上全部的組件都會和Consul發生聯繫。Upone的全部APP和配置都是從consul加載的,還會從Consul拉取屬性信息。當全部APP啓動以後,它會往Consul中註冊它的服務以便Slardar能夠及時地知道服務的狀況。Upone是APP全部者的入口,而Slardar是APP用戶的入口。

高可用

經過Raft分佈式一致性協議來實現高可用。

領導選舉是經過心跳機制來觸發,term充當邏輯時鐘的做用。

日誌複製是指領導者把一條指令(能被複制狀態機執行)附加到日誌中,發起附加條目RPC請求給其它角色。

強領導者的意思是日誌條目只能從leader發送給其它的服務器。

告警

各個應用能夠在建立任務的時候制定本身的slack channel。當任務出現異常時,發送實時通知。

相關文章
相關標籤/搜索