k8s job机制初探

2023-11-15

博客作为学习笔记记录,若有理解或表述错误,欢迎指出

 

k8s的job机制,k8s官网参考

 

k8s的job是用来执行一次性任务的一类资源,相关的还有cronjob,用于执行以下周期性任务。

部署job之后,k8s会起对应pod,当pod的状态为finished之后,job的状态会更新为complete,即这个job任务已经执行完成,pod不在系统中继续运行。

相对于ReplicaSet、ReplicationController等controller而言,k8s的job是当pod完成某项任务之后,退出对应的pod,而ReplicaSet、ReplicationController是保证了k8s集群环境中始终保持有对应数量的pod在运行。因此可以说job是ReplicaSet、ReplicationController等controller等的补充。

 

下面通过几个例子来看看k8s job机制的使用:

1. 创建一个简单的job,用于计算pi的值,精度为小数点后2000位,对应yaml:

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

此时k8s会在node上起一个pod,当pod完成计算任务之后,状态会更新为complete,而job的状态也是complete

 

上述例子中,当一个pod完成任务之后,job的状态即为complete,也就是completions的值达到1时则认为job已经完成。其实我们通过指定job的completions值,来决定job完成的条件。

2. 创建一个job任务,当completions值达到3时job才完成,并使用并发数量为2,即同一时刻该job有对应两个pod在工作,eg:

[root@calico learn]# cat job-parallel.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
  parallelism: 2
  completions: 3
  template:
  spec:
    containers:
    - name: pi
      image: perl
      command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    restartPolicy: Never
    backoffLimit: 4

此时查看pod的状态:

#先创建2个pod用于执行任务
[root@calico learn]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-2xlxl 0/1 ContainerCreating 0 23s <none> calico-node1 <none> <none>
pi-7wcbj 0/1 ContainerCreating 0 23s <none> calico-node2 <none> <none>
...

#等一会之后,2个pod完成,再起第3个pod来完成第三个completion目标
[root@calico learn]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-2xlxl 0/1 Completed 0 7m14s 192.168.63.150 calico-node1 <none> <none>
pi-7wcbj 0/1 Completed 0 7m14s 192.168.186.85 calico-node2 <none> <none>
pi-996x8 1/1 Running 0 3m8s 192.168.63.151 calico-node1 <none> <none>

#查看此时job的状态,completions为2/3
[root@calico learn]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pi 2/3 7m26s 7m27s pi perl controller-uid=9736793a-5075-11e9-a970-5254000ebe60
...

#此时3个pod都完成任务,状态都为complete
[root@calico learn]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-2xlxl 0/1 Completed 0 8m37s 192.168.63.150 calico-node1 <none> <none>
pi-7wcbj 0/1 Completed 0 8m37s 192.168.186.85 calico-node2 <none> <none>
pi-996x8 0/1 Completed 0 4m31s 192.168.63.151 calico-node1 <none> <none> 

#查看此时job的状态,completions为3/3
[root@calico learn]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pi 3/3 8m38s 9m27s pi perl controller-uid=9736793a-5075-11e9-a970-5254000ebe60

在job的yaml中,有个参数为backoffLimit。该参数为job在执行过程中,指定任务执行失败重试的次数,但达到backoffLimit后任务仍未成功,则job的状态会更新为failed。

除了backoffLimit用于限制job执行的次数,job的timeout机制也用于限制job执行的时间,当job超过timeout时间,则job的状态也会更新为failed。注意,当job指定了timeout之后,backoffLimit参数就不生效了。

3.  创建一个带timeout的job,通过在yaml中指定activeDeadlineSeconds:

[root@calico learn]# cat job-timeout.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi-timeout
spec:
  parallelism: 2
  completions: 3
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

显然该job执行时间会超过100s,因此job会超时失败。

#查看job状态
[root@calico learn]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pi-timeout 0/3 109s 109s pi perl controller-uid=e34174a9-5077-11e9-a970-5254000ebe60

#查看pod状态
[root@calico learn]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-timeout-5rkvs 1/1 Terminating 0 113s 192.168.186.86 calico-node2 <none> <none>
pi-timeout-6cj5k 1/1 Terminating 0 113s 192.168.63.152 calico-node1 <none> <none>

可以看到,超过100s之后,job并没有完成,此时会把pod删掉。注意,job的删除是级联的(cascading),因此pod和job都会被删掉。

此时查看job的详细信息,可以看到pod状态是0 Running / 0 Succeeded / 2 Failed:

[root@calico learn]# kubectl describe job pi-timeout
Name: pi-timeout
Namespace: default
Selector: controller-uid=e34174a9-5077-11e9-a970-5254000ebe60
Labels: controller-uid=e34174a9-5077-11e9-a970-5254000ebe60
job-name=pi-timeout
Annotations: <none>
Parallelism: 2
Completions: 3
Start Time: Wed, 27 Mar 2019 06:05:45 -0400
Active Deadline Seconds: 100s
Pods Statuses: 0 Running / 0 Succeeded / 2 Failed
Pod Template:
Labels: controller-uid=e34174a9-5077-11e9-a970-5254000ebe60
job-name=pi-timeout
Containers:
pi:
Image: perl
Port: <none>
Host Port: <none>
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m5s job-controller Created pod: pi-timeout-5rkvs
Normal SuccessfulCreate 2m5s job-controller Created pod: pi-timeout-6cj5k
Normal SuccessfulDelete 25s job-controller Deleted pod: pi-timeout-5rkvs
Normal SuccessfulDelete 25s job-controller Deleted pod: pi-timeout-6cj5k
Warning DeadlineExceeded 25s job-controller Job was active longer than specified deadline 

在上面的例子中,当pod finished之后(finished指pod的状态是complete或者failed),pod仍然运行在系统上,这会占用系统的资源,对系统造成一定的负担。因此,在k8s 1.12版本之后,引入ttl controller,对应finished状态的pod进行清理。(目前ttl  controller也只是对job资源有清理,后续会对其他资源也支持)

当在job的yaml设置ttl后,ttl controller会在pod状态更新为finished之后,经过ttl秒删掉把pod删掉。注意,删除是把pod,job都删掉了

  • ttl为0时,finished后马上删掉
  • ttl不为n,经过n秒之后删除finished的pod
  • ttl不设置,不会删除finished的pod,job

示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-ttl
spec:
  ttlSecondsAfterFinished: 100
  template:
  spec:
    containers:
    - name: pi
      image: perl
      command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    restartPolicy: Never

 

4. 前面提到,k8s job的删除是级联的,即删掉job之后,也会对应的把pod删掉。那么当我们有时不希望把pod删掉,只对job进行操作呢。比如,pod正在跑现网上的任务,而我们又需要修改job模板,比如job的名字等等,此时我们可以用这个命令:

kubectl delete jobs/old --cascade=false

此命令不会删除pod,只会删除对应的job

 

5. job的RestartPolicy

job支持的RestartPolicy有两种:OnFailure或Never。而在k8s中,RestartPolicy默认是Always。因此部署job时,一定要指定job的RestartPolicy,否则会有问题。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s job机制初探 的相关文章

  • K8s中的Deployment

    Deployment是kubernetes在1 2版本中引入的新概念 用于更好的解决Pod的编排问题 为此 Deployment在内部使用了ReplicaSet来实现目的 我们可以把Deployment理解为ReplicaSet的一次升 级
  • Kubernetes Pod 故障归类与排查方法

    1 Pod 概念 Pod是kubernetes集群中最小的部署和管理的基本单元 协同寻址 协同调度 Pod是一个或多个容器的集合 是一个或一组服务 进程 的抽象集合 Pod中可以共享网络和存储 可以简单理解为一个逻辑上的虚拟机 但并不是虚拟
  • K8S 工作负载(一)

    K8S 工作负载 1 Pod Pod 是 Kubernetes 中创建 管理和调度的最小计算单元 用户可以在 K8S 中通过调用 Pod API生成一个 Pod 让 K8S 对其进行调度 Pod 是一组 一个或多个 容器 这些容器共享存储
  • k8s安装遇到过的一些问题

    无法获取recomended yaml文件 root k8master1 wget https raw githubusercontent com kubernetes dashboard v2 7 0 aio deploy recomme
  • kubernetes08(kubernetes的资源对象)

    文章目录 kubernetes08 kubernetes的资源对象 一 引子 二 kubernetes资源 一 kubernetes的资源对象作用 二 kubernetes的资源对象分类 三 kubernetes资源清单 一 kubenet
  • Deployment Controller 典型使用场景

    1 重新调度 Rescheduling 不管想运行 1 个副本还是 1000 个副本 副本控制器都能确保指定数量的副本存在于集群中 即使发生节点故障或 Pod 副本被终止运行等意外状况 2 弹性伸缩 Scaling 手动或者通过自动扩容代理
  • k8s基础概念、ETCD

    原理 和k8s结合点 etcd与k8s的交集 维护 基础概念 物理组件 逻辑组件 网络组件 工作负载 1 物理组件 Master Control plane kube apiserver 提供唯一api接口 提供集群管理接口 用户认证授权
  • k8s部署之ETCD集群

    k8s部署之ETCD集群 1 etcd下载 etcd下载地址 https github com coreos etcd releases 从github etcd的发布页面选取相应的版本用 wget url 来下载 如 wget https
  • k8s之nginx-ingress做tcp或udp的4层网络负载

    检查nginx ingress是否开启tcp udp转发 test test02 ingress kubectl get pod n ingress nginx o yaml grep i configmap configmap POD N
  • CentOS 7 下 minikube 部署 && 配置

    CentOS 7 下 minikube 部署 配置 文章目录 CentOS 7 下 minikube 部署 配置 下载 安装 下载安装脚本 安装 minikube 启动 minikube 环境 安装 kubectl 工具 启动 miniku
  • IDEA远程调试

    1 概述 原理 本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信 传递调试指令和调试信息 被调试程序的远程虚拟机 作为 Debug 服务端 监听 Debug 调试指令 jdwp是Java Debug Wire
  • kubectl常用命令

    alias k kubectl alias kc k create f alias kgp k get pods alias kdp k describe pods alias kdep k delete pods alias kl k l
  • kubeadm配置虚拟机k8s集群

    环境 centos7 vm pro windows terminal termius 虚拟机 硬件配置 2核2G 实验用 具体可根据电脑调整 配置3台 master01 node01 node02 通过克隆虚拟机直接复制 配置通一项以后建议
  • Kubernetes + Dashboard 集群搭建

    1 环境说明 基于kubeadm工具部署k8s 集群 还有基于二进制的部署方式但是需要单独部署k8s的每个组件比较繁琐 kubeadm是 Kubernetes官 提供的 于快速部署Kubernetes集群的 具 基于Kubernetes v
  • K8S暴露服务的三种方式

    文章目录 暴露服务的三种方式 NodePort LoadBalane Ingress 内容参考 暴露服务的三种方式 NodePort 将服务的类型设置成NodePort 每个集群节点都会在节点上打 开 一 个端口 对于NodePort服务
  • k8s学习(五)ReplicaSet的使用

    ReplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合 可确保指定数量的pod在任何设定的时间运行 因此 它通常用来保证给定数量的 完全相同的 Pod 的可用性 示例 1 nginx
  • 【云知识】云计算平台都有那些,涨涨云概念

    2023年 第36周 给自己一个目标 然后坚持总会有收货 不信你试试 云计算平台是指为企业和个人提供云计算服务的基础架构和环境 它提供了一系列的硬件 软件和网络设施 用于支持应用程序的部署 管理和运行 以及数据的存储 处理和传输 目录 一
  • DHorse v1.3.2 发布,基于 k8s 的发布平台

    版本说明 新增特性 构建版本 部署应用时的线程池可配置化 优化特性 构建版本跳过单元测试 解决问题 解决Vue应用详情页面报错的问题 解决Linux环境下脚本运行失败的问题 解决下载Maven安装文件失败的问题 升级说明 下载v1 3 2安
  • 容器与集群——通过deployment 创建pod以及Java Web应用的容器化发布

    一 通过deployment 创建pod 1 1 编写yaml文件 1 2 安装pod 创建 kubectl create f dp nginx yaml 查看Deployment信息 1 3 查看相关信息 查看pod信息 kubecel
  • flannel和calico区别

    k8s网络模式 Flannel数据包在主机间转发是由backend实现的 目前已经支持UDP VxLAN host gw等多种模式 VxLAN 使用内核中的VxLAN模块进行封装报文 也是flannel推荐的方式 host gw虽然VXLA

随机推荐

  • Downloading C/C++ language components (Linux / x86_64)

    Problem The report from vscode as shown in the title cannot be canceled and keep showing there This happens when I am tr
  • Linux 安装gcc和运行代码(Ubuntu为例)

    目录 一 安装gcc 二 gcc编译 运行代码 首先检测网络连通性 一 安装gcc 1 打开虚拟机终端 安装gcc 输入 sudo apt install gcc 2 安装完成后检查 输入 gcc version 如果出现以下内容 则说明安
  • 基于沙猫群优化算法的线性规划求解matlab程序

    基于沙猫群优化算法的线性规划求解matlab程序 1 沙猫群优化算法 沙猫的中文学名叫沙丘猫 俗名沙漠猫 与荒漠猫名字相似 但却是两种不同的猫科动物 沙猫生活在茫茫沙漠里 主要分布在分布于非洲北部 阿拉伯半岛中部和西南亚 沙猫的家园 是贫瘠
  • Node.js 从零开发 web server博客项目[koa2重构博客项目]

    web server博客项目 Node js 从零开发 web server博客项目 项目介绍 Node js 从零开发 web server博客项目 接口 Node js 从零开发 web server博客项目 数据存储 Node js
  • 【Python脚本抢红包】用Python写了一个自动抢红包工具,今年过年准备大干一场

    话说又要过年了 现在过年可没有小时候的味道了 小时候只顾着放鞭炮 现在只顾着各个群里蹲红包 但是手动抢肯定没戏 毕竟手can谁也没办法 那就只能试试能不能通过编程的方式实现自动化抢红包了 跟小编一样财迷的铁汁们 可以往下滑了 代码文末可取
  • 基于计算机视觉的智能制造:实现对智能制造的实时监控和调度

    作者 禅与计算机程序设计艺术 1 简介 智能制造 Intelligent Manufacturing 是在不断进步的科技和技术领域里 将智能技术应用到制造领域中去 实现机器 设备 材料的自动化和精准化过程 提升生产效率 降低成本 节约能源和
  • ESX虚拟机克隆后提示设备"0"的配置无效

    一般是克隆后mac地址与原网卡mac地址不符导致的 解决办法 下载虚拟机 vmx文件 修改其中的跟网卡eth0相关的mac地址跟实际mac相符 实在不行就删除网卡0 再添加一块网卡 有时候网卡驱动类型不符也不会报类似的错误 虚拟网卡一般有三
  • 区块链100讲:Hyperledger Fabric 中的链码(智能合约)

    1 链码概念 网络运行环境我们已经启动完成 现在我们从开发者的角度来认识一下完成交易所必须的智能合约 在 Hyperledger Fabric 中被称之为 Chaincode 也就是链上代码 的相关知识 以便于理解账本中的数据到底是通过什么
  • Windows 找不到文件 ‘gpedit.msc‘。请确定文件名是否正确后,再试一次。(已解决)

    今天在使用命令gpedit msc打开组策略编辑器报错 Windows 找不到文件 gpedit msc 请确定文件名是否正确后 再试一次 离谱 我都没改过设置什么的 后来找到解决办法 重新安装 桌面新建txt文档 文档里输入内容 echo
  • 程序员-接单网站

    远程工作平台 1 靠山云 https www kaoshanyun com 靠山云平台新型远程办公兼职平台 为中高端程序员 产品经理和设计师等等互联网相关人员提供稳定的线上工作机会 包括自由工作 远程工作和兼职工作 还支持按需雇佣 工作模式
  • C++ 程序抛异常产生的 core 文件,无法显示正确的函数调用栈信息(备忘)

    问题 比如 如下程序 include
  • Windows与Mac中idea常用快捷键转换

    从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 Command Shift Caps Lock Option Control Return Enter Delete 向前删除键 Fn Delete 上箭头 下箭头
  • Xlua学习笔记

    本篇笔记是记录 游戏热更新实战案例 基于xLua 的学习笔记 1 Xlua的环境搭建 1 导入Xlua插件 上Github上下载Xlua插件 将Xlua解压 将Asset下的所有文件拷贝到当前项目目录Asset下 拷贝与Asset同级目录下
  • 关于STM32L系列MCU adc 测地信号不为0

    关于STM32L011系列MCU adc 测地信号不为0 Analog模拟adc测试为40或更大 如图所示 之前请教很多工程师说 adc 引脚没有接到真正的地信号 AD IO 一般 RC 过后到IO或者其它干扰影响 但最终也没有解决 尝试新
  • 框架——Mybatis中resultType和resultMap的区别

    一 区别简述 1 Mybatis的结果集是通过反射实现的 2 MyBatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型 基础类型 包装类型 而r
  • 数据结构---填数字

    填数字 JAVA实现 C 实现 JAVA实现 public static int myFindABC int total 0 int sum 0 HashMap
  • 大规模部署lxc容器遇到的若干问题

    线程数控制 启动线程过多会导致资源不足引发的lxc start命令无法执行问题 到致大量容器只执行了lxc copy 而无法真正运行 具体情况应视服务器硬件条件 cpu 内存 在本项目部署中主要瓶颈在于cpu 以及当前服务器状态 当前主要是
  • Nginx Proxy Manger-反向代理神器-Docker一键部署

    Nginx Proxy Manger 反向代理神器 利用Docker实现一键部署 Lunix发行版 推荐使用Debian 10 或者 Ubuntu 20 04或更高版本 Nginx Proxy Manger 是一个反向代理管理系统 它基于
  • vuex存储保存数据、使用数据,超详细解说

    之前的项目中使用过一次vuex搭配localstorage存储token 使token持久化保存 好长时间不用 又把vuex的使用忘的一干二净 重新百度搜索 自己尝试后实现需求 我的业务需求是父页面中嵌套了一个子页面 父页面的一个卡片列表区
  • k8s job机制初探

    博客作为学习笔记记录 若有理解或表述错误 欢迎指出 k8s的job机制 k8s官网参考 k8s的job是用来执行一次性任务的一类资源 相关的还有cronjob 用于执行以下周期性任务 部署job之后 k8s会起对应pod 当pod的状态为f