背景信息
SchedulerX是阿里巴巴自研的一站式分布式任务调度平台(兼容开源XXL-JOB/ElasticJob),支持Cron定时、一次性任务、任务编排、分布式跑批,具有高可用、可视化、可运维、低延时等能力。自带日志服务、监控大盘、短信报警等企业级服务。
通过该文章,不需要对业务和镜像进行改造,只需要在Kubernetes的deployment文件(Pod、Deployment、StatefulSet、Job等都支持)中新增一个sidecar配置,就可以将定时任务托管到SchedulerX平台,拥有白屏运维、可视化和监控报警能力,比如:
- 批量运维:在SchedulerX控制台编辑shell脚本,定时广播所有pod,执行shell脚本(比如清理业务日志),在控制台查看运行结果。
- 业务幂等:在SchedulerX控制台编辑python脚本,每小时幂等调度一个pod执行脚本,清理数据库历史数据。
- 业务安全:想要定时调度业务的http服务,不需要将业务的http服务不会暴露给公网,只需要在SchedulerX的控制台编辑http脚本(比如"curl 127.0.0.1/hello"),会自动调度某个pod内的该http服务。
- 监控告警:在SchedulerX控制台编辑python脚本,每分钟调度一个pod执行脚本,如果执行失败,发送短信/电话/钉钉/邮件告警。
接入原理
通过sidecar接入schedulerx-agent的原理如下图
每个pod中,都会有一个schedulerx-agent的容器,和业务容器在同一个pod中。schedulerx-agent会和任务调度SchedulerX服务端进行通信。SchedulerX服务端进行定时任务的调度和路由分发,决定分给某个/某些pod中的schedulerx-agent,schedulerx-agent收到调度命令,再去业务容器中执行对应的任务。
前提条件
- 有Kubernetes集群(阿里云或者非阿里云都支持)
- 开通schedulerx并创建应用:https://help.aliyun.com/document_detail/161992.html
配置sidecar
登录你的Kubernetes集群,编辑deployment,增加schedulerx-agent的sidecar配置,比如
apiVersion apps/v1 kind Deployment metadata name hello-schedulerx-sidecar-demo labels app hello-schedulerx-sidecar-demo spec replicas1 selector matchLabels app hello-schedulerx-sidecar-demo template metadata labels app hello-schedulerx-sidecar-demo spec containers# 主容器配置name node-demo image registry.cn-hangzhou.aliyuncs.com/armon/hellodemo 0.0.1-amd64 resources limits cpu 500m memory 128Mi requests cpu 500m memory 128Mi portscontainerPort8088# schedulerx-agent sidecar配置 name schedulerx-agent image registry.cn-hangzhou.aliyuncs.com/schedulerx/agent 1.4.2-amd64 imagePullPolicy Always resources limits cpu 200m requests cpu 200m envname"SCHEDULERX_ENDPOINT" value"${SCHEDULERX_ENDPOINT}"name"SCHEDULERX_NAMESPACE" value"${SCHEDULERX_NAMESPACE}"name"SCHEDULERX_GROUPID" value"${SCHEDULERX_GROUPID}"name"SCHEDULERX_APPKEY" value"${SCHEDULERX_APPKEY}"name"SCHEDULERX_STARTER_MODE" value"sidecar" livenessProbe exec command"/bin/bash""/root/health.sh" timeoutSeconds30 initialDelaySeconds30
注:
- deployment.yaml和node-demo镜像,可以参考demo
- 当前schedulerx-agent需要至少300m内存,持续优化中。
schedulerx agent image变量说明
芯片架构 |
区域 |
说明 |
x86_64 |
公网 |
registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:1.4.2-amd64 |
阿里云vpc |
registry-vpc.{regionId}.aliyuncs.com/schedulerx/agent:1.4.2-amd64 |
|
arm64 |
公网 |
registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:1.4.2-arm64 |
阿里云vpc |
registry-vpc.{regionId}.aliyuncs.com/schedulerx/agent:1.4.2-arm64 |
schedulerx agent env 变量说明
变量 |
说明 |
${SCHEDULERX_ENDPOINT} |
您部署应用的地域(Region)和对应的Endpoint。详情请参见Endpoint列表。比如addr-sh-internal.edas.aliyun.com |
${SCHEDULERX_NAMESPACE} |
namespace为命名空间ID,可以在控制台命名空间页面获取 |
${SCHEDULERX_GROUPID} |
groupId为应用ID,可以在控制台应用管理页面获取 |
${SCHEDULERX_APPKEY} |
appKey为应用key,可以在控制台应用管理页面获取 |
接入验证
- 在阿里云容器服务Kubernetes中创建一个无状态deployment
创建完成后,会看到有两个镜像,其中一个是业务主容器的镜像,另一个是scheudulerx-agent的sidecar镜像。
- 接入成功验证
如果配置正确,在schedulerx控制台可以看到实例数
点击“查看实例”,可以看到接入方式是sidecar
- 如果接入失败,查看pod日志
阿里云容器服务Kubernetes,可以直接在控制台选中Container=schedulerx-agent来查看日志,比如:
非阿里云Kubernetes集群,可以通过命令行查看日志,比如:
任务测试
shell任务
- 在SchedulerX控制台任务管理界面,创建任务,任务类型选择“shell”,执行模式选择“广播运行”,配置每分钟定时调度:
注:广播运行表示每次广播所有pod运行任务。
shell脚本参考如下,“exit 0”表示任务执行成功,“exit 1”表示任务执行失败
echo$0echo$1exit0
- 可以手动运行一次,查看历史记录
- 在任务历史记录中,查看任务实例详情,可以看到该shell脚本广播所有pod执行脚本成功
- 在任务历史记录中,查看日志,也直接在控制台看到所有pod执行该shell脚本的输出结果
python任务
- 在SchedulerX控制台任务管理界面,创建任务,任务类型选择“python”,执行模式选择“单机运行”,配置每分钟定时调度:
注:单机运行表示每次会随机选一个pod运行任务。
python脚本如下:
importsysprint('Hello World, python!') a=int(sys.argv[1]) b=int(sys.argv[2]) print('a='+str(a)) print('b='+str(b)) c=a+bprint('c='+str(c))
- 单机运行,通过查看历史记录,可以在任务实例列表,查看每次调度到哪台pod上
- 通过日志服务,可以查看python脚本的执行结果
http任务
- 前提
如果你的应用是非Java应用,可以将你的定时任务业务封装成http接口,通过schedulerx sidecar定时调度你的http接口。比如本文章中主业务容器“node-demo”暴露了一个http接口
- 在SchedulerX控制台任务管理界面,创建任务,任务类型选择“shell”,执行模式选择“单机运行”,配置每分钟定时调度:
shell脚本为:
curl 127.0.0.1:8088
- 单机运行,通过查看历史记录,可以在任务实例列表,查看每次调度到哪台pod上
- 通过日志服务,可以查看调用http服务的结果