K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

news2024/11/26 20:38:19

一、前言

      前一章节我们介绍了RC,RS控制器,其主要针对在线业务Pod部署,比如nginx,这些业务是需要确保7*24持续运行的,还有一类离线业务,比如定时任务,大数据离线计算等,在有任务的才需要启动,且任务完成后可以销毁,释放资源。很显然,这类使用RC,RS控制器并不合适,K8S为这类任务提供了Job控制器。

     还有一类业务,比如日志,监控,安全等,需要固定常驻在某个节点,且不需要多副本,也不适合使用RC,RS控制器,K8S为这类任务提供了Daemonset控制器。

二、Job

Job为了完成某次任务,创建并启动Pod,当任务完成后,销毁Pod。

1、Job创建

我们先看下Job的yaml文件,内容如下:

[root@k8s-master yaml]# cat job-pod.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: job-pod
spec:
  template:
    spec:
     restartPolicy: OnFailure
     containers:
     - name: echo-job
       image: busybox
       args:
       - /bin/sh
       - -c
       - echo ok;sleep 30

与RC一样,Job的yaml也是嵌套了Pod的定义,其嵌套关系如下:

     这里使用busybox 镜像,执行"echo ok",并sleep 30s后退出。需要注意的是,在Pod层级的restartPolicy不能定义为Always(Always就是一直保持在线)。

我们执行下该文件,创建job

[root@k8s-master yaml]# kubectl apply -f job-pod.yaml 
job.batch/job-pod created
[root@k8s-master yaml]# kubectl get job
NAME      COMPLETIONS   DURATION   AGE
job-pod   0/1           18s        18s

再看下Job创建的pod

[root@k8s-master yaml]# kubectl get pod
[root@k8s-master yaml]# kubectl get pod
NAME                                READY   STATUS             RESTARTS           AGE
job-pod-6wnb7                       1/1     Running            0                  4s

生成了以Job名称为前缀的Pod,30s后,我们在查看下pod,该pod已经完成。

[root@k8s-master yaml]# kubectl get pod
NAME                                READY   STATUS             RESTARTS           AGE
job-pod-6wnb7                       0/1     Completed          0                  92m

2、运行多个实例

      实际工程中,我们可能需要启动多个pod实例同时完成某项任务,可以配置Job的如下两个属性:

completions:需要运行的pod数量。

parallelism:允许并发运行的 Pod 数量,默认为1,即顺序执行。

改写下前面的yaml文件,设置 completions为5,parallelism为2

[root@k8s-master yaml]# cat job-pod.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: job-pod
spec:
  completions: 5  
  parallelism: 2
  template:
    spec:
     restartPolicy: OnFailure 
     containers:
     - name: echo-job
       image: busybox
       args:
       - /bin/sh
       - -c
       - echo ok;sleep 30;

创建job并查看

[root@k8s-master yaml]# kubectl apply -f job-pod.yaml 
job.batch/job-pod created
[root@k8s-master yaml]# kubectl get job
NAME      COMPLETIONS   DURATION   AGE
job-pod   0/5           10s        10s

 监控 pod的运行实例,启动并保持两个pod并行运行

[root@k8s-master yaml]# kubectl get pod
NAME                                READY   STATUS             RESTARTS            AGE
job-pod-qc9bl                       1/1     Running            0                   20s
job-pod-tk5bd                       1/1     Running            0                   20s

最终完成5个pod

[root@k8s-master yaml]# kubectl get pod --watch
NAME                                READY   STATUS      RESTARTS           AGE
job-pod-qc9bl                       0/1     Completed   0                  3m53s
job-pod-rrjhf                       0/1     Completed   0                  2m25s
job-pod-tk5bd                       0/1     Completed   0                  3m53s
job-pod-zmltq                       0/1     Completed   0                  3m21s
job-pod-zmrc6                       0/1     Completed   0                  3m5s

另外还有以下两个属性控制Pod的运行,大家可以自行尝试下。

activeDeadlineSeconds:设置 Pod 运行的超时时间。

backoffLimit:设置 Pod 的失败重试次数。

三、CronJob

     Job资源创建时会立即执行,但一些批处理任务需要在特定的时间内运行,或者定时循环执行,这类任务称之为cron任务,K8S提供了CronJob控制器支持这种任务。

    CronJob的定义较简单,在Job模板外层再增加个schedule,配置cron表达式,我们看下yaml文件。

[root@k8s-master yaml]# cat cronjob-pod.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-pod
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure 
          containers:
          - name: echo-job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo ok;sleep 30;

同样的,我们来图示下嵌套模型

    在ConJob的层级中,我们增加了schedule属性,该属性支持cron表达式设置定时规则,关于cron表达式网上有很多资料,这里简单描述下,其时间列表从左到右,分别表示分钟,小时,每月中的第几天,月,星期几。比如本例中,表示间隔一分钟(从执行开始时间算起 ),执行一次。

执行该文件,创建cronjob对象

[root@k8s-master yaml]# kubectl apply -f cronjob-pod.yaml 
cronjob.batch/cronjob-pod created
[root@k8s-master yaml]# kubectl get cronjob
NAME          SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pod   */1 * * * *   False     0        <none>          10s

执行一段时间后,看下pod的情况

[root@k8s-master yaml]# kubectl get pod
NAME                                READY   STATUS             RESTARTS            AGE
cronjob-pod-27930314-jv726          0/1     Completed          0                   3m38s
cronjob-pod-27930315-hqg2s          0/1     Completed          0                   2m38s
cronjob-pod-27930316-vq5pc          0/1     Completed          0                   98s
cronjob-pod-27930317-ts8fn          1/1     Running            0                   38s

按照cron的配置,每分钟调度一次job,创建并启动pod执行。

四、Daemonset

在实际工程中,有以下几种类型业务:

  • 监控,监控节点的运行状态,并实时上报。
  • 日志采集,采集节点上产生的日志数据。
  • 安全应用,对节点进行安全扫描,管控审计等

这些业务的Pod,有以下几个共同特点

  • 与固定的节点绑定,不会漂移。
  • 常驻的守护进程,每个节点只存在一个,不会有多副本。

   为了满足这些特性,K8S提供了Daemonset控制器,其目标是在集群的每个节点上运行且仅运行一个 Pod,为节点配置一条"看门狗"。

1、Daemonset创建

我们先看下Daemonset的yaml文件

[root@k8s-master yaml]# cat nginx-daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx-daemonset
  template:
    metadata:
      labels:
        app: nginx-daemonset
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

同样的我们画出嵌套模型

     可以与K8S初级入门系列之六-控制器(RC/RS/Deployment)章节的deployment比较下,其差别在于不需要配置replicas属性。执行结果如下

[root@k8s-master yaml]# kubectl get daemonset
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonset   1         1         1       1            1           <none>          27m
[root@k8s-master yaml]# kubectl get pod -o wide
NAME                                READY   STATUS              RESTARTS           AGE    IP               NODE         NOMINATED NODE   READINESS GATES
nginx-daemonset-pxxb5               1/1     Running             0                  28m    10.244.36.100    k8s-node1    <none>           <none>

      可以看到,在节点(k8s-node1节点)上正确的创建一个daemonset Pod,但我们的环境中有两个节点,还有一个master节点,是没有部署的,是为什么呢?

   在K8S初级入门系列之五-Pod的高级特性章节中,我们了解了污点和容忍度的概念,正是因为master节点存在node-role.kubernetes.io/master:NoSchedule污点,所以pod无法调度到master节点,当然也包括daemonset创建的Pod,我们可以添加对该污点的容忍度,这样就可以调度了。修改的yaml如下

[root@k8s-master yaml]# cat nginx-daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx-daemonset
  template:
    metadata:
      labels:
        app: nginx-daemonset
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

再看下创建的Pod结果

[root@k8s-master yaml]# kubectl get pod -o wide
NAME                                READY   STATUS             RESTARTS            AGE     IP               NODE         NOMINATED NODE   READINESS GATES
nginx-daemonset-7plhc               1/1     Running            0                   2m6s    10.244.36.122    k8s-node1    <none>           <none>
nginx-daemonset-s2hrs               1/1     Running            0                   2m6s    10.244.235.197   k8s-master   <none>           <none>

可以看到,k8s-master节点也运行了该pod。

五、总结

       本章节我们介绍了Job,CronJob,DaemonSet三种控制器,包括其应用场景和方式。

      Job使用于一次性的任务,执行完成后,Pod资源会释放,一般适用离线计算等场景。可以通过completions,parallelism设置需要运行Pod的总量,以及并行运行Pod的数量。

       CronJob是一种特定类型的Job,可以通过schedule属性,配置cron表达式,实现定时任务的执行。

      DaemonSet控制器实现节点的"看门狗"任务,比如日志采集,监控等,它的特点是每个节点上都固定运行一个Pod,不会漂移,也不会有多副本。

 附:

K8S初级入门系列之一-概述

K8S初级入门系列之二-集群搭建

K8S初级入门系列之三-Pod的基本概念和操作

K8S初级入门系列之四-Namespace/ConfigMap/Secret

K8S初级入门系列之五-Pod的高级特性

K8S初级入门系列之六-控制器(RC/RS/Deployment)

K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

K8S初级入门系列之八-网络

K8S初级入门系列之九-共享存储

K8S初级入门系列之十-控制器(StatefulSet)

K8S初级入门系列之十一-安全

K8S初级入门系列之十二-计算资源管理

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

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

相关文章

在命令行模式、eclipse console下执行Java程序输入中文的几种情况尝试

介绍 在命令行模式下执行Java程序&#xff0c;如果输入中文&#xff0c;经常会出现和代码中的解码字符集不匹配的情况&#xff0c;导致结果不正确。 在命令行模式下执行Java程序&#xff0c;输入中文&#xff0c;其实是用某种字符集编码成字节流&#xff0c;Java程序读取该字节…

rk3588 双HDMI冲突问题与HDMI不能热插拔问题

问题一:HDMI不能热插拔问题 现象 rk3588在开发时现在发现只能在插入HDMI时上电才能输出信号,而当开机之后,再插入HDMI显示器则无信号。 分析 通过kernel显示,在开机后,插拔HMDI是有log提示的,说明内核能够检测到HDMI的插拔动作。 首先先排查软件问题,尝试重启显示进…

ssm项目配置,不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

ssm项目启动报错&#xff1a; 不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本 1.模块语言级别 2.设置模块目标字节码版本 3.pom文件指定jdk版本 <properties><project.build.soutceEncoding>UTF-8</project.build.sout…

SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter

1. 自动配置流程 导入starter依赖导入autoconfigure寻找类路径下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件启动&#xff0c;加载所有 自动配置类 xxxAutoConfiguration 给容器中配置功能组件组件参数绑定到 属性类中。xxxPrope…

运维高级学习---MySQL主从复制

MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机 (master)的数据复制到其他主机(slaves)上&#xff0c;并重新执行一遍来执行复制过程中一台服务器充当主服务器&#xff0c;而其他一个或多个其他服务器充当从服务器 为什么要做主从复…

用eNSP搭建一个最简单的网络系统

要求搭建如下网络系统&#xff1a; 相关知识&#xff1a; 路由器命令界面&#xff1a; 所有的设备进入后均名字为Huawai&#xff1b; < >代表了当下所在的配置模式&#xff1b; 不同模式具有不同的管理权限&#xff0c;可以完成不同的配置要求&#xff1b; 第一级模式 …

Excel 端口操作指南

通过将 EDI 报文可视化为 Excel&#xff0c;企业可以更好地了解和处理数据&#xff0c;提高工作效率&#xff0c;减少错误率。在未实现 EDI 系统和内部业务系统集成之前&#xff0c;Excel 方案则是一项可供选择的临时替代方案。 Excel方案的优点在于&#xff0c;无需对业务系统…

【深度学习笔记】随机梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

Qt图片编辑 - 在直线添加文字

在绘制一条直线时&#xff0c;比如说在直线中间输出文字&#xff0c;如下图所示 本质上不难&#xff0c;定位到位置&#xff0c;然后drawText就可以了 难就难在 文字要跟随线的斜率&#xff0c;例如 还有&#xff0c;文字最好保证在线的“上方” 首先是角度问题 这个角度跟线…

C#WinForm获取当前活动子窗体使用鼠标滚轮事件改变窗体大小

获取当前活动子窗体使用鼠标滚轮事件改变窗体大小&#xff0c;实例在文末&#xff0c;可下载。 这个主要分三个重点 第一步 我们需要让子窗体显示在父窗体中 Form22 new Form2(); Form22.TopLevel false; // 不是顶级窗体 //Form22.Parent this;// 设置父窗体 一定不要…

索引使用——SQL提示、覆盖索引、回表查询

1. SQL提示 use index是给MySQL一个提示&#xff0c;在执行的时候尽量使用该索引&#xff0c;至于MySQL最后会不会接收该建议&#xff0c;则不一定。 ignore index是mysql忽略某个索引。 force index则强制mysql使用该索引。mysql别无选择。 2.覆盖索引 覆盖索引和回表查…

MQ消息介绍

1、同步通讯 立即发出&#xff0c;立即回复。 同步通讯过程中&#xff0c;若有消息失败&#xff0c;一直重试&#xff0c;会造成阻塞&#xff0c;影响其它功能。 优点&#xff1a;时效性高 2、异步通讯 3、什么是MQ 稳定性、可用性、并发性极为重要。 MQ&#xff1a;消息即…

RocketMQ教程-(4)-领域模型-消费者(Consumer)

本文介绍 Apache RocketMQ 中消费者&#xff08;Consumer&#xff09;的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。 定义​ 消费者是 Apache RocketMQ 中用来接收并处理消息的运行实体。 消费者通常被集成在业务系统中&#xff0c;从 Apache RocketMQ 服务…

钉钉和MySQL接口打通对接实战

钉钉和MySQL接口打通对接实战 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台&#xff0c;提供PC版&#xff0c;Web版和手机版&#xff0c;有考勤打卡、签到、审批、日志、公告、钉盘、钉邮等强大功能。 目标系统…

docker基础5——数据存储卷

文章目录 一、基本了解二、存储卷2.1 docker挂载卷2.2 绑定挂载卷2.3 设置容器挂在卷权限 三、数据卷容器四、数据卷容器迁移数据 一、基本了解 为什么会有存储卷&#xff1f; Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像…

【杂谈理解】STM32定时器启动模式

STM32定时器启动方式 前言 事情的起因本来是探究为什么在中断模式下的回调中函数中&#xff0c;我不小心加了延时函数为什么会导致崩溃&#xff0c;很遗憾啊&#xff0c;没看出来&#xff0c;不过需要在中断事件中延时的话&#xff0c;倒是可以用轮询模式下的配置。本文探究HA…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

Python爬虫-贝壳二手房

前言 本文是该专栏的第3篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某二手房网为例,如下图所示,采集对应城市的二手房源数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly9zei5rZS5jb20vZXJzaG91ZmFuZy8= 目标:…

代理模式(java)

目录 结构 静态代理案例 代码实现 售票类 火车站类 代理类 测试类 优缺点 优点 缺点 结构 代理&#xff08;Proxy&#xff09;模式分为三种角色&#xff1a; 抽象主题&#xff08;Subject&#xff09;类&#xff1a; 通过接口或抽象类声明真实主题和代理对象实现的业务…

git cherry-pick 的使用

cherry-pick 精心挑选的意思&#xff0c;即可以从一个分支上挑选一个&#xff08;或多个&#xff09;修改&#xff0c;提交到当前分支上&#xff0c;不过 cherry-pick 只能是本地操作&#xff0c;即源分支上必须有的commit 才能 cherry-pick。遇到的情况可能是&#xff0c;源分…