本文介绍如何在Kubernetes环境中部署SchedulerX,通过SchedulerX可以定时调度您的程序、多语言脚本和HTTP接口,也可以调度原生的K8s Job或者Pod。
前提条件
- 已存在Kubernetes集群(阿里云容器服务ACK集群或自建Kubernetes集群)。具体操作,请参见创建Kubernetes集群。
- 开通SchedulerX。
- 在分布式任务调度平台创建一个应用类型为K8s的应用。具体操作,请参见创建应用。
背景信息
使用SchedulerX调度K8s Job有如下优势:
可在线编辑的脚本Pod
K8s Job常用场景是用来做数据处理和运维,一般以脚本实现居多。原生的使用方式需要把脚本打包到镜像里,在YAML文件中配置脚本命令。如果要修改脚本,就需要重新构建镜像和发布,操作比较复杂。
而使用SchedulerX则无需构建镜像和写YAML脚本,只需要在SchedulerX控制台直接编辑脚本(Shell、Python、PHP和Node.js),即可自动以Pod方式运行脚本。如果要修改脚本,只需要在SchedulerX控制台重新编辑脚本,下次调度自动生效,从而提高了K8s Job的开发效率。同时,使用SchedulerX的K8s任务屏蔽了容器相关的细节,为不熟悉容器服务的用户提供便利。
可视化任务编排
SchedulerX支持通过可视化界面拖拽进行K8s任务的编排,相比于当前主流的通过代码进行工作流编排的解决方案来说,使用更便捷。而且在运行时,可视化的工作流图可以帮助您快速排查任务卡在哪个环节。

报警监控
使用SchedulerX来调度您的Pod或者Job,可以复用SchedulerX的监控报警功能。
- 支持的报警通道:短信、电话、邮件、Webhook(钉钉/企业微信/飞书)。
- 支持的报警策略:失败报警、执行超时报警。
日志服务

监控大盘

离在线混布
SchedulerX支持的Java和K8s任务类型,可以做到离在线定时任务混布调度。一个业务应用通常有很多定时任务,如果调度频率比较高,可以直接和业务应用在一个进程中,但进程内调用会消耗在线应用自身的cpu和内存,无法和在线业务做隔离。所以当一个定时任务非常耗资源,调度频率又不高(比如每小时/每天运行一次)时,可以通过新增一个Pod去运行,这样就和原来的在线应用不在一个进程中了。
步骤一:配置ServiceAccount
SchedulerX K8s任务依赖于ServiceAccount进行验证与授权,而且默认情况下,它使用所在Namespace的SchedulerX ServiceAccount运行K8s任务。
在K8s集群里和对应的Namespace下,运行schedulerx-serviceaccount.yaml(运行一次即可),格式参考如下。
如果每个Namespace做隔离,只能调度自己Namespace下的Pod或者Job,只需要运行如下YAML。
apiVersion: v1
kind: ServiceAccount
metadata:
name: schedulerx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: schedulerx-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch"]
- apiGroups: ["batch"]
resources: ["jobs","cronjobs"]
verbs: ["create","delete","get","list","patch","update","watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: schedulerx-binding
subjects:
- kind: ServiceAccount
name: schedulerx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: schedulerx-role
如果有跨Namespace调度的需求,RoleBinding需要配置多个Namespace。
apiVersion: v1
kind: ServiceAccount
metadata:
name: schedulerx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: schedulerx-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch"]
- apiGroups: ["batch"]
resources: ["jobs","cronjobs"]
verbs: ["create","delete","get","list","patch","update","watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: schedulerx-binding
subjects:
- kind: ServiceAccount
name: schedulerx
namespace: <NAMESPACE1>
- kind: ServiceAccount
name: schedulerx
namespace: <NAMESPACE2>
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: schedulerx-role
步骤二:接入SchedulerX
通过Deployment部署

apiVersion: apps/v1
kind: Deployment
metadata:
name: schedulerx-agent
labels:
app: schedulerx-agent
spec:
replicas: 1
selector:
matchLabels:
app: schedulerx-agent
template:
metadata:
labels:
app: schedulerx-agent
spec:
serviceAccountName: schedulerx
containers:
- name: schedulerx-agent
image: registry.cn-huhehaote.aliyuncs.com/schedulerx/agent:1.6.0-amd64
imagePullPolicy: Always
resources:
limits:
cpu: 200m
requests:
cpu: 200m
env:
- name: "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: "pod"
livenessProbe:
exec:
command: ["/bin/bash","/root/health.sh"]
timeoutSeconds: 30
initialDelaySeconds: 30
芯片架构 | 区域 | 说明 |
---|---|---|
x86_64 | 公网 | registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:1.6.0-amd64 |
阿里云VPC | registry-vpc.{regionId}.aliyuncs.com/schedulerx/agent:1.6.0-amd64 | |
arm64 | 公网 | registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:1.6.0-arm64 |
阿里云VPC | registry-vpc.{regionId}.aliyuncs.com/schedulerx/agent:1.6.0-arm64 |
变量 | 说明 |
---|---|
${SCHEDULERX_ENDPOINT} | 您部署应用的地域(Region)和对应的Endpoint。比如addr-sh-internal.edas.aliyun.com。详情请参见Endpoint列表。 |
${SCHEDULERX_NAMESPACE} | Namespace为命名空间ID,可以在SchedulerX控制台的命名空间页面获取。![]() |
${SCHEDULERX_GROUPID} | GroupId为应用ID,可以在SchedulerX控制台应用管理页面获取。![]() |
${SCHEDULERX_APPKEY} | AppKey为应用Key,可以在SchedulerX控制台应用管理页面获取。![]() |

通过Java SDK部署

关于SDK接入,请参见Spring Boot应用接入SchedulerX。
<dependency>
<groupId>com.alibaba.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.schedulerx</groupId>
<artifactId>schedulerx-plugin-kubernetes</artifactId>
<version>1.0.1</version>
</dependency>
部署您应用的Deployment文件,还需要配置serviceAccountName: schedulerx(参考上文非Java应用部署的schedulerx-agent.yaml)。
步骤三:创建K8s任务
Shell脚本



Python脚本



PHP脚本



Node.js脚本



Job-YAML



Pod-YAML


