在Kubernetes集群中部署SchedulerX
SchedulerX支持定時(shí)調(diào)度程序、多語(yǔ)言腳本和HTTP接口,也支持調(diào)度原生的K8s Job或者Pod。本文介紹如何在Kubernetes環(huán)境中部署SchedulerX。
使用場(chǎng)景
使用SchedulerX調(diào)度K8s Job有如下優(yōu)勢(shì)。
可在線編輯腳本Pod
K8s Job常用于數(shù)據(jù)處理和運(yùn)維場(chǎng)景,一般以腳本實(shí)現(xiàn)居多。原生的使用方式需要將腳本打包到鏡像里,在YAML文件中配置腳本命令。如果要修改腳本,需要重新構(gòu)建鏡像和發(fā)布。如下所示。
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
spec:
containers:
- name: hello
image: registry.cn-hangzhou.aliyuncs.com/test/hello:1.0.0
command: ["sh", "/root/hello.sh"]
restartPolicy: Never
backoffLimit: 4
而使用SchedulerX則無(wú)需構(gòu)建鏡像和編寫YAML腳本,只需在SchedulerX控制臺(tái)直接編輯腳本(Shell、Python、PHP或Node.js),即可自動(dòng)以Pod方式運(yùn)行腳本。如果要修改腳本,只需在SchedulerX控制臺(tái)重新編輯腳本,下次調(diào)度會(huì)自動(dòng)生效,繼而提高K8s Job的開發(fā)效率。同時(shí),使用SchedulerX的K8s任務(wù)時(shí),您無(wú)需了解容器底層細(xì)節(jié),可以低門檻使用容器技術(shù)。
可視化任務(wù)編排
K8s中主流解決方案是使用argo進(jìn)行工作流編排,如下所示。
# 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支持通過(guò)可視化界面拖拽進(jìn)行K8s任務(wù)的編排,相較于當(dāng)前主流的、通過(guò)代碼進(jìn)行工作流編排的解決方案更為便捷。此外,任務(wù)運(yùn)行時(shí),可視化的工作流圖可以幫助您快速排查任務(wù)卡點(diǎn),提高運(yùn)維效率。
報(bào)警監(jiān)控
使用SchedulerX來(lái)調(diào)度Pod或者Job,可以復(fù)用SchedulerX的監(jiān)控報(bào)警功能。
支持的報(bào)警通道:短信、電話、郵件、Webhook(釘釘/企業(yè)微信/飛書)。
支持的報(bào)警策略:失敗報(bào)警、執(zhí)行超時(shí)報(bào)警。
日志服務(wù)
使用SchedulerX調(diào)度Pod或者Job時(shí),無(wú)需額外開通日志服務(wù),就可以自動(dòng)采集Pod運(yùn)行的日志。如果Pod運(yùn)行失敗,您可以直接在SchedulerX控制臺(tái)排查Pod執(zhí)行失敗的原因。
監(jiān)控大盤
您可以通過(guò)SchedulerX自帶的任務(wù)監(jiān)控大盤實(shí)時(shí)觀察您的任務(wù)。
離線在線混和部署
SchedulerX提供離在線定時(shí)任務(wù)混布調(diào)度功能,支持Java和K8s任務(wù)類型。一個(gè)業(yè)務(wù)應(yīng)用通常包括多個(gè)定時(shí)任務(wù)。如果定時(shí)任務(wù)調(diào)度頻率較高,可以直接使其與業(yè)務(wù)應(yīng)用處于同一進(jìn)程中。但進(jìn)程內(nèi)調(diào)用會(huì)消耗在線應(yīng)用自身的CPU和內(nèi)存,無(wú)法與在線業(yè)務(wù)隔離。所以,當(dāng)一個(gè)定時(shí)任務(wù)資源消耗大且調(diào)度頻率不高(例如每小時(shí)或每天運(yùn)行一次)時(shí),可以新增一個(gè)Pod運(yùn)行該定時(shí)任務(wù),使之與原來(lái)的在線應(yīng)用處于不同進(jìn)程中。
方式一:通過(guò)Deployment部署SchedulerX(推薦)
使用非Java應(yīng)用類型時(shí),可以通過(guò)Deployment部署一個(gè)schedulerx-agent.yaml。SchedulerX會(huì)以單獨(dú)的Pod啟動(dòng)應(yīng)用。流程和原理如下圖所示。
前提條件
已創(chuàng)建Kubernetes集群(阿里云容器服務(wù)ACK集群或自建Kubernetes集群)。具體操作,請(qǐng)參見創(chuàng)建Kubernetes集群。
已在分布式任務(wù)調(diào)度平臺(tái)創(chuàng)建一個(gè)應(yīng)用類型為K8s的應(yīng)用。具體操作,請(qǐng)參見創(chuàng)建應(yīng)用。
步驟一:配置ServiceAccount
SchedulerX K8s任務(wù)依賴于ServiceAccount進(jìn)行驗(yàn)證與授權(quán),且默認(rèn)使用Namespace的SchedulerX ServiceAccount運(yùn)行K8s任務(wù)。
在K8s集群里和對(duì)應(yīng)的Namespace下,僅需運(yùn)行一次schedulerx-serviceaccount.yaml。如果Namespace之間需要隔離,僅調(diào)度目標(biāo)Namespace下的Pod或者Job,可運(yùn)行如下YAML示例代碼。
apiVersion: v1
kind: ServiceAccount
metadata:
name: schedulerx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: schedulerx-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch"]
- apiGroups: ["batch"]
resources: ["jobs","cronjobs"]
verbs: ["create","delete","get","list","patch","update","watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: schedulerx-binding
subjects:
- kind: ServiceAccount
name: schedulerx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: schedulerx-role
如果有跨Namespace調(diào)度的需求,需使用ClusterRole和ClusterRoleBinding。
apiVersion: v1
kind: ServiceAccount
metadata:
name: schedulerx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: schedulerx-cluster-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch"]
- apiGroups: ["batch"]
resources: ["jobs","cronjobs"]
verbs: ["create","delete","get","list","patch","update","watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: schedulerx-cluster-binding
subjects:
- kind: ServiceAccount
name: schedulerx
namespace: <NAMESPACE1>
- kind: ServiceAccount
name: schedulerx
namespace: <NAMESPACE2>
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: schedulerx-cluster-role
步驟二:安裝schedulerx-agent.yaml
schedulerx-agent.yaml配置如下所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: schedulerx-agent
labels:
app: schedulerx-agent
spec:
replicas: 1
selector:
matchLabels:
app: schedulerx-agent
template:
metadata:
labels:
app: schedulerx-agent
spec:
serviceAccountName: schedulerx
containers:
- name: schedulerx-agent
image: registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-amd64
imagePullPolicy: Always
resources:
limits:
cpu: 500m
requests:
cpu: 500m
env:
- name: "SCHEDULERX_ENDPOINT"
value: "${SCHEDULERX_ENDPOINT}"
- name: "SCHEDULERX_NAMESPACE"
value: "${SCHEDULERX_NAMESPACE}"
- name: "SCHEDULERX_GROUPID"
value: "${SCHEDULERX_GROUPID}"
- name: "SCHEDULERX_APPKEY"
value: "${SCHEDULERX_APPKEY}"
- name: "SCHEDULERX_STARTER_MODE"
value: "pod"
livenessProbe:
exec:
command: ["/bin/bash","/root/health.sh"]
timeoutSeconds: 30
initialDelaySeconds: 30
SchedulerX agent image變量說(shuō)明
芯片架構(gòu) | 區(qū)域 | 說(shuō)明 |
X86_64 | 中國(guó)地區(qū) | registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-amd64 |
中國(guó)境外 | schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx/agent:latest-amd64 | |
ARM64 | 中國(guó)地區(qū) | registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-arm64 |
中國(guó)境外 | schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx/agent:latest-arm64 |
SchedulerX agent env變量說(shuō)明
變量 | 說(shuō)明 |
${SCHEDULERX_ENDPOINT} | 您部署應(yīng)用的地域(Region)和對(duì)應(yīng)的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,請(qǐng)參見Endpoint列表。 |
${SCHEDULERX_NAMESPACE} | Namespace為命名空間ID,可以在SchedulerX控制臺(tái)的命名空間頁(yè)面獲取。 |
${SCHEDULERX_GROUPID} | GroupId為應(yīng)用ID,可以在SchedulerX控制臺(tái)應(yīng)用管理頁(yè)面獲取。 |
${SCHEDULERX_APPKEY} | AppKey為應(yīng)用Key,可以在SchedulerX控制臺(tái)應(yīng)用管理頁(yè)面獲取。 |
部署Deployment完成后,如果可以在SchedulerX控制臺(tái)應(yīng)用管理頁(yè)面查看實(shí)例,表明接入成功。
方式二:通過(guò)helm包部署SchedulerX
前提條件
已創(chuàng)建Kubernetes集群(阿里云容器服務(wù)ACK集群或自建Kubernetes集群)。具體操作,請(qǐng)參見創(chuàng)建Kubernetes集群。
已在分布式任務(wù)調(diào)度平臺(tái)創(chuàng)建一個(gè)應(yīng)用類型為K8s的應(yīng)用。具體操作,請(qǐng)參見創(chuàng)建應(yīng)用。
步驟一:下載SchedulerX helm
執(zhí)行如下命令,下載SchedulerX helm包。
wget https://schedulerx2.oss-cn-hangzhou.aliyuncs.com/helm/schedulerxchart-2.0.0.tgz
步驟二:安裝schedulerx helm包
在分布式任務(wù)調(diào)度平臺(tái)獲取應(yīng)用的接入?yún)?shù)。
在頂部菜單欄選擇地域。
在左側(cè)導(dǎo)航欄,單擊應(yīng)用管理。
在應(yīng)用管理頁(yè)面的操作列,單擊接入配置。在接入配置頁(yè)面左上角,選擇k8s。
執(zhí)行如下安裝命令。
說(shuō)明安裝命令的接入?yún)?shù)需要替換為目標(biāo)應(yīng)用的接入?yún)?shù)。
接入配置中的鏡像地址默認(rèn)為公網(wǎng)中amd架構(gòu)的鏡像。您需要根據(jù)自身機(jī)器所在的區(qū)域以及機(jī)器架構(gòu)選擇合適的鏡像地址。
helm install schedulerxchart schedulerxchart-2.0.0.tgz \ --set SCHEDULERX_ENDPOINT=acm.aliyun.com\ ,SCHEDULERX_NAMESPACE=f856c3f8-a15c-4a7e-9b4e-f812a9f8****\ ,SCHEDULERX_GROUPID=k8s-test3\ ,SCHEDULERX_APPKEY=****\ ,SCHEDULERX_AGENT_IMAGE=registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-amd64
安裝過(guò)程截圖如下所示。
SchedulerX agent image變量說(shuō)明
芯片架構(gòu)
區(qū)域
說(shuō)明
x86_64
中國(guó)地區(qū)
registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-amd64
中國(guó)境外
schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx/agent:latest-amd64
arm64
中國(guó)地區(qū)
registry.cn-hangzhou.aliyuncs.com/schedulerx/agent:latest-arm64
中國(guó)境外
schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx/agent:latest-arm64
SchedulerX agent env變量說(shuō)明
變量
說(shuō)明
${SCHEDULERX_ENDPOINT}
您部署應(yīng)用的地域(Region)和對(duì)應(yīng)的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,請(qǐng)參見Endpoint列表。
${SCHEDULERX_NAMESPACE}
Namespace為命名空間ID,可以在SchedulerX控制臺(tái)的命名空間頁(yè)面獲取。
${SCHEDULERX_GROUPID}
GroupId為應(yīng)用ID,可以在SchedulerX控制臺(tái)應(yīng)用管理頁(yè)面獲取。
${SCHEDULERX_APPKEY}
AppKey為應(yīng)用Key,可以在SchedulerX控制臺(tái)應(yīng)用管理頁(yè)面獲取。
SCHEDULERX_AGENT_IMAGE
鏡像地址。
安裝完成后,可以通過(guò)SchedulerX控制臺(tái)查看實(shí)例。
方式三:通過(guò)Java SDK部署SchedulerX
如果您的應(yīng)用為Java應(yīng)用,除K8s任務(wù)外,還需要調(diào)度Java程序,您可以使用Java SDK部署。SchedulerX和您的在線業(yè)務(wù)處于一個(gè)進(jìn)程中。流程和原理如下圖所示。
前提條件
創(chuàng)建Kubernetes集群(阿里云容器服務(wù)ACK集群或自建Kubernetes集群)。具體操作,請(qǐng)參見創(chuàng)建Kubernetes集群。
在分布式任務(wù)調(diào)度平臺(tái)創(chuàng)建一個(gè)應(yīng)用類型為K8s的應(yīng)用。具體操作,請(qǐng)參見創(chuàng)建應(yīng)用。
接入SchedulerX
關(guān)于SDK接入,請(qǐng)參見Spring Boot應(yīng)用接入SchedulerX。
使用K8s任務(wù)還需要依賴一個(gè)schedulerx-plugin-kubernetes
,如下所示。
schedulerx2.version使用最新客戶端版本,更多信息,請(qǐng)參見發(fā)布記錄。
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-plugin-kubernetes</artifactId>
<version>${schedulerx2-plugin-kubernetes.version}</version>
</dependency>
后續(xù)步驟:創(chuàng)建K8s任務(wù)
運(yùn)行以下腳本時(shí),您需要在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù)。具體操作,請(qǐng)參見任務(wù)管理。
Shell腳本
如果您想通過(guò)Pod運(yùn)行Shell腳本,您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),選擇資源類型為Shell-Script,使用默認(rèn)鏡像busybox,或替換為您自建的鏡像。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-shell-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以查看Pod運(yùn)行的日志。
Python腳本
如果您想通過(guò)Pod運(yùn)行Python腳本,您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),選擇資源類型為Python-Script,使用默認(rèn)鏡像Python,或替換為您自建的鏡像。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-python-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
PHP腳本
如果您想通過(guò)Pod運(yùn)行PHP腳本,您可以在任務(wù)管理頁(yè)面創(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ù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以查看Pod運(yùn)行的日志。
Node.js腳本
如果您想通過(guò)Pod運(yùn)行Node.js腳本,您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),選擇資源類型為Nodejs-Script,使用默認(rèn)鏡像node:16
,或替換為您自建的鏡像。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng),Pod名稱為schedulerx-node-{JobId}。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
Job-YAML
通過(guò)SchedulerX也可以運(yùn)行K8s原生的Job。您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),選擇資源類型為Job-YAML。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Job和Pod啟動(dòng)成功。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
CronJob-YAML
通過(guò)SchedulerX也可以運(yùn)行K8s原生的CronJob。您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇CronJob-YAML。
單擊運(yùn)行一次,在任務(wù)實(shí)例記錄頁(yè)面可以看到Pod啟動(dòng)成功。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
Pod-YAML
通過(guò)SchedulerX也可以運(yùn)行K8s原生的Pod。您可以在任務(wù)管理頁(yè)面創(chuàng)建一個(gè)K8s任務(wù),資源類型選擇Pod-YAML。
單擊運(yùn)行一次,在Kubernetes集群中可以看到Pod啟動(dòng)成功。
在SchedulerX控制臺(tái)任務(wù)管理頁(yè)面可以查詢歷史執(zhí)行記錄,也可以看到Pod運(yùn)行的日志。
通過(guò)SchedulerX運(yùn)行K8s Pod時(shí),有如下注意事項(xiàng)。
免運(yùn)行周期較長(zhǎng)的Pod,例如Web應(yīng)用,一旦啟動(dòng)永遠(yuǎn)不會(huì)結(jié)束。
建議將重啟策略設(shè)置成Never,否則Pod會(huì)不斷重啟。