SchedulerX支持定时调度程序、多语言脚本和HTTP接口,也支持调度原生的K8s Job或者Pod。本文介绍如何在Kubernetes环境中部署SchedulerX。
使用场景
使用SchedulerX调度K8s Job有如下优势。
可在线编辑脚本Pod
K8s Job常用于数据处理和运维场景,一般以脚本实现居多。原生的使用方式需要将脚本打包到镜像里,在YAML文件中配置脚本命令。如果要修改脚本,需要重新构建镜像和发布。如下所示。
而使用SchedulerX则无需构建镜像和编写YAML脚本,只需在SchedulerX控制台直接编辑脚本(Shell、Python、PHP或Node.js),即可自动以Pod方式运行脚本。如果要修改脚本,只需在SchedulerX控制台重新编辑脚本,下次调度会自动生效,继而提高K8s Job的开发效率。同时,使用SchedulerX的K8s任务时,您无需了解容器底层细节,可以低门槛使用容器技术。
可视化任务编排
K8s中主流解决方案是使用argo进行工作流编排,如下所示。
SchedulerX支持通过可视化界面拖拽进行K8s任务的编排,相较于当前主流的、通过代码进行工作流编排的解决方案更为便捷。此外,任务运行时,可视化的工作流图可以帮助您快速排查任务卡点,提高运维效率。
报警监控
使用SchedulerX来调度Pod或者Job,可以复用SchedulerX的监控报警功能。
支持的报警通道:短信、电话、邮件、Webhook(钉钉/企业微信/飞书)。
支持的报警策略:失败报警、执行超时报警。
日志服务
使用SchedulerX调度Pod或者Job时,无需额外开通日志服务,就可以自动采集Pod运行的日志。如果Pod运行失败,您可以直接在SchedulerX控制台排查Pod执行失败的原因。
在日志服务页面,左侧为任务实例列表,可按状态、应用 ID 等条件筛选任务,任务类型为 Job-YAML,状态包括成功和失败。右侧为日志查看面板,支持按搜索字段和时间范围检索日志。失败任务的关键日志记录包含以下错误信息:
job processor exec fail.nullExitCode: 255 Reason: ErrorArgument to accuracy must be greater than zero at /usr/local/lib/perl5/5.34.0/bignum.pm line 215
监控大盘
您可以通过SchedulerX自带的任务监控大盘实时观察您的任务。
离线在线混和部署
SchedulerX提供离在线定时任务混布调度功能,支持Java和K8s任务类型。一个业务应用通常包括多个定时任务。如果定时任务调度频率较高,可以直接使其与业务应用处于同一进程中。但进程内调用会消耗在线应用自身的CPU和内存,无法与在线业务隔离。所以,当一个定时任务资源消耗大且调度频率不高(例如每小时或每天运行一次)时,可以新增一个Pod运行该定时任务,使之与原来的在线应用处于不同进程中。
方式一:通过Deployment部署SchedulerX(推荐)
使用非Java应用类型时,可以通过Deployment部署一个schedulerx-agent.yaml。SchedulerX会以单独的Pod启动应用。流程和原理如下图所示。

前提条件
已创建Kubernetes集群(阿里云容器服务ACK集群或自建Kubernetes集群)。具体操作,请参见创建Kubernetes集群。
创建应用时,版本选择专业版,开启日志服务。在实例繁忙配置中,将 load5 设为 0,内存使用率设为 90%,磁盘使用率设为 95%,并开启是否触发繁忙机器开关。
步骤一:配置ServiceAccount
SchedulerX K8s任务依赖于ServiceAccount进行验证与授权,且默认使用Namespace的SchedulerX ServiceAccount运行K8s任务。
在K8s集群里和对应的Namespace下,仅需运行一次schedulerx-serviceaccount.yaml。如果Namespace之间需要隔离,仅调度目标Namespace下的Pod或者Job,可运行如下YAML示例代码。
如果有跨Namespace调度的需求,需使用ClusterRole和ClusterRoleBinding。
步骤二:安装schedulerx-agent.yaml
schedulerx-agent.yaml配置如下所示。
SchedulerX agent image变量说明
芯片架构 | 区域 | 说明 |
X86_64 | 中国地区 | schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64 |
中国境外 | schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-amd64 | |
ARM64 | 中国地区 | schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-arm64 |
中国境外 | schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-arm64 |
SchedulerX agent env变量说明
变量 | 说明 |
${SCHEDULERX_ENDPOINT} | 您部署应用的地域(Region)和对应的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,请参见Endpoint列表。 |
${SCHEDULERX_NAMESPACE} | Namespace为命名空间ID,可以在SchedulerX控制台的命名空间页面获取。在分布式任务调度平台控制台左侧导航栏单击命名空间,在命名空间列表的命名空间ID列获取目标命名空间对应的 ID 值,用于替换配置中的 |
${SCHEDULERX_GROUPID} | GroupId为应用ID,可以在SchedulerX控制台应用管理页面获取。登录 SchedulerX 控制台,在应用管理页面的应用列表中,查看目标应用对应的应用ID,即为该参数值。 |
${SCHEDULERX_APPKEY} | AppKey为应用Key,可以在SchedulerX控制台应用管理页面获取。该值可在 SchedulerX 控制台应用管理页面的应用列表中,从应用key列获取。 |
部署Deployment完成后,如果可以在SchedulerX控制台应用管理页面查看实例,表明接入成功。
方式二:通过helm包部署SchedulerX
前提条件
已创建Kubernetes集群(阿里云容器服务ACK集群或自建Kubernetes集群)。具体操作,请参见创建Kubernetes集群。
步骤一:下载SchedulerX helm
执行如下命令,下载SchedulerX helm包。
wget https://schedulerx2.oss-cn-hangzhou.aliyuncs.com/helm/schedulerxchart-2.0.0.tgz步骤二:安装schedulerx helm包
在分布式任务调度平台获取应用的接入参数。
登录分布式任务调度平台。
在顶部菜单栏选择地域。
在左侧导航栏,单击应用管理。
在应用管理页面的操作列,单击接入配置。在接入配置页面左上角,选择k8s。
执行如下安装命令。
说明安装命令的接入参数需要替换为目标应用的接入参数。
接入配置中的镜像地址默认为公网中amd架构的镜像。您需要根据自身机器所在的区域以及机器架构选择合适的镜像地址。
helm install schedulerxchart schedulerxchart-2.0.0.tgz \ --set SCHEDULERX_ENDPOINT=acm.aliyun.com\ ,SCHEDULERX_NAMESPACE=f856c3f8-a15c-4a7e-9b4e-f812a9f8****\ ,SCHEDULERX_GROUPID=k8s-test3\ ,SCHEDULERX_APPKEY=****\ ,SCHEDULERX_AGENT_IMAGE=schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64安装过程如下所示。
[root@tangtao-cenos-dev-2 ~]# helm install schedulerxchart schedulerxchart-2.0.0.tgz \ > --set SCHEDULERX_ENDPOINT=acm.aliyxxx \ > ,SCHEDULERX_NAMESPACE=f856c3f8-a15c-4a7e-9b4e-fxxx \ > ,SCHEDULERX_GROUPID=k8sxxx \ > ,SCHEDULERX_APPKEY=VRW7waCaeZlxxx \ > ,SCHEDULERX_AGENT_IMAGE=registry.cn-hangzhou.aliyuncs.com/schxxx NAME: schedulerxchart LAST DEPLOYED: Fri Oct 21 14:21:25 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None [root@tangtao-cenos-dev-2 ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION schedulerxchart default 1 2022-10-21 14:21:25.978497197 +0800 CST deployed schedulerxchart-2.0.0 1.8.0 [root@tangtao-cenos-dev-2 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE schedulerx-agent-d8cf5bd55-f4nkt 1/1 Running 0 13sSchedulerX agent image变量说明
芯片架构
区域
说明
x86_64
中国地区
schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64
中国境外
schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-amd64
arm64
中国地区
schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-arm64
中国境外
schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-arm64
SchedulerX agent env变量说明
变量
说明
${SCHEDULERX_ENDPOINT}
您部署应用的地域(Region)和对应的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,请参见Endpoint列表。
${SCHEDULERX_NAMESPACE}
Namespace为命名空间ID,可以在SchedulerX控制台的命名空间页面获取。在分布式任务调度平台控制台左侧导航栏单击命名空间,在命名空间列表的命名空间ID列获取目标命名空间对应的 ID 值,用于替换配置中的
${SCHEDULERX_NAMESPACE}。${SCHEDULERX_GROUPID}
GroupId为应用ID,可以在SchedulerX控制台应用管理页面获取。登录 SchedulerX 控制台,在应用管理页面的应用列表中,查看目标应用对应的应用ID,即为该参数值。
${SCHEDULERX_APPKEY}
AppKey为应用Key,可以在SchedulerX控制台应用管理页面获取。该值可在 SchedulerX 控制台应用管理页面的应用列表中,从应用key列获取。
SCHEDULERX_AGENT_IMAGE
镜像地址。
安装完成后,可以通过SchedulerX控制台查看实例。
方式三:通过Java SDK部署SchedulerX
如果您的应用为Java应用,除K8s任务外,还需要调度Java程序,您可以使用Java SDK部署。SchedulerX和您的在线业务处于一个进程中。流程和原理如下图所示。
前提条件
创建Kubernetes集群(阿里云容器服务ACK集群或自建Kubernetes集群)。具体操作,请参见创建Kubernetes集群。
接入SchedulerX
关于SDK接入,请参见Spring Boot应用接入SchedulerX。
使用K8s任务还需要依赖一个schedulerx-plugin-kubernetes,如下所示。
schedulerx2.version使用最新客户端版本,更多信息,请参见发布记录。
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-plugin-kubernetes</artifactId>
<version>${schedulerx2-plugin-kubernetes.version}</version>
</dependency>后续步骤:创建K8s任务
运行以下脚本时,您需要在任务管理页面创建一个K8s任务。具体操作,请参见任务管理。
Shell脚本
如果您想通过Pod运行Shell脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型为Shell-Script,使用默认镜像busybox,或替换为您自建的镜像。
在创建任务页面的基本配置步骤中,设置以下参数:
任务名:填写
Shell-Script应用ID:选择目标应用
任务类型:选择 k8s
资源类型:选择 Shell-Script
脚本内容:输入
echo 'Hello, World!'模版类型:选择 普通模板
镜像:填写
busyboxmountPath:填写
script/shellimagePullPolicy:选择 IfNotPresent
文件格式:选择 unix
执行模式:选择 单机运行
优先级:选择 中
设置完成后单击下一步,完成定时配置和通知配置后提交任务。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-shell-{JobId}。
[root@schedulerx-agent-xxx /]
# kubectl get pod | grep schedulerx
schedulerx-agent-69d448d974-xzjw6 1/1 Running 0 18h
schedulerx-shell-1461 0/1 Completed 0 2m37s
[root@schedulerx-agent-xxx /]
# kubectl logs schedulerx-shell-1461
Hello, World!
hello schedulerx!
[root@schedulerx-agent-xxx /]
#在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以查看Pod运行的日志。
Python脚本
如果您想通过Pod运行Python脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型为Python-Script,使用默认镜像Python,或替换为您自建的镜像。
在创建任务页面的基本配置步骤中,配置以下参数:
任务名:填写
Python-Script应用ID:选择目标应用
任务类型:选择k8s
资源类型:选择Python-Script
在代码编辑器中输入 Python 脚本,例如
import sys和print('Hello, World!')模板类型:选择普通模板
镜像:填写
pythonmountPath:填写
script/pythonimagePullPolicy:选择IfNotPresent
文件格式:选择unix
执行模式:选择单机运行
优先级:选择中
配置完成后单击下一步,完成定时配置和通知配置后保存任务。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-python-{JobId}。
[root@schedulerx-agent-xxx /]
# kubectl get pod | grep schedulerx
schedulerx-agent-69d448d974-xzjw6 1/1 Running 0 18h
schedulerx-python-1463 0/1 Completed 0 5m37s
schedulerx-shell-1461 0/1 Completed 0 15m
[root@schedulerx-agent-xxx /]
# kubectl logs schedulerx-python-1463
Hello, World!
[root@schedulerx-agent-xxx /]
#在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
在任务实例记录页面可查看任务执行状态(成功或失败)。单击对应记录可打开日志面板,日志输出包含Hello, World!及pod status change to Succeeded等信息,表明 Python 脚本已在 Pod 中执行成功。
PHP脚本
如果您想通过Pod运行PHP脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型为PHP-Script,使用默认镜像php:7.4-cli,或替换为您自建的镜像。
在创建任务页面的基本配置步骤中,设置以下参数:
任务名:填写
PHP-Script应用ID:选择目标应用
任务类型:选择 k8s
资源类型:选择 Php-Script
在代码编辑器中输入 PHP 代码,例如
<?php echo 'Hello, World!'; ?>模板类型:选择 普通模板
镜像:填写
php:7.4-climountPath:填写
script/phpimagePullPolicy:选择 IfNotPresent
文件格式:选择 unix
执行模式:选择 单机运行
优先级:选择 中
设置完成后单击 下一步。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-php-{JobId}。
[root@schedulerx-agent-xxx xxx]
# kubectl get pod | grep schedulerx
schedulerx-agent-xxx xxx 1/1 Running 0 19h
schedulerx-php-1464 0/1 Completed 0 54s
schedulerx-python-1463 0/1 Completed 0 28m
schedulerx-shell-1461 0/1 Completed 0 38m
[root@schedulerx-agent-xxx xxx]
# kubectl logs schedulerx-xxx
Hello, World!
[root@schedulerx-agent-xxx xxx]
#在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以查看Pod运行的日志。
任务执行成功后,在任务实例记录页面可查看任务状态为成功。单击任务记录打开日志面板,日志输出 Hello, World!,pod 状态变为 Succeeded。
Node.js脚本
如果您想通过Pod运行Node.js脚本,您可以在任务管理页面创建一个K8s任务,选择任务管理为Nodejs-Script,使用默认镜像node:16,或替换为您自建的镜像。
在 SchedulerX 控制台创建任务,在基本配置步骤中配置以下参数:
任务名:
Nodejs-Script应用ID:选择目标应用
任务类型:k8s
资源类型:Nodejs-Script
在代码编辑器中输入
console.log("Hello, World!");模板类型:普通模板
镜像:
node:16mountPath:
script/nodeimagePullPolicy:IfNotPresent
文件格式:unix
执行模式:单机运行
优先级:中
完成后单击下一步。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-node-{JobId}。
[root@schedulerx-agent-xxx Z]# kubectl get pod | grep schedulerx
schedulerx-agent-6xxx 1/1 Running 0 19h
schedulerx-node-xxx 0/1 Completed 0 23s
schedulerx-php-xxx 0/1 Completed 0 4m57s
schedulerx-python-xxx 0/1 Completed 0 32m
schedulerx-shell-xxx 0/1 Completed 0 42m
[root@schedulerx-agent-6xxx Z]# kubectl logs schedulerx-node-xxx
Hello, World!在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
任务运行完成后,在任务实例记录页面可查看任务执行状态为成功。右侧日志面板中输出 Hello, World!,并显示 pod status change to Succeeded。
Job-YAML
通过SchedulerX也可以运行K8s原生的Job。您可以在任务管理页面创建一个K8s任务,选择资源类型为Job-YAML。
在创建任务页面的基本配置步骤中,配置以下参数:
任务名:
Job-YAML应用ID:选择已创建的应用
任务类型:k8s
资源类型:Job-YAML
执行模式:单机运行
优先级:中
在代码编辑器中输入以下 Kubernetes Job YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
restartPolicy: Never
backoffLimit: 4单击下一步进入定时配置。
单击运行一次,在Kubernetes集群中可以看到Job和Pod启动成功。
[root@schedulerx-agent-xxx /]
# kubectl get job
NAME COMPLETIONS DURATION AGE
pi 1/1 17s 6m5s
[root@schedulerx-agent-xxx /]
# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello 0/1 Completed 0 19h
pi--1-jgck5 0/1 Completed 0 6m8s
schedulerx-agent-xxx 1/1 Running 0 19h
schedulerx-node-1xxx 0/1 Completed 0 14m
schedulerx-php-14xxx 0/1 Completed 0 19m
schedulerx-python 0/1 Completed 0 46m
schedulerx-shell-xxx 0/1 Completed 0 56m
[root@schedulerx-agent-xxx /]
# kubectl logs pi--1-jgck5
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706
[root@schedulerx-agent-xxx /]
#在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
在任务实例记录页面可查看 Job-YAML 任务的执行状态(成功或失败),单击任务实例可打开日志面板,日志显示 taskMaster 初始化成功及任务计算输出结果。
CronJob-YAML
通过SchedulerX也可以运行K8s原生的CronJob。您可以在任务管理页面创建一个K8s任务,资源类型选择CronJob-YAML。
在基本配置页面,任务名填写 CronJob-YAML,任务类型选择 k8s。在 YAML 编辑器中输入 CronJob 定义,示例中配置 metadata.name: hello、schedule: "0/1 * * * *"、容器镜像 busybox:1.28、imagePullPolicy: IfNotPresent、执行命令 /bin/sh。执行模式选择单机运行,单击下一步。
单击运行一次,在任务实例记录页面可以看到Pod启动成功。
在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
日志显示 Pod 输出 Hello from the Kubernetes cluster,并记录状态变更为 Succeeded。
Pod-YAML
通过SchedulerX也可以运行K8s原生的Pod。您可以在任务管理页面创建一个K8s任务,资源类型选择Pod-YAML。
在创建任务页面的基本配置步骤中,配置以下参数:
任务名:
Pod-YAML应用ID:选择目标应用
任务类型:k8s
资源类型:Pod-YAML
在代码编辑器中输入 Kubernetes Pod YAML 定义,例如创建一个使用 busybox 镜像、执行 echo "hello world" 命令的 Pod。执行模式选择单机运行,优先级选择中,然后单击下一步。
单击运行一次,在Kubernetes集群中可以看到Pod启动成功。
[root@schedulerx-agent-xxx /]
# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello 0/1 Completed 0 2m39s
pi--1-jgck5 0/1 Completed 0 49m
schedulerx-agent-xxx 1/1 Running 0 20h
schedulerx-node-xxx 0/1 Completed 0 58m
schedulerx-php-1xxx 0/1 Completed 0 62m
schedulerx-pythoxxx 0/1 Completed 0 90m
schedulerx-shell 0/1 Completed 0 100m
[root@schedulerx-xxx /]
# kubectl logs hello
hello world
[root@schedulerx-agent-xxx /]
#在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
在任务实例记录页面可查看 Pod-YAML 类型任务的执行状态(成功或失败)。单击对应任务查看日志,日志输出包含 hello world 和 standalone taskMaster init success.,表示任务运行成功。
通过SchedulerX运行K8s Pod时,有如下注意事项。
免运行周期较长的Pod,例如Web应用,一旦启动永远不会结束。
建议将重启策略设置成Never,否则Pod会不断重启。