K8s任务

更新时间:

SchedulerX支持定时调度程序、多语言脚本和HTTP接口,也支持调度原生的K8s Job或者Pod。本文介绍如何在Kubernetes环境中部署SchedulerX。

前提条件

接入SchedulerX,具体操作,请参见在Kubernetes集群中部署SchedulerX

创建K8s任务

Shell脚本

如果想通过Pod运行Shell脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Shell-Script,镜像默认是busybox(也可以替换为自己的镜像)。

1

单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-shell-{JobId}。7

在SchedulerX控制台的任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。7

Python脚本

如果想通过Pod运行Python脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Python-Script,镜像默认是Python(也可以替换为自己的镜像)。

2

单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-python-{JobId}。7

在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。8

PHP脚本

如果想通过Pod运行PHP脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Php-Script,镜像默认是php:7.4-cli(也可以替换为自己的镜像)。

3

单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-php-{JobId}。12

在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志8

Node.js脚本

如果想通过Pod运行Node.js脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Node.js-Script,镜像默认是node:16(也可以替换自己的镜像)。

4

单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-node-{JobId}。8

在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。8

Job-YAML

通过SchedulerX也可以运行K8s原生的Job,任务类型选择K8s,资源类型选择Job-YAML。

5

单击运行一次,在Kubernetes集群中可以看到Job和Pod启动成功。8

在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。8

重要

通过SchedulerX运行K8s Job,不建议使用CronJob,定时调度需要使用SchedulerX来配置,否则无法收集每次Pod的执行历史和日志。

Pod-YAML

通过SchedulerX也可以运行K8s原生的Pod,任务类型选择K8s,资源类型选择Pod-YAML。

6

单击运行一次,在Kubernetes集群中可以看到Pod启动成功。9

在SchedulerX控制台的任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。9

重要

通过SchedulerX运行K8s Pod,建议不要运行长周期的Pod(比如Web应用,一旦启动永远不会结束),重启策略需要设置成Never(否则Pod会不断重启)。

通过环境变量获取任务参数

SchedulerX系统支持将任务参数预先配置到环境变量中,这样无论是脚本任务、Pod还是Job,都可以便捷地通过读取环境变量来获取所需的各项参数信息。

说明

Schedulerx-Agent 版本需要大于等于1.10.14。

key

描述

SCHEDULERX_JOB_NAME

任务名称。

SCHEDULERX_SCHEDULE_TIMESTAMP

调度时间的时间戳。

SCHEDULERX_DATA_TIMESTAMP

数据时间的时间戳。

SCHEDULERX_WORKFLOW_INSTANCE_ID

如果有配置工作流,可以获取工作流实例ID。

SCHEDULERX_JOB_PARAMETERS

任务参数。

SCHEDULERX_INSTANCE_PARAMETERS

任务实例参数。

SCHEDULERX_JOB_SHARDING_PARAMETER

如果是分片任务,可以获取到分片参数。

如下所示,获取SchedulerX任务参数值:

image

优势

相较于K8s原生的Job功能,采用SchedulerX调度K8s Job具有以下显著优势:

可在线编辑的脚本Pod

K8s Job常用场景是用来做数据处理和运维,一般以脚本实现居多。原生的使用方式需要把脚本打包到镜像里,在YAML文件中配置脚本命令。每当需要修改脚本时,研发人员不得不经历重新构建镜像并再次发布的繁琐过程。比如:

apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["sh",  "/root/hello.sh"]
      restartPolicy: Never
  backoffLimit: 4

运用SchedulerX进行K8s任务管理时,您无需构建镜像或编写YAML配置脚本。只需在控制台直接编辑支持Shell、Python、PHP和Node.js等多种语言的脚本内容,系统便会自动将其以Pod方式运行。若需对脚本进行更新,仅需在控制台重新编辑并保存,下次调度时新版本脚本将自动生效,显著提升开发和管理K8s Job的工作效率。同时,借助SchedulerX的K8s任务功能,完全屏蔽了容器相关的细节,对于不熟悉容器服务的研发人员而言,这项改进无疑显著提升了开发效率,为他们带来了极大的便利。

如下:

image

可视化任务编排

当前在K8s生态系统中,Argo作为一种主流的工作流编排解决方案被广泛应用。例如:

# The following workflow executes a diamond workflow
# 
#   A
#  / \
# B   C
#  \ /
#   D
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dag-diamond-
spec:
  entrypoint: diamond
  templates:
  - name: diamond
    dag:
      tasks:
      - name: A
        template: echo
        arguments:
          parameters: [{name: message, value: A}]
      - name: B
        depends: "A"
        template: echo
        arguments:
          parameters: [{name: message, value: B}]
      - name: C
        depends: "A"
        template: echo
        arguments:
          parameters: [{name: message, value: C}]
      - name: D
        depends: "B && C"
        template: echo
        arguments:
          parameters: [{name: message, value: D}]

  - name: echo
    inputs:
      parameters:
      - name: message
    container:
      image: alpine:3.7
      command: [echo, "{{inputs.parameters.message}}"]

借助SchedulerX的工作流功能,您能够通过直观的可视化界面,采用简单的鼠标拖拽操作来高效编排K8s任务流程,如下图所示。

image在使用体验上,相较于Argo,SchedulerX更为便捷易用,尤其是在运行时,它提供了可视化的工作流图展示,能够清晰地追踪任务进度,方便快速识别和定位任务受阻的具体环节,如下图所示显示出具体的任务失败:

image

报警监控

通过SchedulerX对您的Pod和Job进行调度,能够充分利用其内置的监控报警机制,实现高效的任务状态跟踪与异常预警。

  • 支持的报警通道:短信、电话、邮件、WebHook(钉钉/企业微信/飞书)。

  • 支持的报警策略:失败报警、执行超时报警。

日志服务

使用SchedulerX调度您的Pod和Job时,无需额外开通日志服务,系统将自动收集Pod运行期间产生的日志。一旦Pod执行失败,您可直接在SchedulerX控制台查看到详细的失败原因并分析,实现高效便捷的问题定位与调试。

image

监控大盘

通过SchedulerX来调度您的Pod和Job,无需另行开通Prometheus服务,即可查看内置的任务监控功能。

image

离在线混布

对于诸如订单处理等对实时性要求较高的在线定时任务,可在同一进程内直接调用方法进行高效处理,与在线业务无缝集成。而对于实时性要求较低但资源消耗较大的离线定时任务,如报表定时导出,可通过编写脚本并以启动独立Pod的方式运行。SchedulerX平台支持Java和Kubernetes任务类型,能够实现离线与在线定时任务的混布调度,灵活满足不同需求。