replicaSet,DaemonSet and Job

news2024/11/16 5:32:17

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: 3
  selector:
    matchLabels:
      app: xmt-kubia
  template:
    metadata:
      labels:
        app: xmt-kubia
    spec:
      containers:
      - name: rs-kubia
        image: xiaomotong888/xmtkubia
        ports:
        - 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: env
      operator: In
      values:
        - 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: ssd
  template:
    metadata:
      labels:
        app: ssd
    spec:
      nodeSelector:
        disk: ssdnode
      containers:
      - name: rs-kubia
        image: xiaomotong888/xmtkubia
        ports:
        - 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-xmt
    spec:
      restartPolicy: OnFailure
      containers:
      - name: xmt-kubia-batch
        image: 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: 10
  template:
  省略多行...

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

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

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

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-xmt
        spec:
          restartPolicy: OnFailure
          containers:
          - name: cronjobxmt
            image: 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: 20
  jobTemplate:
  省略多行...

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

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

大家好,我是你们的小米!今天,我们来聊聊Java中一个备受争议的话题——"一个类可以继承多个类吗?"这是一个让许多Java初学者困惑的问题,也是一个常常被问及的热门话题。那么,到底Java中是否允许一…

Multi-Aspect Explainable Inductive Relation Prediction by Sentence Transformer

摘要 最近关于知识图(KGs)的研究表明,通过预先训练的语言模型授权的基于路径的方法在提供归纳和可解释的关系预测方面表现良好。本文引入关系路径覆盖率和关系路径置信度的概念,在模型训练前过滤掉不可靠的路径,以提高模型的性能。此外,我们提出了知识推理句子转换器(Know…

MySQL索引介绍及底层数据结构B+树介绍

索引 1. 索引概述1.1 索引1.2 索引的优缺点1.2.1 优点1.2.2 缺点 2. InnoDB中的索引2.1 主键索引设计方案2.2 索引底层数据结构2.3 常见索引2.3.1 聚簇索引2.3.1.1 优点2.3.1.2 缺点 2.3.2 非聚簇索引2.3.3 联合索引 3. MyISAM中的索引3.1 MyISAM 与 InnoDB对比 1. 索引概述 1…

代码随想录算法训练营第59天 | 503.下一个更大元素 II + 42.接雨水

今日任务 目录 503.下一个更大元素 II - Medium 42.接雨水 - Hard 503.下一个更大元素 II - Medium 题目链接:力扣-503. 下一个更大元素 II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nu…

vmware提示此平台不支持虚拟化的Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT,是否继续?

当打开虚拟机时会发现弹出提示框显示不支持,只要检查三个步骤保证能正常使用 1、检查vmware虚拟机设置中处理器右边是否勾选虚拟化引擎 2、检查物理机中的windows组件是否冲突 打开控制面板选择程序和功能之后点击启用或关闭windows功能,取消Hyper-V 取…

插值算法

插值法在较少的数据模型的基础上模拟产生新的靠谱数值,可以用来预测。 利用已知的点建立合适的插值函数 f(x) ,未知点 x_i 由插值函数 f(x) 可以求出函数值 f(x_i) ,用求得的 (x_i,f(x_i))近似代替未知点。 基本概念: yf(x)在[a,b]上有定义 x…

MySQL之概述、安装和使用(一)

一、概述 关系数据库概述: https://blog.csdn.net/qq_21370419/article/details/128568920 二、数据库的安装 参考我的两篇博客: win10 安装mysql 5.6.36版本_windows 安装mysql5.6_人……杰的博客-CSDN博客 wind 10 安装 mysql 8.0_人……杰的博客…

二十三种设计模式第十五篇--模版方法模式

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。通过使用这种模式,我们可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 模版方法的思想 模板方法模式的核心思想是将一…

WebDAV之π-Disk派盘 + FE文件管理器

FE File Explorer是一款功能强大且易于使用的文件管理器,它可以让你轻松地管理内部和外部存储器上的文件和文件夹,支持云存储服务,如派盘、Dropbox等。结合FE File Explorer和派盘可以实现更加高效便捷的文件管理体验。 π-Disk派盘 – 知识…

#systemverilog#进程控制问题#(二)终止进程

二 线程的终止 2.1 命名块 + diable Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块。 这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我…

基于Prometheus 和 Grafana 实现springboot应用监控和服务器监控

目录 1.Prometheus环境搭建 1.1 下载和安装Prometheus 1.2 配置Prometheus 1.3 配置Prometheus抓取Spring Boot应用Metrics 1.4 启动Prometheus 2.Grafana环境搭建 2.1 下载和安装Grafana 2.2 配置Grafana数据源 2.3 创建Dashboard 3、NodeExporter(服务器…

华为云Astro出品《低代码开发者101问》电子书上线

这四年来,在低代码平台的运营和客户支持过程中,我们有幸见证了华为云低代码的成长,也有幸认识了很多有思想、有热情、有行动力的低代码开发者朋友,我们自身对低代码领域的认识和理解也在不断整合、刷新。与开发者、客户、伙伴以及…

Vue3使用混入(混合)

minixs/entity.js:混入代码 //混入的实体类 import { reactive } from vue;const userEntityMixin {setup() {const Admin reactive({id: -1,account: "",userPassword: "",});const Teacher reactive({id: -1,account: "",userP…

Nginx启动、关闭及信息查看命令

1、查找Nginx的位置 ps -aux | grep nginx 2、启动Nginx nginx直接启动,这时候可能出现两种情况: 第一种,就是Nginx已经启动过了,会提示端口被占用,启动失败 我们尝试杀掉占用端口的进程,然后重启 sys…

基于springboot图书个性化推荐系统的设计与实现【附ppt和万字文档(Lun文)和搭建文档】

主要功能 前台登录: ①首页:图书名称查询、图书信息推荐、好书推荐、图书信息展示 ②图书信息:图书类别、图书名称、名称类别作者查询、图书详情、收藏、点赞、评论 ③好书推荐:图书展示、点击查看 ④留言反馈:用户可…

爆肝整理,Docker容器测试-常见问题+解决(汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 问题1&#xff1a…

9 首页和图标定制

9.1 首页 springboot的首页是写在index.html中,而index.html可以放在静态资源存放的任何一个文件夹(public、resources、static)。然后,直接运行,访问localhost:8080即可。 9.2 图标定制 对于springboot2.7.13版本&am…

应用层:域名系统DNS

1.应用层:域名系统DNS(Domain Name System) 笔记来源: 湖科大教书匠:应用层概述 湖科大教书匠:域名系统DNS 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 DNS报文使用运输层的…

Rust 动态数组Vec基本概念及其用法

目录 一、基本概念 Vec是什么? Vec的特点 (1)动态大小: (2)可变性: (3)泛型: 二、基础用法 1. 创建 (1) Vec::new()方法 (2) Vec::from()方法 (3) vec! 宏 2. 基础用法 三、Vec的简单实现及其宏模拟 四、leetcode 实…

vue开发图表echarts基本使用

官网传送门 1.echarts-介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts3.echarts-基础配置 series -- 系列列表。每个系列通过 type 决定自己的图表类型 -- 大白话&#xff…