簡介
分布式任務排程 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:
- CRDs安裝正确:運作指令“kubectl get crd | grep schedulerx”,應該列印出3個CRD,分别是:
核心概念
使用者使用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,無法删除分組;
- 分組一旦建立,不允許更新,如果需要更新請删除後建立;
建立/更新/删除任務
ack-schedulerx提供CRD建立/更新/删除任務,建立和更新都是apply自定義資源,删除就是删除該資源,CRD資訊如下:
- kind: XCronJob
group | 是 | 該任務所屬分組名 | ||
jobType | java | 否 | 任務類型,指實作任務的程式設計語言,目前支援 java, python, shell, go | |
jobProcessor | 否(有條件) | 任務實作全限定類名,如果jobType == java, 該字段必填 | ||
content | 任務實作代碼,如果jobType != java,該 字段必填 | |||
executeMode | standalone | 任務執行模式,目前支援standalone, broadcast, parallel, grid, batch,具體意思見 執行模式文檔 , demo程式見 | ||
description | 任務描述 | |||
timeType | int | 1 | 任務排程表達式類型,目前支援cron(1),fix_rate(3), second_delay(4) | |
timeExpression | 任務排程表達式,比如: cron: 0 0 2 ? 要確定頻率大于分鐘級; fix_rate: 30(>0) 機關是s, 每30s運作一次; second_delay: 2(1-60) 機關是s, 上次運作結束後延遲2s運作下次 | |||
parameters | 任務參數,可以在任務運作時從上下文擷取 | |||
maxConcurrency | 最大同時運作任務執行個體數,預設是1,超過該并發度的排程執行個體會被忽略 | |||
retryMaxAttempts | 失敗重試次數,預設為0,不重置 | |||
retryInterval | 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
任務管理控制台 檢視任務建立情況,jobId可以友善後續在控制台進行任務和執行曆史的搜尋:
建立/更新/删除用戶端
ack-schedulerx提供CRD建立/更新/删除用戶端,建立和更新都是apply自定義資源,删除就是删除該資源,CRD資訊如下:
- kind: XAgentPool
replicas | 執行器個數 | |||
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應用
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
</dependency>
(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即用戶端鏡像。
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控制台進行配置。