在Kubernetes集群中部署SchedulerX

更新时间:
复制为 MD 格式

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

使用场景

使用SchedulerX调度K8s Job有如下优势。

可在线编辑脚本Pod

K8s Job常用于数据处理和运维场景,一般以脚本实现居多。原生的使用方式需要将脚本打包到镜像里,在YAML文件中配置脚本命令。如果要修改脚本,需要重新构建镜像和发布。如下所示。

展开查看代码

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则无需构建镜像和编写YAML脚本,只需在SchedulerX控制台直接编辑脚本(Shell、Python、PHPNode.js),即可自动以Pod方式运行脚本。如果要修改脚本,只需在SchedulerX控制台重新编辑脚本,下次调度会自动生效,继而提高K8s Job的开发效率。同时,使用SchedulerXK8s任务时,您无需了解容器底层细节,可以低门槛使用容器技术。

可视化任务编排

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任务的编排,相较于当前主流的、通过代码进行工作流编排的解决方案更为便捷。此外,任务运行时,可视化的工作流图可以帮助您快速排查任务卡点,提高运维效率。

报警监控

使用SchedulerX来调度Pod或者Job,可以复用SchedulerX的监控报警功能。

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

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

日志服务

使用SchedulerX调度Pod或者Job时,无需额外开通日志服务,就可以自动采集Pod运行的日志。如果Pod运行失败,您可以直接在SchedulerX控制台排查Pod执行失败的原因。

监控大盘

您可以通过SchedulerX自带的任务监控大盘实时观察您的任务。

离线在线混和部署

SchedulerX提供离线和在线定时任务混布调度功能,支持JavaK8s任务类型。一个业务应用通常包括多个定时任务。如果定时任务调度频率较高,可以直接使其与业务应用处于同一进程中。但进程内调用会消耗在线应用自身的CPU和内存,无法与在线业务隔离。所以,当一个定时任务资源消耗大且调度频率不高(例如每小时或每天运行一次)时,可以新增一个Pod运行该定时任务,使之与原来的在线应用处于不同进程中。

方式一:通过Deployment部署SchedulerX(推荐)

使用非Java应用类型时,可以通过Deployment部署一个schedulerx-agent.yaml。SchedulerX会以单独的Pod启动应用。流程和原理如下图所示。

p452558.png

前提条件

创建应用对话框中,应用类型选择 k8s应用版本选择专业版

步骤一:配置ServiceAccount

SchedulerX K8s任务依赖于ServiceAccount进行验证与授权,且默认使用NamespaceSchedulerX ServiceAccount运行K8s任务。

K8s集群里和对应的Namespace下,仅需运行一次schedulerx-serviceaccount.yaml。如果Namespace之间需要隔离,仅调度目标Namespace下的Pod或者Job,可运行如下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调度的需求,需使用ClusterRoleClusterRoleBinding。

展开查看具体代码

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配置如下所示。

展开查看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: schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64
        imagePullPolicy: Always
        resources:
          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变量说明

芯片架构

区域

说明

X86_64

中国地区

schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64

中国境外

schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-amd64

ARM64

中国地区

schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-arm64

中国境外

schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-arm64

SchedulerX agent env变量说明

变量

说明

${SCHEDULERX_ENDPOINT}

您部署应用的地域(Region)和对应的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,请参见Endpoint列表

${SCHEDULERX_NAMESPACE}

Namespace为命名空间ID,可以在SchedulerX控制台的命名空间页面获取。

${SCHEDULERX_GROUPID}

GroupId为应用ID,可以在SchedulerX控制台应用管理页面获取。

${SCHEDULERX_APPKEY}

AppKey为应用Key,可以在SchedulerX控制台应用管理页面获取。

部署Deployment完成后,如果可以在SchedulerX控制台应用管理页面查看实例,表明接入成功。

方式二:通过helm包部署SchedulerX

前提条件

步骤一:下载SchedulerX helm

执行如下命令,下载SchedulerX helm包。

wget https://schedulerx2.oss-cn-hangzhou.aliyuncs.com/helm/schedulerxchart-2.0.0.tgz

步骤二:安装schedulerx helm

  1. 在分布式任务调度平台获取应用的接入参数。

    1. 登录MSE SchedulerX控制台

    2. 登录EDAS控制台

    3. 在顶部菜单栏选择地域。

    4. 在左侧导航栏,单击应用管理

    5. 应用管理页面的操作列,单击接入配置。在接入配置页面左上角,选择k8s

  2. 执行如下安装命令。

    说明
    • 安装命令的接入参数需要替换为目标应用的接入参数。

    • 接入配置中的镜像地址默认为公网中amd架构的镜像。您需要根据自身机器所在的区域以及机器架构选择合适的镜像地址。

    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=schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64

    安装过程输出如下所示。

    NAME: schedulerxchart
    LAST DEPLOYED: xxx
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None

    SchedulerX agent image变量说明

    芯片架构

    区域

    说明

    X86_64

    中国地区

    schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-amd64

    中国境外

    schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-amd64

    ARM64

    中国地区

    schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx2/agent:latest-arm64

    中国境外

    schedulerx-registry.ap-southeast-1.cr.aliyuncs.com/schedulerx2/agent:latest-arm64

    SchedulerX agent env变量说明

    变量

    说明

    ${SCHEDULERX_ENDPOINT}

    您部署应用的地域(Region)和对应的Endpoint,例如addr-sh-internal.edas.aliyun.com。更多信息,请参见Endpoint列表

    ${SCHEDULERX_NAMESPACE}

    Namespace为命名空间ID,可以在SchedulerX控制台的命名空间页面获取。

    ${SCHEDULERX_GROUPID}

    GroupId为应用ID,可以在SchedulerX控制台应用管理页面获取。

    ${SCHEDULERX_APPKEY}

    AppKey为应用Key,可以在SchedulerX控制台应用管理页面获取。

    SCHEDULERX_AGENT_IMAGE

    镜像地址。

    安装完成后,可以通过SchedulerX控制台查看实例。

方式三:通过Java SDK部署SchedulerX

如果您的应用为Java应用,除K8s任务外,还需要调度Java程序,您可以使用Java SDK部署。SchedulerX和您的在线业务处于一个进程中。流程和原理如下图所示。66

前提条件

接入SchedulerX

关于SDK接入,请参见Spring Boot应用接入SchedulerX

使用K8s任务还需要依赖一个schedulerx-plugin-kubernetes,如下所示。

说明

schedulerx2.version使用最新客户端版本,更多信息,请参见发布记录

<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>

后续步骤:创建K8s任务

运行以下脚本时,您需要在任务管理页面创建一个K8s任务。具体操作,请参见任务管理

Shell脚本

如果您想通过Pod运行Shell脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型Shell-Script,使用默认镜像busybox,或替换为您自建的镜像。脚本编辑区可直接编写 Shell 命令,如 echo "Hello, World!"

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

# kubectl get pod | grep schedulerx
schedulerx-agent-xxx    1/1     Running     0          19h
schedulerx-shell-xxx    0/1     Completed   0          9s

# kubectl logs schedulerx-shell-xxx
Hello, World!
hello schedulerx!

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

Python脚本

如果您想通过Pod运行Python脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型Python-Script,使用默认镜像Python,或替换为您自建的镜像。脚本编辑区可直接编写 Python 代码。

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

# kubectl get pod | grep schedulerx
schedulerx-agent-xxx      1/1     Running     0     19h
schedulerx-python-xxx     0/1     Completed   0     xxx

# kubectl logs schedulerx-python-xxx
Hello, World!
hello schedulerx!

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

PHP脚本

如果您想通过Pod运行PHP脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型PHP-Script,使用默认镜像php:7.4-cli,或替换为您自建的镜像。脚本编辑区可直接编写 PHP 代码。

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

# kubectl get pod | grep schedulerx
schedulerx-agent-xxx    1/1     Running     0     19h
schedulerx-php-xxx      0/1     Completed   0     xxx
schedulerx-python-xxx   0/1     Completed   0     xxx
schedulerx-shell-xxx    0/1     Completed   0     xxx

# kubectl logs schedulerx-php-xxx
Hello, World!
hello schedulerx!

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

Node.js脚本

如果您想通过Pod运行Node.js脚本,您可以在任务管理页面创建一个K8s任务,选择资源类型Nodejs-Script,使用默认镜像node:16,或替换为您自建的镜像。脚本编辑区可直接编写 Node.js 代码。

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

# kubectl get pod | grep schedulerx
schedulerx-agent-xxx    1/1     Running     0     19h
schedulerx-node-xxx     0/1     Completed   0     23s
schedulerx-php-xxx      0/1     Completed   0     xxx
schedulerx-python-xxx   0/1     Completed   0     xxx
schedulerx-shell-xxx    0/1     Completed   0     xxx

# kubectl logs schedulerx-node-xxx
Hello, World!

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

Job-YAML

通过SchedulerX也可以运行K8s原生的Job。您可以在任务管理页面创建一个K8s任务,选择资源类型Job-YAML。编辑区中填写 Job 的 YAML 定义,如计算圆周率的示例任务。

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

# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           17s        6m5s

# kubectl get pod
NAME                         READY   STATUS      RESTARTS   AGE
hello                        0/1     Completed   0          6m8s
pi--1-jgck5                  0/1     Completed   0          xxx
schedulerx-agent-xxx         1/1     Running     0          19h
schedulerx-node-xxx          0/1     Completed   0          14m
schedulerx-php-xxx           0/1     Completed   0          19m
schedulerx-python-xxx        0/1     Completed   0          46m
schedulerx-shell-xxx         0/1     Completed   0          56m

# kubectl logs pi--1-jgck5
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706...

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

CronJob-YAML

通过SchedulerX也可以运行K8s原生的CronJob。您可以在任务管理页面创建一个K8s任务,资源类型选择CronJob-YAML

编辑区中填写 CronJob 的 YAML 定义,包含 schedulejobTemplate 等配置。

单击运行一次,在任务实例记录页面可以看到Pod启动成功。

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

Pod-YAML

通过SchedulerX也可以运行K8s原生的Pod。您可以在任务管理页面创建一个K8s任务,资源类型选择Pod-YAML。编辑区中填写 Pod 的 YAML 定义,如使用 busybox 镜像输出 hello world 的示例。

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

# kubectl get pod
NAME                         READY   STATUS      RESTARTS   AGE
hello                        0/1     Completed   0          2m39s
pi--1-jgck5                  0/1     Completed   0          49m
schedulerx-agent-xxx         1/1     Running     0          20h
schedulerx-node-xxx          0/1     Completed   0          58m
schedulerx-php-xxx           0/1     Completed   0          62m
schedulerx-python-xxx        0/1     Completed   0          90m
schedulerx-shell-xxx         0/1     Completed   0          100m

# kubectl logs hello
hello world

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

说明

通过SchedulerX运行K8s Pod时,有如下注意事项。

  • 免运行周期较长的Pod,例如Web应用,一旦启动永远不会结束。

  • 建议将重启策略设置成Never,否则Pod会不断重启。