简介: 通过任务调度 SchedulerX 来调度你的 K8s 任务,能够降低学习成本,加快开发效率,让你的任务失败可报警,出问题可排查,打造云原生可观测体系下的可视化 K8s 任务。

作者:学仁

 

简介

K8s Job 是 Kubernetes 中的一种资源,用来处理短周期的 Pod,相当于一次性任务,跑完就会把 Pod 销毁,不会一直占用资源,可以节省成本,提高资源利用率。

阿里任务调度 SchedulerX 和云原生结合,重磅推出可视化 K8s 任务,针对脚本使用者,屏蔽了容器服务的细节,不用构建镜像就可以让不熟悉容器的同学(比如运维和运营同学)玩转K8s Job,受益容器服务带来的降本增效福利。针对容器使用者,SchedulerX 不但完全兼容原生的 K8s Job,还能支持历史执行记录、日志服务、重跑任务、报警监控、可视化任务编排等能力,为企业级应用保驾护航。架构图如下:

 

特性一:快速开发 K8s 可视化脚本任务

 

Kubernetes 的 Job,常见用来做离线数据处理和运维工作(比如每天凌晨 2 点把 mysql 数据同步到大数据平台,每隔 1 小时更新一次 redis 缓存等),一般以脚本实现居多。这里以一个简单的场景举例子,来对比两种方案的差异。

Kubernetes 原生解决方案

K8s 调度的最小单位是 Pod,想跑脚本任务,需要提前把脚本打包到镜像里,然后在 YAML 文件中配置脚本命令,下面以通过 python 脚本查询数据库为例子:

  • 编写 python 脚本 demo.py
#!/usr/bin/python
# -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) # 使用cursor()方法获取操作游标
cursor = db.cursor() # SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print "fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fetch data" # 关闭数据库连接
db.close()
  • 编写 Dockerfile
FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt COPY demo.py /root/demo.py CMD [ "python", "/root/demo.py" ]
  • 制作 docker 镜像,推到镜像仓库中
docker build -t registry.cn-beijing.aliyuncs.com/demo/python:1.0.0 .
docker push registry.cn-beijing.aliyuncs.com/demo/python:1.0.0
  • 编写 K8s Job 的 YAML 文件,image 选择第 3 步制作的镜像,command 的命令为执行脚本
apiVersion: batch/v1
kind: Job
metadata:
name: demo-python
spec:
template:
spec:
containers:
- name: demo-python
image: registry.cn-beijing.aliyuncs.com/demo/python:1.0.0
command: ["python", "/root/demo.py"]
restartPolicy: Never
backoffLimit: 4

我们看到要在容器服务中跑脚本,需要这么多步骤,如果要修改脚本,还需要重新构建镜像和重新发布 K8s Job,非常麻烦。

阿里云解决方案

阿里任务调度 SchedulerX 结合云原生技术,提出了一套可视化的脚本任务解决方案,通过任务调度系统来管理脚本,直接在线编写脚本,不需要构建镜像,就可以将脚本以 Pod 的方式在用户的 K8s 集群当中运行起来,使用非常方便,如下图:

1. 在 SchedulerX 任务管理新建一个 K8s 任务,资源类型选择 Python-Script(当前支持shell/python/php/nodejs 四种脚本类型)

2. 点击运行一次,在 Kubernetes 集群中可以看到 pod 启动,pod 名称为 schedulerx-python-{JobId}

3. 在 SchedulerX 控制台也可以看到历史执行记录

4. 在 SchedulerX 控制台可以看到 Pod 运行的日志

下面通过一个表格更方便的看到两个方案的差异:

 

特性二:完全兼容原生 K8s Job

 

SchedulerX 不但能够快速开发 K8s 脚本任务,屏蔽容器服务的细节,给不熟悉容器服务的同学带来福音,同时还能托管原生 K8s Job。

原生自带的Job方案

  • Job

以官方提供的 Job 为例:

1. 编写 YAML 文件 pi.yaml,故意写一个错误,bpi(-1)是非法的

apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(-1)"]
restartPolicy: Never
backoffLimit: 4

2. 在 K8s 集群中运行该 Job,并查看 Pod 的状态和日志:

K8s 原生的 Job 不支持重跑,修改完 Job 后想要重跑,需要先删除,再重新 apply,非常麻烦。

  • CronJob

以官方提供的 CronJob 为例:

1. 编写 hello.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
restartPolicy: OnFailure

2. 在 K8s 集群中运行该 CronJob,查看 pod 历史记录和日志

发现原生的 CronJob 只能查看最近3条执行记录,想要查看更久之前的记录无法看到,这在业务出现问题想排查的时候就变得尤为困难。

阿里云解决方案

阿里任务调度 SchedulerX 可以托管原生 K8s 任务,方便移植,使用 SchedulerX 托管,可以享有任务调度的特性,比如任务重跑、历史记录、日志服务、报警监控等。

1. 新建 K8s 任务,任务类型选择 K8s,资源类型选择 Job-YAML,打印 bpi(-1)

2. 通过工具来生成 cron 表达式,比如每小时第 8 分钟跑

3. 调度时间还没到,也可以手动点击“运行一次”来进行测试

4. 在 K8s 集群中可以看到 Job 和 Pod 启动成功

5. 在 SchedulerX 控制台也可以看到历史执行记录

6. 在 SchedulerX 控制台可以看到任务运行日志

7. 在线修改任务的 YAML,打印 bpi(100)

8. 不需要删除 Job,通过控制台来重跑任务

9. 任务重跑成功,且能看到新的日志

下面通过一个表格来对比两个方案的差异

 

特性三:增强原生 Job,支持可视化任务编排

 

在数据处理场景下,任务之间往往有依赖关系,比如 A 任务依赖 B 任务的完成才能开始执行。

Kubernetes 原生解决方案

当前 K8s 中主流的解决方案是使用 argo 进行工作流编排,比如定义一个 DAG 如下:

# 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}}"]

我们看到构建这么简单的一个 DAG,就需要写这么多 YAML,如果依赖关系复杂,则 YAML 就变得非常难维护。

阿里云解决方案

阿里任务调度 SchedulerX 支持通过可视化的工作流进行任务编排

1. 创建一个工作流,可以导入任务,也可以在当前画布新建任务,通过拖拽构建一个工作流

2. 点击运行一次,可以实时看到工作流的运行情况,方便排查任务卡在哪个环节:

3. 如果有任务失败了,通过控制台查看日志

4. 把任务修改正确,在工作流实例图上,原地重跑失败的节点

5. 失败的任务会重新按照最新的内容执行

6. 当上游都执行成功,下游就可以继续执行了

 

总结

 

通过任务调度 SchedulerX 来调度你的 K8s 任务,能够降低学习成本,加快开发效率,让你的任务失败可报警,出问题可排查,打造云原生可观测体系下的可视化 K8s 任务。

原文链接:https://click.aliyun.com/m/1000353353/

本文为阿里云原创内容,未经允许不得转载。

如何可视化编写和编排你的 K8s 任务的更多相关文章

  1. K8s 如何提供更高效稳定的编排能力?K8s Watch 实现机制浅析

    关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...

  2. 超长可视化指南!带你理清K8S部署的故障排查思路,让bug无处遁形

    本文将帮助你厘清在Kubernetes中调试 deployment的思路.下图是完整的故障排查思路,如果你想获得更清晰的图片,请在公众号后台(RancherLabs)回复"troublesh ...

  3. 容器编排系统之K8s资源标签、标签选择器、资源注解

    前文我们聊到了使用k8s资源配置清单定义资源的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14132890.html:今天我们来聊下资源标签,标签选 ...

  4. K8s容器编排

    K8s容器编排 Kubernetes(k8s)具有完备的集群管理能力: 包括多层次的安全防护和准入机制 多租户应用支撑能力 透明的服务注册和服务发现机制 内建智能负载均衡器 强大的故障发现和自我修复能 ...

  5. k8s的容器编排

    1.K8S是如何对容器编排? 在K8S集群中,容器并非最小的单位,K8S集群中最小的调度单位是Pod,容器则被封装在Pod之中.由此可知,一个容器或多个容器可以同属于在一个Pod之中. 2.Pod是怎 ...

  6. K8S 部署电商项目

    Ingress 和 Ingress Controller 概述 在 k8s 中为什么会有 service 这个概念?Pod 漂移问题 Kubernetes 具有强大的副本控制能力,能保证在任意副本(P ...

  7. 经典案例复盘——运维专家讲述如何实现K8S落地

    经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...

  8. 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)

    以下是运满满K8s容器化进程记录,摘抄一下,方便以后查阅. 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上, ...

  9. WEB组态可视化软件(B/S)

    WEB组态可视化软件 目录 WEB组态可视化软件 1 B/S组态软件 2 组态概念 3 组态产品呈现 4 功能特点 5 组态软件应用场景 6 经典的案例 6.1 某通信基站的组态可视化 7 具体实现 ...

  10. 低代码平台--基于surging开发微服务编排流程引擎构思

    前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...

随机推荐

  1. python使用replace将数组写入txt文本

    一 概念 1 Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 2 用法:str.replace ...

  2. Grails的数据库相关开发

    1.开发domain和service 在出来的输入框里输入domain的名字,可以包括包名. 这里我输入test.domain.House,点finish 创建了两个groovy文件,一个当然是tes ...

  3. 常用加密及其相关的概念、简介(对称、AES、非对称、RSA、散列、HASH、消息认证码、HMAC、签名、CA、数字证书、base64、填充)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言   在之前,一直是通过生活.工作零零碎碎 ...

  4. 【LeetCode刷题】剑指Offer 48.最长不含重复字符的子字符串

    剑指Offer 48.最长不含重复字符的子字符串(点击跳转LeetCode) 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcab ...

  5. uni-app攻略:如何对接驰腾打印机

    一.引言 在当前的移动开发生态中,跨平台框架如uni-app因其高效.灵活的特点受到了开发者们的青睐.同时,随着物联网技术的飞速发展,智能打印设备已成为许多业务场景中不可或缺的一环.今天,我们就来探讨 ...

  6. 开发必会系列:《Java多线程编程实战》读书笔记

    如何判断是否开启超线程 一  基础 进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程是进程中可独立执行的最小单位. 在Java平台中创建一个线程就是创建一个Thread类(或其子类 ...

  7. Dynamic ReLU:微软推出提点神器,可能是最好的ReLU改进 | ECCV 2020

    论文提出了动态ReLU,能够根据输入动态地调整对应的分段激活函数,与ReLU及其变种对比,仅需额外的少量计算即可带来大幅的性能提升,能无缝嵌入到当前的主流模型中   来源:晓飞的算法工程笔记 公众号 ...

  8. 初学STM32 CAN通信(二)

    初学STM32 CAN通信(二) 1. STM32的CAN外设 ​ STM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN协议2.0A和2.0B标准. ​ 该C ...

  9. stm32F103 移植Free RTOS

    stm32F103 移植Free RTOS 1. 下载FreeRTOS 源码 [官网下载] (http://www.freertos.org) [代码托管网站下载] (https://sourcefo ...

  10. 关于Guava Cache 需要注意的几点

    一.元素过期策略 expireAfterWrite(long duration, TimeUnit unit):在元素[写入]或者[值更新]后的一段时间之后,自动移除元素. 当duration=0时, ...