当前位置: 首页 > news >正文

六、kubernetes 1.29 之 Pod 控制器02

一、pod控制器

 1、DaemonSet 

1.1 概述

DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

资源清单不需要设置 副本数量,它会自动调整

使用 DaemonSet 的一些典型用法:

  • 运行集群存储 daemon,例如在每个 Node 上运行 glusterdceph

  • 在每个 Node 上运行日志收集 daemon,例如 fluentdlogstash

  • 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond

采用kubeadm部署集群 到时候,master默认会有一个污点,这个污点会让pod不能调度进来

kubectl create deploytment myapp --image=wangyanglinux/myapp:v1.0 --dry-run -o yaml deployment.yaml解释:--dry-run  只测试不运行结果: 不会创建控制器,只会测试后生成资源清单

1.2 实验

DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:name: daemonset-demolabels:app: daemonset-demo
spec:selector:matchLabels:name: daemonset-demotemplate:metadata:labels:name: daemonset-demospec:containers:- name: daemonset-demo-containerimage: wangyanglinux/myapp:v1.0

清除其他资源

创建控制器

2、批处理控制器  --  Job 

2.1 批处理和守护进程

Kubernetes 中的 ​Job 控制器/批处理守护进程(如 MySQL)​​ 代表了两种不同的工作负载类型和管理方式。为了能快速把握它们的核心区别,先用一个表格来对比它们的关键特性:

2.2 概述

# Job

Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。

## 特殊说明

*   **spec.template** 格式同 Pod。
*   **RestartPolicy** 仅支持 `Never` 或 `OnFailure`。
*   单个 Pod 时,默认 Pod 成功运行后 Job 即结束。
*   **`.spec.completions`** 标志 Job 结束需要成功运行的 Pod 个数,默认为 `1`。
*   **`.spec.parallelism`** 标志并行运行的 Pod 的个数,默认为 `1`。
*   **`.spec.activeDeadlineSeconds`** 标志失败 Pod 的重试最大时间,超过这个时间不会继续重试。

2.3 实验

用python 写一个计算 π 的gongshi

#-*-coding: utf-8-*-from __future__ import division#导入时间模块
import time#计算当前时间
time1 = time.time()#算法根据马青公式计算圆周率
number = 1000
#多计算10位,防止尾数取舍的影响
number1 = number + 10
#算到小数点后number1位
b = 10 ** number1#求含4/5的首项
x1 = b * 4 // 5
#求含1/239的首项
x2 = b // -239#求第一大项
he = x1 + x2#设置下面循环的终点,即共计算n项
number *= 2#循环初值=3,末值2n,步长=2
for i in xrange(3, number, 2):#求每个含1/5的项及符号x1 //= -25#求每个含1/239的项及符号x2 //= -57121#求两项之和x = (x1 + x2) // i#求总和he += x#求出π
pai = he * 4
#舍掉后十位
pai //= 10 ** 10#输出圆周率π的值
paistring = str(pai)
result = paistring[0] + str('.') + paistring[1:len(paistring)]
print(result)time2 = time.time()
print(u'Total time:' + str(time2 - time1) + 's')

将代码打包成镜像

FROM python:2.7
ADD ./main.py /root
CMD /usr/bin/python /root/main.py

job 资源清单

apiVersion: batch/v1
kind: Job
metadata:name: job-demo
spec:template:metadata:name: job-demo-podspec:containers:- name: job-demo-containerimage: wangyanglinux/tools:maqingpythonv1restartPolicy: Never

创建执行 .... 漫长的下载 ...

注意:

        pod成功后返回码应该是  0

3、 周期的批处理  CronJob

3.1 概述

CronJob​ 管理基于时间的 Job,即:

  • 在给定时间点只运行一次

  • 周期性地在给定时间点运行

使用条件

当前使用的 Kubernetes 集群,版本 >= 1.8(对 CronJob)。

典型用法

典型的用法如下所示:

  • 在给定的时间点调度 Job 运行

  • 创建周期性运行的 Job,例如:

    • 数据库备份

    • 发送邮件

配置参数

⏰核心调度参数

参数

类型

说明

格式/可选值

.spec.schedule

必需

定义任务的运行周期

Cron​ 格式字符串 (如 "*/1 * * * *")

分时日月周

.spec.jobTemplate

必需

定义要执行的 Job 模板

Job​ 对象格式

⚙️高级控制参数

参数

类型

说明

.spec.concurrencyPolicy

可选

控制新调度的 Job 与旧 Job 的并发策略。可选值:
• ​Allow​ (默认):允许并发运行
• ​Forbid​:禁止并发,跳过新调度
• ​Replace​:取消旧 Job,替换为新 Job

.spec.startingDeadlineSeconds

可选

启动 Job 的期限(秒)。如果因故错过调度,超过此期限后该次执行将被视为失败/跳过本次。

.spec.suspend

可选

是否挂起后续所有调度。设置为 true时,CronJob 会被暂停。

📋 历史记录限制

参数

类型

说明

默认值

.spec.successfulJobsHistoryLimit

可选

保留已完成成功 Job 的历史记录数量

3

.spec.failedJobsHistoryLimit

可选

保留已失败 Job 的历史记录数量

1

3.2 实验

apiVersion: batch/v1
kind: CronJob
metadata:name: cronjob-demo
spec:schedule: "*/1 * * * *"jobTemplate:spec:completions: 3template:spec:containers:- name: cronjob-demo-containerimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure

创建

这里是 pod1 和 pod 2 之间间隔是 60 s,第一个 job 不一定是 60 s

 

注意

cronjob 只能做到 分钟级别的,如果需要秒级别的还得去 pod当中

3.3 幂等

官方要求,cronjob操作需要是幂等的,避免发生意料之外的错误

想象一下,你有一个非常聪明的机器人保姆,她的名字就叫 ​CronJob

1. CronJob:定时任务

你给机器人保姆下达了一个指令:

​“每天下午5点整,准时把客厅的垃圾倒掉。”​

这就是一个典型的 ​CronJob​!

  • 定时(Cron)​​:每天下午5点

  • 任务(Job)​​:倒垃圾

无论你在不在家,心情好不好,这个机器人都会在每天下午5点准时执行“倒垃圾”这个任务。Kubernetes 的 CronJob 就是这样,它负责在指定的时间表(比如 0 2 * * *表示每天凌晨2点)周期性地创建一个 Job(任务)来执行。


2. 幂等(Idempotent):安全地重复执行

现在,我们加入“幂等”这个概念。​​“幂等”意味着一个操作可以用同样的参数重复执行多次,但只会产生一次性的效果。​

这为什么重要呢?想象一下这个场景:

非幂等的危险情况(没有幂等性):​

下午5点,机器人准备去倒垃圾。它走到垃圾桶边,​​“哔哔哔——检测到客厅里有一个垃圾桶,执行倒垃圾操作!”​

  • 第一次执行​:成功。垃圾桶被清空。

  • 如果某种原因(比如网络抖动、系统卡顿)导致它以为自己没成功,它又触发了第二次执行​:机器人看着已经空了的垃圾桶,可能会报错:“错误!目标垃圾桶不存在!任务失败!” 或者更糟,它开始满屋子寻找“丢失”的垃圾桶,把不是垃圾的东西给扔了。

这很糟糕,对吧?​​ 任务重复执行导致了错误或意外后果。


幂等的安全情况(拥有幂等性):​

一个设计成“幂等”的倒垃圾任务会是这样的:

机器人走到垃圾桶边,​​“哔哔哔——检测到客厅里有一个‘未清理’的垃圾桶,执行倒垃圾操作!”​

  • 第一次执行​:成功。垃圾桶被清空,并被标记为“已清理”。

  • 同样,如果它因故触发第二次执行​:机器人再次扫描,发现垃圾桶的状态是“已清理”。它的逻辑是:“哦,这个目标已经被处理过了。我的任务已经完成,无需再次操作,直接报告成功即可。”

看到了吗?​​ 即使任务被重复调用了多次,最终的结果也和只调用一次一样——客厅没有垃圾。​这就是幂等性的巨大价值:它让重复操作变得安全。​

结论:CronJob 与 幂等 的关系

在 Kubernetes 和运维的世界里:

  • CronJob​ 就像是那个严格遵守时间的机器人保姆,它只负责按时触发任务(Job)。

  • 而 ​幂等性​ 则是你编写的每个任务脚本(Job)自身应该具备的特性

为什么幂等性对 CronJob 至关重要?​

因为 CronJob 是定时周期性触发的,在很多意外情况下(比如网络问题、临时资源不足、节点重启),CronJob 控制器可能会多次启动同一个任务。如果你的任务脚本不具备幂等性,就可能导致:

  • 重复插入数据(数据库出现脏数据)。

  • 重复扣款(灾难性的金融事故)。

  • 重复删除或覆盖文件。

因此,一个优秀的、由 CronJob 调度的任务(比如数据库备份),必须是幂等的。​​ 例如,它的逻辑应该是:

“检查是否已经存在今天凌晨2点的备份文件?如果存在,就跳过;如果不存在,就创建。”

这样,无论这个任务被触发多少次,最终都只会产生一份备份文件。

简单总结:​

CronJob 是闹钟,负责准时喊你;幂等是你起床后的动作规则:无论闹钟响多少次,你只起床一次。​

二、总结

控制器

        Pod 控制器

                 守护进程类型

                         RC 控制器

                                  保障当前的 Pod 数量与期望值一致

                                 

                         RS 控制器

                                  功能与 RC 控制器类似,但是多了标签选择的运算方式

                                 

                         Deployment

                                  支持了声明式表达

                                  支持滚动更新和回滚

                                 

                                  原理:deployment > RS > pod

                        

                         DaemonSet

                                  保障每个节点有且只有一个 Pod 的运行,动态

                

                 批处理任务的类型

                         Job

                                  保障批处理任务一个或多个成功为止

                                 

                         CronJob

                                  周期性的创建 Job,典型的场景:数据库的周期性备份...

                                 

kubectl  create 、apply 、replace

        create

                 创建资源对象

                         -f  通过基于文件的创建,但是如果此文件描述的对象存在,那么那怕文件描述的信息发生了改变,再次提交时也不会应用

                        

        apply

                 创建资源对象、修改资源对象

                         -f      基于文件创建,如果目标对象与文件本身发生改变,那么会根据文件的指定一一修改目标对象的属性(部分更新)

                        

        replace   

                 创建资源对象、修改资源对象

                         -f  基于文件创建,如果目标对象与文件本身发生改变,那么会重建此对象(替换)

http://www.dtcms.com/a/394587.html

相关文章:

  • OpenCV:人脸检测,Haar 级联分类器原理
  • 类和对象 (上)
  • FreeRTOS 队列集(Queue Set)机制详解
  • 【论文速递】2025年第20周(May-11-17)(Robotics/Embodied AI/LLM)
  • 【秋招笔试】2025.09.21网易秋招笔试真题
  • C++ 之 【特殊类设计 与 类型转换】
  • 第14章 MySQL索引
  • Entities - 遍历与查询
  • TargetGroup 全面优化:从六个维度打造卓越用户体验
  • Proxy与Reflect
  • 浅解Letterbox算法
  • 【Triton 教程】triton_language.permute
  • JavaScript洗牌算法实践
  • 掌握timedatectl命令:Ubuntu 系统时间管理指南
  • 【RT Thread】RTT内核对象机制详解
  • Seata分布式事务
  • 用例图讲解
  • makefile原理
  • AUTOSAR CP开发流程总结
  • 通过VNC实现树莓派远程桌面访问
  • linux信号done
  • BeanUtils.copyProperties 映射规则详解
  • 物联网 frid卡控制
  • LeetCode刷题记录----322.零钱兑换(Medium)
  • 2015/07 JLPT听力原文 问题四
  • Redis集群实验
  • 昇腾生态双支柱:MindSpore 与 CANN 的全栈技术解析
  • YOLO系列——实时屏幕检测
  • 牛客算法基础noob49 上三角矩阵判定
  • autosar 中OS模块理解