天天看點

# Schedulerx正式登陸Ali-k8s應用目錄

簡介

分布式任務排程 SchedulerX 是阿裡巴巴基于 Akka 架構自研的的分布式任務排程平台,今天正式登陸阿裡雲容器服務Kubernetes應用目錄,支援使用者以雲原生的方式擷取定時、工作流任務編排、分布式批量排程等功能,同時具有高可靠、海量任務、秒級排程能力,Schedulerx詳細資訊請檢視

産品文檔

了解更多。

本文将帶您快速了解如何在阿裡雲容器服務Kubernetes上使用Schedulerx,讓您在5min内以雲原生的方式獲得強大的任務排程能力。

前提條件

安裝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表示建立成功,此時可以登入

應用分組管理控制台

檢視分組建立情況:

# Schedulerx正式登陸Ali-k8s應用目錄

注意事項

  • 分組下如果任務數不為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可以友善後續在控制台進行任務和執行曆史的搜尋:

# Schedulerx正式登陸Ali-k8s應用目錄

建立/更新/删除用戶端

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正式登陸Ali-k8s應用目錄

解除安裝SchedulerX任務排程元件

容器服務控制台

左側導航欄中“應用 > 釋出”菜單,選擇Helm标簽頁,找到釋出名稱是ack-schedulerx的資料,點選對應的删除即可,有兩點注意一下:

  • 注意在删除之前請確定叢集内的所有XGroup,XCronJob,XAgentPool類型資源都已經删除完畢,否則無法删除CRDs,導緻下次安裝出現問題。
  • XGroup删除之後,對應的schedulerx應用分組不會自動删除,需要使用者到 手動删除。

更多

Schedulerx還支援報警,工作流排程,運作執行個體檢視,更多功能請檢視

Schedulerx控制台使用文檔

,登入Schedulerx控制台進行配置。