K8s任務(wù)
SchedulerX支持定時(shí)調(diào)度程序、多語言腳本和HTTP接口,也支持調(diào)度原生的K8s Job或者Pod。本文介紹如何在Kubernetes環(huán)境中部署SchedulerX。
前提條件
接入SchedulerX,具體操作,請(qǐng)參見在Kubernetes集群中部署SchedulerX。
創(chuàng)建K8s任務(wù)
Shell腳本
如果想通過Pod運(yùn)行Shell腳本,不需要自己構(gòu)建鏡像,只需要在任務(wù)管理創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇Shell-Script,鏡像默認(rèn)是busybox(也可以替換為自己的鏡像)。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-shell-{JobId}。
在SchedulerX控制臺(tái)的任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
Python腳本
如果想通過Pod運(yùn)行Python腳本,不需要自己構(gòu)建鏡像,只需要在任務(wù)管理創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇Python-Script,鏡像默認(rèn)是Python(也可以替換為自己的鏡像)。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-python-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
PHP腳本
如果想通過Pod運(yùn)行PHP腳本,不需要自己構(gòu)建鏡像,只需要在任務(wù)管理創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇Php-Script,鏡像默認(rèn)是php:7.4-cli(也可以替換為自己的鏡像)。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-php-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志
Node.js腳本
如果想通過Pod運(yùn)行Node.js腳本,不需要自己構(gòu)建鏡像,只需要在任務(wù)管理創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇Node.js-Script,鏡像默認(rèn)是node:16(也可以替換自己的鏡像)。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-node-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
Job-YAML
通過SchedulerX也可以運(yùn)行K8s原生的Job,任務(wù)類型選擇K8s,資源類型選擇Job-YAML。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Job和Pod啟動(dòng)成功。
在SchedulerX控制臺(tái)任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
通過SchedulerX運(yùn)行K8s Job,不建議使用CronJob,定時(shí)調(diào)度需要使用SchedulerX來配置,否則無法收集每次Pod的執(zhí)行歷史和日志。
Pod-YAML
通過SchedulerX也可以運(yùn)行K8s原生的Pod,任務(wù)類型選擇K8s,資源類型選擇Pod-YAML。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng)成功。
在SchedulerX控制臺(tái)的任務(wù)管理頁面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
通過SchedulerX運(yùn)行K8s Pod,建議不要運(yùn)行長(zhǎng)周期的Pod(比如Web應(yīng)用,一旦啟動(dòng)永遠(yuǎn)不會(huì)結(jié)束),重啟策略需要設(shè)置成Never(否則Pod會(huì)不斷重啟)。
通過環(huán)境變量獲取任務(wù)參數(shù)
SchedulerX系統(tǒng)支持將任務(wù)參數(shù)預(yù)先配置到環(huán)境變量中,這樣無論是腳本任務(wù)、Pod還是Job,都可以便捷地通過讀取環(huán)境變量來獲取所需的各項(xiàng)參數(shù)信息。
Schedulerx-Agent 版本需要大于等于1.10.14。
key | 描述 |
SCHEDULERX_JOB_NAME | 任務(wù)名稱。 |
SCHEDULERX_SCHEDULE_TIMESTAMP | 調(diào)度時(shí)間的時(shí)間戳。 |
SCHEDULERX_DATA_TIMESTAMP | 數(shù)據(jù)時(shí)間的時(shí)間戳。 |
SCHEDULERX_WORKFLOW_INSTANCE_ID | 如果有配置工作流,可以獲取工作流實(shí)例ID。 |
SCHEDULERX_JOB_PARAMETERS | 任務(wù)參數(shù)。 |
SCHEDULERX_INSTANCE_PARAMETERS | 任務(wù)實(shí)例參數(shù)。 |
SCHEDULERX_JOB_SHARDING_PARAMETER | 如果是分片任務(wù),可以獲取到分片參數(shù)。 |
如下所示,獲取SchedulerX任務(wù)參數(shù)值:
優(yōu)勢(shì)
相較于K8s原生的Job功能,采用SchedulerX調(diào)度K8s Job具有以下顯著優(yōu)勢(shì):
可在線編輯的腳本Pod
K8s Job常用場(chǎng)景是用來做數(shù)據(jù)處理和運(yùn)維,一般以腳本實(shí)現(xiàn)居多。原生的使用方式需要把腳本打包到鏡像里,在YAML文件中配置腳本命令。每當(dāng)需要修改腳本時(shí),研發(fā)人員不得不經(jīng)歷重新構(gòu)建鏡像并再次發(fā)布的繁瑣過程。比如:
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
運(yùn)用SchedulerX進(jìn)行K8s任務(wù)管理時(shí),您無需構(gòu)建鏡像或編寫YAML配置腳本。只需在控制臺(tái)直接編輯支持Shell、Python、PHP和Node.js等多種語言的腳本內(nèi)容,系統(tǒng)便會(huì)自動(dòng)將其以Pod方式運(yùn)行。若需對(duì)腳本進(jìn)行更新,僅需在控制臺(tái)重新編輯并保存,下次調(diào)度時(shí)新版本腳本將自動(dòng)生效,顯著提升開發(fā)和管理K8s Job的工作效率。同時(shí),借助SchedulerX的K8s任務(wù)功能,完全屏蔽了容器相關(guān)的細(xì)節(jié),對(duì)于不熟悉容器服務(wù)的研發(fā)人員而言,這項(xiàng)改進(jìn)無疑顯著提升了開發(fā)效率,為他們帶來了極大的便利。
如下:
可視化任務(wù)編排
當(dāng)前在K8s生態(tài)系統(tǒng)中,Argo作為一種主流的工作流編排解決方案被廣泛應(yīng)用。例如:
# 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的工作流功能,您能夠通過直觀的可視化界面,采用簡(jiǎn)單的鼠標(biāo)拖拽操作來高效編排K8s任務(wù)流程,如下圖所示。
在使用體驗(yàn)上,相較于Argo,SchedulerX更為便捷易用,尤其是在運(yùn)行時(shí),它提供了可視化的工作流圖展示,能夠清晰地追蹤任務(wù)進(jìn)度,方便快速識(shí)別和定位任務(wù)受阻的具體環(huán)節(jié),如下圖所示顯示出具體的任務(wù)失敗:
報(bào)警監(jiān)控
通過SchedulerX對(duì)您的Pod和Job進(jìn)行調(diào)度,能夠充分利用其內(nèi)置的監(jiān)控報(bào)警機(jī)制,實(shí)現(xiàn)高效的任務(wù)狀態(tài)跟蹤與異常預(yù)警。
支持的報(bào)警通道:短信、電話、郵件、WebHook(釘釘/企業(yè)微信/飛書)。
支持的報(bào)警策略:失敗報(bào)警、執(zhí)行超時(shí)報(bào)警。
日志服務(wù)
使用SchedulerX調(diào)度您的Pod和Job時(shí),無需額外開通日志服務(wù),系統(tǒng)將自動(dòng)收集Pod運(yùn)行期間產(chǎn)生的日志。一旦Pod執(zhí)行失敗,您可直接在SchedulerX控制臺(tái)查看到詳細(xì)的失敗原因并分析,實(shí)現(xiàn)高效便捷的問題定位與調(diào)試。
監(jiān)控大盤
通過SchedulerX來調(diào)度您的Pod和Job,無需另行開通Prometheus服務(wù),即可查看內(nèi)置的任務(wù)監(jiān)控功能。
離在線混布
對(duì)于諸如訂單處理等對(duì)實(shí)時(shí)性要求較高的在線定時(shí)任務(wù),可在同一進(jìn)程內(nèi)直接調(diào)用方法進(jìn)行高效處理,與在線業(yè)務(wù)無縫集成。而對(duì)于實(shí)時(shí)性要求較低但資源消耗較大的離線定時(shí)任務(wù),如報(bào)表定時(shí)導(dǎo)出,可通過編寫腳本并以啟動(dòng)獨(dú)立Pod的方式運(yùn)行。SchedulerX平臺(tái)支持Java和Kubernetes任務(wù)類型,能夠?qū)崿F(xiàn)離線與在線定時(shí)任務(wù)的混布調(diào)度,靈活滿足不同需求。