一.? 集群Job的幾種分類
? ? ? 集群中運行的Job一般可分為三種類型:
? ? ? 1.?deployment Job: 提供持續(xù)監(jiān)聽服務公黑,需要一直運行妻导,比如 server哄尔,daemon 等
? ? ? ?2.?batch Job:?負責批處理任務粗合,即僅需要成功執(zhí)行一次的任務。
? ? ? ?3.?cron Job:?負責定時觸發(fā)任務執(zhí)行芽偏,該任務可以是deployment或者batch類型。
二.? 容器化Batch Job應用
? ? ? ?對于Batch Job弦讽,將其容器化污尉,并保證批處理任務只成功執(zhí)行一次,需考慮以下幾點:
? ? ? 1.? 通過容器化保證Job之間的資源隔離以及每個Job的資源配比
? ? ? 2.? 新的Job在集群中被分配到的節(jié)點策略及負載均衡策略
? ? ? 2.? 任務執(zhí)行中容器本身即內部實際業(yè)務處理的狀態(tài)監(jiān)控
? ? ? 3.? 任務執(zhí)行成功后資源釋放的狀態(tài)反饋
? ? ? 4.? 任務執(zhí)行失敗后的重試機制?
三.? 基于Mesos實現(xiàn)Batch Job調度
? ? ? ?Mesos誕生于UC Berkeley的一個研究項目往产,現(xiàn)已成為Apache Incubator中的項目被碗,當前有一些公司使用Mesos管理集群資源,比如Twitter仿村。
? ??Mesos是master/slave結構锐朴,master是輕量級的,僅保存了framework和mesos slave的一些狀態(tài)蔼囊,而這些狀態(tài)很容易通過framework和slave重新注冊而重構焚志。Mesos master是一個全局資源調度器,采用某種策略將某個slave上的空閑資源分配給某一個framework压真,各種framework通過自己的調度器向Mesos master注冊娩嚼,以接入到Mesos中;而Mesos slave主要功能是匯報任務的狀態(tài)和啟動各個framework的executor滴肿。
? ? ?Chronos和Marathon都是基于Mesos比較優(yōu)秀的定時任務調度和服務類任務調度的Framework岳悟,開源并由mesosphere公司維護升級,而對于Batch Job暫時還沒有比較知名的基于Mesos的開源框架支撐。但是根據(jù)實際業(yè)務需要贵少,基于Mesos提供的接口可以很容易實現(xiàn)Batch Job Framework呵俏,大致的實現(xiàn)流程如下:
? ? ?具體根據(jù)業(yè)務需求,參考實例:https://github.com/weiyuanke/run-docker-on-mesos-test-framework
四.? 基于k8s實現(xiàn)Batch Job調度
? ? ? 本文主要將基于K8S的Batch Job, Kubernetes自身已經(jīng)實現(xiàn)了Deployment,CronJob,BatchJob三種類型任務的調度滔灶,并提供了REST API提供第三方應用集成普碎,此處設計實現(xiàn)了一種基于?kubernetes的容器調度及狀態(tài)監(jiān)控的應用,具體結構如下:
? ? ? ?1.? 通過rancher搭建k8s集群
? ??????Rancher是一個開源的企業(yè)級容器管理平臺录平。通過Rancher麻车,不必自己使用一系列的開源軟件去從頭搭建容器服務平臺。Rancher提供了在生產(chǎn)環(huán)境中使用的管理Docker和Kubernetes的全椂氛猓化容器部署與管理平臺动猬。Rancher的環(huán)境搭建參考:
? ??????https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/
? ? ? ? ? ??2.??創(chuàng)建kubernetes的訪問密鑰
?????????????3.??獲取Bearer Token用來Authorization
?????????????4.??通過postman發(fā)送創(chuàng)建Job任務的請求
? ? ? ? ? ? ?K8S API地址:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#job-v1-batch
? ? ? ? ? ? ?由于采用https,先將postman中的“SSL certificate verification”設置成OFF
????????????????創(chuàng)建post請求表箭,在authorization中設置Bearer Token為剛剛創(chuàng)建的密鑰
????????????????Hearder中的Content-Type需要設置成 application/yaml
????????????Body中選在raw 以及 Text,并在raw中填寫具體的請求體(yaml文件數(shù)據(jù))
????????????????一個簡單的任務提交命令:
?????????????4.??通過Java發(fā)送創(chuàng)建Job任務的請求:
? ? ? ? ? ? ? ?HttpsUtil:
? ???????????????TaskScheduleService:
? ???????5.? 任務執(zhí)行過程采集
? ? ? ? ? ? 由于k8s只能對容器整體的生命周期進行管理赁咙,如果容器內的任務又包含了多個stage,需要采集這些stage的執(zhí)行狀態(tài)即過程日志的話免钻,需要容器內的業(yè)務代碼實現(xiàn)彼水。
? ? ? ? ? ? 實現(xiàn)參考架構圖,略极舔。