K8s任务
SchedulerX支持定时调度程序、多语言脚本和HTTP接口,也支持调度原生的K8s Job或者Pod。本文介绍如何在Kubernetes环境中部署SchedulerX。
前提条件
接入SchedulerX,具体操作,请参见在Kubernetes集群中部署SchedulerX。
创建K8s任务
Shell脚本
如果想通过Pod运行Shell脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Shell-Script,镜像默认是busybox(也可以替换为自己的镜像)。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-shell-{JobId}。
在SchedulerX控制台的任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
Python脚本
如果想通过Pod运行Python脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Python-Script,镜像默认是Python(也可以替换为自己的镜像)。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-python-{JobId}。
在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
PHP脚本
如果想通过Pod运行PHP脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Php-Script,镜像默认是php:7.4-cli(也可以替换为自己的镜像)。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-php-{JobId}。
在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志
Node.js脚本
如果想通过Pod运行Node.js脚本,不需要自己构建镜像,只需要在任务管理创建一个K8s任务,资源类型选择Node.js-Script,镜像默认是node:16(也可以替换自己的镜像)。
单击运行一次,在Kubernetes集群中可以看到Pod启动,Pod名称为schedulerx-node-{JobId}。
在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
Job-YAML
通过SchedulerX也可以运行K8s原生的Job,任务类型选择K8s,资源类型选择Job-YAML。
单击运行一次,在Kubernetes集群中可以看到Job和Pod启动成功。
在SchedulerX控制台任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
通过SchedulerX运行K8s Job,不建议使用CronJob,定时调度需要使用SchedulerX来配置,否则无法收集每次Pod的执行历史和日志。
Pod-YAML
通过SchedulerX也可以运行K8s原生的Pod,任务类型选择K8s,资源类型选择Pod-YAML。
单击运行一次,在Kubernetes集群中可以看到Pod启动成功。
在SchedulerX控制台的任务管理页面可以查询历史执行记录,也可以看到Pod运行的日志。
通过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任务参数值:
优势
相较于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任务功能,完全屏蔽了容器相关的细节,对于不熟悉容器服务的研发人员而言,这项改进无疑显著提升了开发效率,为他们带来了极大的便利。
如下:
可视化任务编排
当前在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任务流程,如下图所示。
在使用体验上,相较于Argo,SchedulerX更为便捷易用,尤其是在运行时,它提供了可视化的工作流图展示,能够清晰地追踪任务进度,方便快速识别和定位任务受阻的具体环节,如下图所示显示出具体的任务失败:
报警监控
通过SchedulerX对您的Pod和Job进行调度,能够充分利用其内置的监控报警机制,实现高效的任务状态跟踪与异常预警。
支持的报警通道:短信、电话、邮件、WebHook(钉钉/企业微信/飞书)。
支持的报警策略:失败报警、执行超时报警。
日志服务
使用SchedulerX调度您的Pod和Job时,无需额外开通日志服务,系统将自动收集Pod运行期间产生的日志。一旦Pod执行失败,您可直接在SchedulerX控制台查看到详细的失败原因并分析,实现高效便捷的问题定位与调试。
监控大盘
通过SchedulerX来调度您的Pod和Job,无需另行开通Prometheus服务,即可查看内置的任务监控功能。
离在线混布
对于诸如订单处理等对实时性要求较高的在线定时任务,可在同一进程内直接调用方法进行高效处理,与在线业务无缝集成。而对于实时性要求较低但资源消耗较大的离线定时任务,如报表定时导出,可通过编写脚本并以启动独立Pod的方式运行。SchedulerX平台支持Java和Kubernetes任务类型,能够实现离线与在线定时任务的混布调度,灵活满足不同需求。