共计 8399 个字符,预计需要花费 21 分钟才能阅读完成。
简介
分布式任务调度 SchedulerX 是阿里巴巴基于 Akka 架构自研的的分布式任务调度平台,今天正式登陆阿里云容器服务 Kubernetes 应用目录,支持用户以云原生的方式获取定时、工作流任务编排、分布式批量调度等功能,同时具有高可靠、海量任务、秒级调度能力,Schedulerx 详细信息请查看产品文档了解更多。
本文将带您快速了解如何在阿里云容器服务 Kubernetes 上使用 Schedulerx,让您在 5min 内以云原生的方式获得强大的任务调度能力。
前提条件
- 创建 Kubernetes 集群
- 开通 EDAS(免费)
- EDAS 组件中心开通 Schedulerx 组件(免费)
安装 SchedulerX 任务调度组件
- 登录容器服务 Kubernetes 版控制台;
- 在左侧导航栏选择市场 > 应用目录,在右侧选中 ack-schedulerx;
-
进入 ack-schedulerx 安装页面,点击 参数 标签页填写以下参数:
- controller.cluster_id(Kubernetes 集群 id)
-
controller.region_id(region id),目前支持的 region 如下:
- cn-shanghai
- cn-beijing
- cn-hangzhou
- cn-shenzhen
-
检查安装结果:
-
CRDs 安装正确:运行命令“kubectl get crd | grep schedulerx”,应该打印出 3 个 CRD,分别是:
- xgroups.schedulerx.alibabacloud.com
- xcronjobs.schedulerx.alibabacloud.com
- xagentpools.schedulerx.alibabacloud.com
- Controller 安装正确:运行命令“kubectl get pods -n schedulerx-system”,应该有一个运行状态为 Running 的 pod:
-
核心概念
用户使用 Schedulerx 需要理解 3 个概念:
分组
具有两个功能:
- 客户端的组织单位
- 任务的组织单位
任务
调度单位,用户需要创建任务,配置所属分组;
客户端
任务执行节点,用户需要引入 Schedulerx 客户端,实现对应 Java 任务处理接口,配置所属分组启动名为 SchedulerxWorker 的 Agent。
三者的关系就是 任务 只能调度到 对应分组 的客户端,比如我们创建分组 group-sample,在该分组下创建任务 job-sample,同时配置所属分组为 group-sample 来启动客户端 agent1, agent2, agent3,那么 job-sample 就会调度到 agent1, agent2, agent3 上面运行。
更多概念见名词解释。
创建分组
CRD 信息
ack-schedulerx 提供 CRD 创建分组,信息如下:
GVK 信息
group,version,kind 信息如下:
- apiVersion:schedulerx.alibabacloud.com/v1alpha1
- kind: XGroup
spec 信息
参数名 | 类型 | 默认值 | 是否必填 | 说明 |
---|---|---|---|---|
appName | string | 无 | 必填 | 应用名,用户自定义,用于后续管理 |
例子
创建 xgroup.yaml 文件,包含以下内容:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XGroup
metadata:
name: xgroup-sample
spec:
appName: ackApp
在 Kubernetes 中运行以下命令:
kubectl apply -f xgroup.yaml
查看 xgroup 资源:
kctl get xgroup xgroup-sample -o yaml
打印结果如下:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XGroup
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"schedulerx.alibabacloud.com/v1alpha1","kind":"XGroup","metadata":{"annotations":{},"name":"xgroup-sample","namespace":"default"},"spec":{"appName":"ackApp"}}
creationTimestamp: "2019-09-19T04:21:12Z"
finalizers:
- GroupCleanup
generation: 1
name: xgroup-sample
namespace: default
resourceVersion: "143176160"
selfLink: /apis/schedulerx.alibabacloud.com/v1alpha1/namespaces/default/xgroups/xgroup-sample
uid: e9a1fb81-da94-11e9-a156-be9f1a43fbb7
spec:
appName: ackApp
status:
appGroupId: 283
conditions:
- lastTransitionTime: "2019-09-19T04:21:12Z"
lastUpdateTime: "2019-09-19T04:21:12Z"
reason: CreateGroupSuccess
status: "True"
type: Ready
看到 status 中 conditions 中 Ready 为 true 表示创建成功,此时可以登录应用分组管理控制台查看分组创建情况:
注意事项
- 分组下如果任务数不为 0,或者客户端数量不为 0,无法删除分组;
- 分组一旦创建,不允许更新,如果需要更新请删除后创建;
创建 / 更新 / 删除任务
CRD 信息
ack-schedulerx 提供 CRD 创建 / 更新 / 删除任务,创建和更新都是 apply 自定义资源,删除就是删除该资源,CRD 信息如下:
GVK 信息
group,version,kind 信息如下:
- apiVersion:schedulerx.alibabacloud.com/v1alpha1
- kind: XCronJob
spec 信息
参数名 | 类型 | 默认值 | 是否必填 | 说明 |
---|---|---|---|---|
group | string | 无 | 是 | 该任务所属分组名 |
jobType | string | java | 否 | 任务类型,指实现任务的编程语言,当前支持 java, python, shell, go |
jobProcessor | string | 无 | 否(有条件) | 任务实现全限定类名,如果 jobType == java,该字段必填 |
content | string | 无 | 否(有条件) | 任务实现代码,如果 jobType != java,该 字段必填 |
executeMode | string | standalone | 否 | 任务执行模式,当前支持 standalone, broadcast, parallel, grid, batch,具体意思见执行模式文档,demo 程序见 |
description | string | 无 | 否 | 任务描述 |
timeType | int | 1 | 否 | 任务调度表达式类型,当前支持 cron(1),fix_rate(3), second_delay(4) |
timeExpression | string | 无 | 是 | 任务调度表达式,比如:cron: 0 0 2 ? 要确保频率大于分钟级; fix_rate: 30(>0) 单位是 s, 每 30s 运行一次; second_delay: 2(1-60) 单位是 s, 上次运行结束后延迟 2s 运行下次 |
parameters | string | 无 | 否 | 任务参数,可以在任务运行时从上下文获取 |
maxConcurrency | int | 1 | 否 | 最大同时运行任务实例数,默认是 1,超过该并发度的调度实例会被忽略 |
retryMaxAttempts | int | 0 | 否 | 失败重试次数,默认为 0,不重置 |
retryInterval | int | 30 | 否 | 失败重试间隔,单位 s,默认 30s |
例子
创建 xcronjob.yaml 文件,包含以下内容:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XCronJob
metadata:
name: xcronjob-sample
spec:
group: xgroup-sample
jobType: java
jobProcessor: processor.SimpleJobProcessor
executeMode: standalone
timeExpression: 0 0 2 * * ?
可以看到指定的 group 是刚刚创建的 group,默认使用 cron 调度表达式,java 任务类型,处理的接口类名是 processor.SimpleJobProcessor,在 Kubernetes 中运行以下命令:
kubectl apply -f xcronjob.yaml
查看 xcronjob 资源:
kctl get xcronjob xcronjob-sample -o yaml
打印结果如下:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XCronJob
metadata:
creationTimestamp: "2019-09-19T06:33:13Z"
finalizers:
- JobCleanup
generation: 1
name: xcronjob-sample
namespace: default
ownerReferences:
- apiVersion: schedulerx.alibabacloud.com/v1alpha1
blockOwnerDeletion: true
controller: true
kind: XGroup
name: xgroup-sample
uid: e9a1fb81-da94-11e9-a156-be9f1a43fbb7
resourceVersion: "143570391"
selfLink: /apis/schedulerx.alibabacloud.com/v1alpha1/namespaces/default/xcronjobs/xcronjob-sample
uid: 5b5e6e94-daa7-11e9-a76d-4af3350b44d3
spec:
executeMode: standalone
group: xgroup-sample
jobProcessor: processor.SimpleJobProcessor
jobType: java
timeExpression: 0 0 2 * * ?
status:
conditions:
- lastTransitionTime: "2019-09-19T06:33:13Z"
lastUpdateTime: "2019-09-19T06:33:14Z"
reason: JobUpdateSuccess
status: "True"
type: Ready
jobId: 1304
看到 status 中 conditions 中 Ready 为 true 表示创建成功,此时可以登录任务管理控制台查看任务创建情况,jobId 可以方便后续在控制台进行任务和执行历史的搜索:
创建 / 更新 / 删除客户端
CRD 信息
ack-schedulerx 提供 CRD 创建 / 更新 / 删除客户端,创建和更新都是 apply 自定义资源,删除就是删除该资源,CRD 信息如下:
GVK 信息
group,version,kind 信息如下:
- apiVersion:schedulerx.alibabacloud.com/v1alpha1
- kind: XAgentPool
spec 信息
参数名 | 类型 | 默认值 | 是否必填 | 说明 |
---|---|---|---|---|
group | string | 无 | 是 | 该任务所属分组名 |
replicas | int | 无 | 是 | 执行器个数 |
template | PodSpec | 无 | 是 | 任务执行器 Pod 模板 |
客户端开发
程序开发
开发 Schedulerx 客户端主要做 2 件事:
- 初始化 SchedulerxWorker
- 新建实现任务调度的类
初始化 SchedulerxWorker
针对不同应用,在初始化 SchedulerxWorker 的时候会有所区别,下面分别说明:
1、独立 Java 和 Spring 应用
(1)在应用程序的 pom.xml 文件中添加 SchedulerxWorker 依赖
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-worker</artifactId>
<version>${schedulerx2.version}</version>
</dependency>
其中 ${schedulerx2.version}版本见版本说明,使用 ack-schedulerx 需要至少使用 1.0.9 版本。
(2)初始化 SchedulerxWorker 或者作为一个 bean 注入
private static void initSchedulerxWorker() throws Exception {SchedulerxWorker schedulerxWorker = new SchedulerxWorker();
schedulerxWorker.init();}
2、Springboot 应用
(1)在应用程序的 pom.xml 文件中添加 SchedulerxWorker 依赖
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
</dependency>
其中 ${schedulerx2.version}版本见版本说明,使用 ack-schedulerx 需要至少使用 1.0.9 版本。
(2)初始化 SchedulerxWorker
新建实现任务调度的类
package processor;
import com.alibaba.schedulerx.worker.domain.JobContext;
import com.alibaba.schedulerx.worker.processor.JavaProcessor;
import com.alibaba.schedulerx.worker.processor.ProcessResult;
/**
* @author yanxun on 2019/9/2.
*/
public class SimpleJobProcessor extends JavaProcessor {
@Override
public ProcessResult process(JobContext context) throws Exception {System.out.println("hello schedulerx2.0");
return new ProcessResult(true);
}
}
更多类型见 Demo 示例。
镜像制作
打包上面程序,启动 Schedulerx 即可,下面是一个 Dockerfile 例子:
FROM openjdk:8-jdk-alpine
COPY ./target/schedulerx-k8s-demo-1.0-SNAPSHOT-spring-boot.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
为方便大家快速体验,我们已经将例子中的镜像上传供大家使用:
registry.cn-shanghai.aliyuncs.com/schedulerx/demo:latest
例子
创建 xagentpool.yaml 文件,包含以下内容:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XAgentPool
metadata:
name: xagentpool-sample
spec:
group: xgroup-sample
replicas: 2
template:
containers:
- name: standalone
image: registry.cn-shanghai.aliyuncs.com/schedulerx/demo:latest
可以看到指定的 group 是刚刚创建的 group,运行两个执行器,执行器镜像为 image,该 image 即客户端镜像。
在 Kubernetes 中运行以下命令:
kubectl apply -f xagentpool.yaml
查看 xagentpool 资源:
kctl get xagentpool xagentpool-sample -o yaml
打印结果如下:
apiVersion: schedulerx.alibabacloud.com/v1alpha1
kind: XAgentPool
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"schedulerx.alibabacloud.com/v1alpha1","kind":"XAgentPool","metadata":{"annotations":{},"name":"xagentpool-sample","namespace":"default"},"spec":{"group":"xgroup-sample","replicas":2,"template":{"containers":[{"image":"registry.cn-shanghai.aliyuncs.com/schedulerx/demo:latest","name":"standalone"}]}}}
creationTimestamp: "2019-09-25T10:11:39Z"
generation: 1
name: xagentpool-sample
namespace: default
ownerReferences:
- apiVersion: schedulerx.alibabacloud.com/v1alpha1
blockOwnerDeletion: true
controller: true
kind: XGroup
name: xgroup-sample
uid: c920a50b-df7c-11e9-a76d-4af3350b44d3
resourceVersion: "170986882"
selfLink: /apis/schedulerx.alibabacloud.com/v1alpha1/namespaces/default/xagentpools/xagentpool-sample
uid: dd83910f-df7c-11e9-a156-be9f1a43fbb7
spec:
group: xgroup-sample
replicas: 2
template:
containers:
- image: registry.cn-shanghai.aliyuncs.com/schedulerx/demo:latest
name: standalone
resources: {}
status:
conditions:
- lastTransitionTime: "2019-09-25T10:11:40Z"
lastUpdateTime: "2019-09-25T10:11:40Z"
reason: update deployment sucess
status: "True"
type: Ready
看到 status 中 conditions 中 Ready 为 true 表示创建成功,实际上,每个 agentPool 的创建都会在相同命名空间下创建名为[agentPoolName]-deployment 的 Deployment,可以自行查看,除此之外可以登录应用分组管理控制台查看执行器启动情况,是否正常连接到 schedulerx 客户端,可以看到已经正常启动两个客户端:
卸载 SchedulerX 任务调度组件
容器服务控制台左侧导航栏中“应用 > 发布”菜单,选择 Helm 标签页,找到发布名称是 ack-schedulerx 的数据,点击对应的删除即可,有两点注意一下:
- 注意在删除之前请确保集群内的所有 XGroup,XCronJob,XAgentPool 类型资源都已经删除完毕,否则无法删除 CRDs,导致下次安装出现问题。
- XGroup 删除之后,对应的 schedulerx 应用分组不会自动删除,需要用户到应用分组管理控制台手动删除。
更多
Schedulerx 还支持报警,工作流调度,运行实例查看,更多功能请查看 Schedulerx 控制台使用文档,登录 Schedulerx 控制台进行配置。
本文作者:黄晓萌
阅读原文
本文为云栖社区原创内容,未经允许不得转载。