一. 集群Job的几种分类
集群中运行的Job一般可分为三种类型:
1. deployment Job: 提供持续监听服务,需要一直运行,比如 server,daemon 等
2. batch Job: 负责批处理任务,即仅需要成功执行一次的任务。
3. cron Job: 负责定时触发任务执行,该任务可以是deployment或者batch类型。
二. 容器化Batch Job应用
对于Batch Job,将其容器化,并保证批处理任务只成功执行一次,需考虑以下几点:
1. 通过容器化保证Job之间的资源隔离以及每个Job的资源配比
2. 新的Job在集群中被分配到的节点策略及负载均衡策略
2. 任务执行中容器本身即内部实际业务处理的状态监控
3. 任务执行成功后资源释放的状态反馈
4. 任务执行失败后的重试机制
三. 基于Mesos实现Batch Job调度
Mesos诞生于UC Berkeley的一个研究项目,现已成为Apache Incubator中的项目,当前有一些公司使用Mesos管理集群资源,比如Twitter。
mesosMesos是master/slave结构,master是轻量级的,仅保存了framework和mesos slave的一些状态,而这些状态很容易通过framework和slave重新注册而重构。Mesos master是一个全局资源调度器,采用某种策略将某个slave上的空闲资源分配给某一个framework,各种framework通过自己的调度器向Mesos master注册,以接入到Mesos中;而Mesos slave主要功能是汇报任务的状态和启动各个framework的executor。
Chronos和Marathon都是基于Mesos比较优秀的定时任务调度和服务类任务调度的Framework,开源并由mesosphere公司维护升级,而对于Batch Job暂时还没有比较知名的基于Mesos的开源框架支撑。但是根据实际业务需要,基于Mesos提供的接口可以很容易实现Batch Job Framework,大致的实现流程如下:
framework实现原理具体根据业务需求,参考实例:https://github.com/weiyuanke/run-docker-on-mesos-test-framework
四. 基于k8s实现Batch Job调度
本文主要将基于K8S的Batch Job, Kubernetes自身已经实现了Deployment,CronJob,BatchJob三种类型任务的调度,并提供了REST API提供第三方应用集成,此处设计实现了一种基于 kubernetes的容器调度及状态监控的应用,具体结构如下:
kubernetes批任务1. 通过rancher搭建k8s集群
Rancher是一个开源的企业级容器管理平台。通过Rancher,不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。Rancher的环境搭建参考:
https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/
rancher + k8s2. 创建kubernetes的访问密钥
keys3. 获取Bearer Token用来Authorization
token4. 通过postman发送创建Job任务的请求
K8S API地址:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#job-v1-batch
由于采用https,先将postman中的“SSL certificate verification”设置成OFF
SSL创建post请求,在authorization中设置Bearer Token为刚刚创建的密钥
authorizationHearder中的Content-Type需要设置成 application/yaml
headerBody中选在raw 以及 Text,并在raw中填写具体的请求体(yaml文件数据)
body一个简单的任务提交命令:
submit4. 通过Java发送创建Job任务的请求:
HttpsUtil:
HttpsUtilTaskScheduleService:
taskSchedule5. 任务执行过程采集
由于k8s只能对容器整体的生命周期进行管理,如果容器内的任务又包含了多个stage,需要采集这些stage的执行状态即过程日志的话,需要容器内的业务代码实现。
实现参考架构图,略。
网友评论