replicaSet,DaemonSet and Job

2023-10-25 09:50
文章标签 job daemonset replicaset

本文主要是介绍replicaSet,DaemonSet and Job,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ReplicaSet

上一篇讲到的 ReplicationController 是用于复制和在异常的时候重新调度节点的 K8S 组件,后面 K8S 又引入了 ReplicaSet 资源来替代 ReplicationController

ReplicationController 和 ReplicaSet 有什么区别呢?

ReplicationController 和 ReplicaSet 的行为是完全相同的,但是 ReplicaSet 的 pod 选择器表达能力更强

  • ReplicationController 只允许包含某个标签的匹配 pod
  • ReplicaSet 可以包含特定标签名的 pod ,例如 env=dev 和 env=pro 一起匹配
  • ReplicaSet 还可以匹配缺少某个标签的 pod

总之,无论 ReplicationController 匹配的标签值是多少,ReplicationController 都无法基于标签名来进行匹配,例如 匹配env=* ReplicationController 就不行,但是 ReplicaSet 可以

写一个 ReplicaSet Demo

rs 是 ReplicaSet 的简称,写一个 ReplicaSet 的 demo

  • api 版本是 apps/v1

此处的 api 版本和之前我们写到的有些许不一样,这里解释一下

此处的 apps 代表的是 api 组的意思

这里的 v1 代表的是 apps 组下的 v1 版本,此处就和我们平时写的 路由一样

  • 副本数 3 个
  • 选择器指定匹配标签为 app=xmt-kubia ,(ReplicationController 是直接写在 selector 后面)
  • 模板拉取的镜像是 xiaomotong888/xmtkubia

kubia-rs.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:name: kubia-rs
spec:replicas: 3selector:matchLabels:app: xmt-kubiatemplate:metadata:labels:app: xmt-kubiaspec:containers:- name: rs-kubiaimage: xiaomotong888/xmtkubiaports:- containerPort: 8080

部署 rs

kubectl create -f kubia-rs.yaml

部署 rs 后,我们可以看到,通过 Kubectl get rs 查看新建的 rs 基本信息

对于原本就有的 3 个标签为 app=xmt-kubia 的 pod 没有影响, rs 也没有多创建 pod ,这没毛病

rs 也是会去搜索环境内的匹配的标签对应的 pod 个数,然后和自己配置中的期望做比较,若 期望的大,则增加 pod 数量,若期望的小,则减少 pod 数量

感兴趣的朋友 也可以使用 kubectl describe 查看一下这个 rs ,和 rc 没有什么区别

ReplicaSet 可以这样用

上面的例子我我们可以看到的 RepilicaSet 使用 matchLabels 的时候 好像和 ReplicationController 没有什么区别,那么现在我们可以来丰富一下我们的选择,我们可以使用 matchExpressions

例如我们在 yaml 加入 matchExpressions 的时候,我们可以这样来写

省略多行...
selector:matchExpressions:- key: envoperator: Invalues:- dev
省略多行...

例如上面 yaml 代码段的含义是:

  • 匹配的标签 key 是 env
  • 运算符是 In
  • 匹配的 env 对应的 值是有 dev 即可

key

具体的标签 key

operator

运算符,有这 4 个

  • In

Label 的值必须与其中一个制定的 values 匹配

  • NotIn

Label 的值必须与任何制定的 values 不匹配

  • Exists

pod 必须包含一个制定的名称的标签,有没有值不关心,这个时候不要指定 values 字段

  • DoesNotExist

pod 的标签名称不得包含有指定的名称,这个时候不要指定 values 字段

注意

如果我们指定了多个表达式,那么需要这些表达式都是 true 才可以生效,才可以正确匹配

删除 rs

删除 rs 的时候和删除 rc 的做法是一样的,默认的话都是会删除掉 rs 管理的 pod ,如果我们不需要删除对应的 pod ,那么我们也可以加入 --cascade=false 或者 –cascade=orphan

按照上述方式指定之后,删除 rs ,就不会对 pod 有任何影响

DaemonSet

前面说到的 ReplicationController 和 ReplicaSet 都是在 k8s 集群中部署特定的数量的 pod,但是 pod 具体是运行在哪个节点上的,不太关心。

现在我们可以来分享一个 DaemonSet ,它也是 k8s 中的一种资源

当我们希望我们的 pod 正好在每一个节点运行一个的时候,可以使用 DaemonSet 资源来进行管理

DaemonSet 没有副本数的概念,他是检查每个节点里面是否有自己管理的标签对应的 pod,若有就维持,若没有就创建

如下是一个 ReplicaSet 和 DaemonSet 管理内容和方式的简图:

图中,我们可以看出 DaemonSet 是每个节点分别部署一个 pod ,但是ReplicaSet 只是保证整个集群中自己管理对应标签的 pod 数量是 4 个即可

DaemonSet 的 小案例

DaemonSet 资源也是使用的 apps/v1 api 版本

  • 匹配标签 app=ssd

  • pod 模板中我们设置该 pod 指定运行在 标签为 disk=ssdnode 的节点上运行 ,可以通过 nodeSelector 关键字来指定

  • 镜像拉取的是 xiaomotong888/xmtkubia

daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:name: kubia-ds
spec:selector:matchLabels:app: ssdtemplate:metadata:labels:app: ssdspec:nodeSelector:disk: ssdnodecontainers:- name: rs-kubiaimage: xiaomotong888/xmtkubiaports:- containerPort: 8080

部署 DaemonSet

我们使用命令部署 DaemonSet

kubectl create -f daemonset.yaml

查看 ds 的信息, ds 是 DaemonSet 的简称

kubectl get ds

使用命令查看 node 节点情况

kubectl get nodes

通过上图我们可以看出,部署完 DaemonSet 资源之后,每一项参数都是 0

原因是,DaemonSet 查找环境中没有标签是 disk=ssdnode 的节点

给指定的 node 加上标签 disk=ssdnode

kubectl label node minikube disk=ssdnode

加上标签之后,我们可以看到上述图片, DaemonSet 资源的各项参数变成了 1,查看 pod 的时候,也看到了对应的 pod 资源

此处演示使用的是 minikube ,因此只有一个 节点

再次修改 node 的标签

我们再次修改 node 标签,那么之前的 pod 是不是会被终止掉呢?我们来试试吧

kubectl label node minikube disk=hddnode --overwrite

果然没毛病老铁,当我们修改环境中指定节点的标签后,由于 DaemonSet 资源搜索环境中没有自己配置中指定的标签对应的节点,因此,刚才的 pod 就会被销毁掉

Job

再来介绍一下 k8s 中的 Job 资源

Job 资源是运行我们运行一种 pod,一旦程序运行 ok,pod 就会推出,job 就结束了,他不会重启 pod

当然,job 管理的 pod ,如果在运行过程中,发生了异常,我们是可以配置 Job 重启 pod 的

如下画了一个 ReplicaSet 和 Job 管理 pod 的简图:

上图中我们可以看到,被 ReplicaSet 和 Job 资源管理的 pod,当节点发生异常或者 pod 自身发生异常的时候,这些 pod 是会被重启的,不需要人为的去操作

但是没有被上述资源管理的 pod,一旦发生异常,就没有人负责重启了

Job 案例

创建一个 Job 的资源,也是通过 yaml 的方式

  • 类型为 Job
  • 模板中的重启策略设置为 失败的时候重启 restartPolicy: OnFailure此处的策略不能设置为 Always,设置成 Always 是会总是重启 pod 的
  • 拉取的镜像是 luksa/batch-job

这个镜像是 docker hub 上的镜像,拉出来程序启动之后,运行 2 分钟会结束程序

myjob.yaml

apiVersion: batch/v1
kind: Job
metadata:name: batchjob
spec:template:metadata:labels:app: batchjob-xmtspec:restartPolicy: OnFailurecontainers:- name: xmt-kubia-batchimage: luksa/batch-job

部署 Job

kubectl create -f myjob.yaml

可以看到 Job 资源已经部署成功了,且 pod 已经是在创建中了

pod 运行过程中,我们查看一下这个 pod 的日志

kubectl logs -f batchjob-gpckc

可以看到程序有开始日志的输出

image-20211226174557691

等到 pod 运行 2 分钟左右的时候,我们可以继续查看日,程序已经成功结束了,且我们的 pod 也进行了 Completed 状态 ,该 Job 也结束了

上述说到的 Job 资源,也可以设置多个 pod 实例,可以设置多个 pod 实例并行运行,也可以设置串行运行,就看我们的业务需求是什么样的了

串行的话,我们可以这样来写 yaml:

在定义 Job 资源的时候,配置上 completions 即可, Job 资源就会一个挨着一个的创建 pod 运行,pod 运行结束后,再创建下一个 pod

apiVersion: batch/v1
kind: Job
metadata:name: batchjob
spec:completions: 10template:省略多行...

并行的话我们可以这样来写 yaml:

设置并行的话,我们只需要在上面的 yaml 上加入 parallelism 配置即可,表示并行运行多少个 pod

apiVersion: batch/v1
kind: Job
metadata:name: batchjob
spec:completions: 10parallelism: 4template:省略多行...

CronJob

上面的 Job 管理的 pod,都是启动一次,运行一次,或者是控制运行的次数,那么,我们能不能控制周期性的运行 一个 pod 呢?

k8s 中当然是可以的了,我们就可以使用 k8s 中的 CronJob 资源来完成我们的想法

我们只需要在 yaml 文件中写好 CronJob 的配置即可,指定好 pod 运行的周期时间即可

CronJob 的 demo

  • 资源类型是 CronJob
  • 运行的周期是 "* * * * *" , 表示 每隔 1 分钟运行一次 pod

cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:name: mycronjob
spec:schedule: "* * * * *"jobTemplate:spec:template:metadata:labels:app: cronjob-xmtspec:restartPolicy: OnFailurecontainers:- name: cronjobxmtimage: luksa/batch-job

此处我们设置的是每一分钟运行一次 pod ,我们要是有别的需求也可以自行设定,上述 5 个 * 含义如下:

  • 分钟
  • 小时
  • 星期

例如,我需要设置每个星期一的,8 点起床,就可以这样写

“0 8 * * 1”

部署 CronJob

kubectl create -f cronjob.yaml

查看 CronJob

kubectl get cj

部署 cj 后,我们可以看到 cj 已经起来了,但是好像还没有对应的 pod 被创建,cj 是 CronJob 简称

当然是不会有 pod 被创建的了,需要等 1 分钟才会创建

再次查看我们的 cj ,我们可以看到 ACTIVE 已经是 1 了,说明已经通过 cj 创建了 1 个 pod

我们来查看 pod ,果然是创建成功了一个 pod,且已经在运行中了,没毛病老铁

我们在使用 CronJob 资源的时候,会遇到这么一种情况:

启动的 Job 或者 pod 启动的时候相对比较晚的时候,我们可以这样来设定一个边界值

当我们的 pod 开始启动的时间不能晚于我们预定时间的过多,我们可以设置成 20s,如果晚于这个值,那么该 job 就算是失败

我们可以这样来写 yaml:

apiVersion: batch/v1beta1
kind: CronJob
metadata:name: mycronjob
spec:schedule: "* * * * *"startingDeadlineSeconds: 20jobTemplate:省略多行...

以上就是本次的全部内容了,分别分享了 ReplicaSet,DaemonSet,Job,CronJob,感兴趣的朋友行动起来吧

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

这篇关于replicaSet,DaemonSet and Job的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/281757

相关文章

XXL-JOB实践:从零开始构建你的任务调度系统

目录 一、序言1、系统组成2、架构图 二、部署调度中心1、下载源码2、执行数据库脚本3、修改application.properties配置文件4、启动调度中心 三、部署执行器1、引入依赖2、执行器配置2.1 XxlJobProperties属性文件2.2 XxlJobConfig配置类2.3 XxlJobHanlder作业处理器2.4 application.yml 3、启动执行器 四、调

XXL-JOB分布式任务调度教程(持续更新~)

先大致声明一下流程(具体细节在下面哦~)  步骤: 1.下载xxl-job并配置以及启动 2.导入对应maven坐标 3.配置对应的配置文件以及编写对应的配置类config 4.编写要触发的方法并且给方法打上@XXlJob("")注解 5.设置xxl-Job平台上的任务    5.1创建执行器  5.2创建任务,5,3配置任务具体细节(比如  (1触发执行器,(2执行时间,(3运行模式,(4以

App使用Job中遇到的WAIT DEV_NOT_DOZING的解决方案

摘要: 由于原生Job机制会使用Doze的白名单,故遇到WAIT:DEV_NOT_DOZING现象,一般配置为Whitelist user apps名单即可解决问题 Doze名单类型 配置对象 配置方法 影响 Whitelist user apps 第三方应用 1.Adb shell 命令:adb shell dumpsys deviceidle whitelist +com.t

如何解决XXL-JOB依赖包冲突导致的`XxlJobSpringExecutor`类找不到问题

如何解决XXL-JOB依赖包冲突导致的XxlJobSpringExecutor类找不到问题 在Java项目开发中,依赖包冲突是一个常见问题,尤其是在多个项目之间存在传递性依赖的情况下。本文将以XXL-JOB项目中的 XxlJobSpringExecutor 类找不到为例,介绍如何在依赖冲突场景下排查并解决问题。 问题背景 我们在项目A中使用了XXL-JOB进行任务调度,项目A依赖于项目B,而

专访当当网张亮:深度解读分布式作业调度框架elastic-job

摘要:日前,笔者采访了当当网架构师、当当技术委员会成员张亮,在本次采访中他主要分享了对架构师的理解,以及重点解读了分布式作业调度框架elastic-job是什么、架构设计思路、具体模块的底层及如何实现等。 【编者按】互联网从诞生到现在,网站的规模不断扩大,存储和处理的数据量也远远超出了人们的想象,又随着对信息实时性、多媒体需求大幅增长的现象,互联网架构面临越来越大的挑战。CSDN致力于

搭建 xxl-job 执行器项目

文章目录 1、添加xxl-job-core依赖2、修改执行器配置3、添加执行器配置类4、给执行器添加任务 1、添加xxl-job-core依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><

xxl-job介绍

文章目录 1、现有的定时任务存在缺点:2、分布式定时任务xxl-Job3、项目结构 1、现有的定时任务存在缺点: 定时任务和触发机制耦合(使用xxl-job统一定义任务及管理任务,任务代码和触发机制解耦合)修改触发机制需要重启(使用xxl-job统一配置不重启)不具备分布式 2、分布式定时任务xxl-Job xxl(作者:许雪里)官方网站:https://www.xuxuel

《花100块做个摸鱼小网站! 》第五篇—通过xxl-job定时获取热搜数据

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → 🐟 摸鱼小网站地址 学代码 → 💻 源码库地址 一、前言 我们已经成功实现了一个完整的热搜组件,从后端到前端,构建了这个小网站的核心功能。接下来,我们将不断完善其功能,使其更加美观和实用。今天的主题是如何定时获取热搜数据。如果热搜数据无法定时更新,小网站将失去其核心价值。之前,我采用了@Scheduled注解来实现定

git pull失败提示fatal: Unable to create 'E:/job/tpaas-web/.git/index.lock': File exists.

git 提交时失败   提示如下错误:fatal: Unable to create 'E:/job/tpaas-web/.git/index.lock': File exists.   解决方法:删除.lock文件       rm -f ./.git/index.lock 命令执行后再次pull

干掉xxl-job:elastic-job王者归来

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取推荐书籍 导读: 调度(Scheduling)在计算机领域是个庞大概念,CPU 调度、内存调度、进程调度等都可称之为调度。它是指在特定的时机分配合理的资源去处理预先确定的任务,用于在适当的时机触发一个包含业务逻辑的应用。调度无论在单机还是分布式环境中都是很重要的课题。在单机环境,调度与底层操作系统脱离不了干系;而在分布式环境中,