k8s学习之路 | k8s 工作负载 DaemonSet
文章目录
- 1. DaemonSet 基础
- 1.1 什么是 DS
- 1.2 DS 的典型用法
- 1.3 如何编写 DS 资源
- 1.4 DS 示例文件
- 1.5 DS Pod 是如何被调度的
- 1.6 更新 DS
- 1.7 DS 替代方案
- 1.8 DS 工作负载字段描述
- 2. DaemonSet 的使用
- 2.1 每个节点运行一个
- 2.2 DS 更新策略
- 2.3 滚动更新
- 2.4 OnDelete 更新
- 2.6 更新回滚
- 2.5 故障排查
1. DaemonSet 基础
1.1 什么是 DS
DaemonSet
工作负载,确保了全部(某一些)节点运行一个 Pod
副本
-
如果有节点加入集群,自动为该节点新增一个
Pod
-
如果有节点从集群中移除,该节点上的
Pod
就会被回收 -
删除工作负载
DaemonSet
就会删除它创建的所有节点的Pod
1.2 DS 的典型用法
- 在每个节点上运行集群守护进程
- 在每个节点上运行日志收集守护进程
- 在每个节点上运行监控守护进程
1.3 如何编写 DS 资源
还是老规矩:kubectl explain ds
apiVersion <string>
kind <string>
metadata <Object>
spec <Object>
kubectl explain ds.spec
必须字段
apiVersion
、kind
和metadata
.spec
- Pod 模块:
.spec.template
- Pod 选择算符:
.spec.selector
- Pod 模块:
特定节点运行
如果指定了 .spec.template.spec.nodeSelector
,DaemonSet 控制器将在能够与 Node 选择算符匹配的节点上创建 Pod。 类似这种情况,可以指定 .spec.template.spec.affinity
,之后 DaemonSet 控制器 将在能够与节点亲和性 匹配的节点上创建 Pod。 如果根本就没有指定,则 DaemonSet Controller 将在所有节点上创建 Pod
1.4 DS 示例文件
###ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd-elasticsearchlabels:k8s-app: fluentd-logging
spec:selector:matchLabels:name: fluentd-elasticsearchtemplate:metadata:labels:name: fluentd-elasticsearchspec:containers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/logterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log
运行查看一下结果
- 没有像以前设置 Pod 的副本数多少,因为
DS
资源会在每一个节点只运行一个,控制节点除外,好像要特殊设置才行,遇到了我再看看
1.5 DS Pod 是如何被调度的
- DaemonSet 控制器为每个符合条件的节点创建一个 Pod,并添加 Pod 的
spec.affinity.nodeAffinity
字段以匹配目标主机:kubectl get ds fluentd-elasticsearch
- Pod 创建以后,默认的调度程序通常通过设置 Pod 的
.spec.nodeName
字段来接管 Pod 并将 Pod 绑定到目标主机,如果新的 Pod 无法放在节点上,默认的调度程序可能会根据新 Pod 的优先级抢占某些现存的 Pod
用户通过设置 DaemonSet 的
.spec.template.spec.schedulerName
字段,可以为 DamonSet 的 Pod 指定不同的调度程序。不设置就是default-scheduler
关于亲和性、污点、容忍度后续进行一个补充
1.6 更新 DS
-
如果节点的标签被修改,DaemonSet 将立刻向新匹配上的节点添加 Pod, 同时删除不匹配的节点上的 Pod
-
你可以修改 DaemonSet 创建的 Pod。不过并非 Pod 的所有字段都可更新。 下次当某节点(即使具有相同的名称)被创建时,DaemonSet 控制器还会使用最初的模板
-
你可以删除一个 DaemonSet。如果使用
kubectl
并指定--cascade=orphan
选项, 则 Pod 将被保留在节点上。接下来如果创建使用相同选择算符的新 DaemonSet, 新的 DaemonSet 会收养已有的 Pod。 如果有 Pod 需要被替换,DaemonSet 会根据其updateStrategy
来替换 -
可以对 DaemonSet 执行滚动更新操作
1.7 DS 替代方案
参考官网地址:
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/#required-fields
- init 脚本
- 裸 Pod
- 静态 Pod
- Deploy
1.8 DS 工作负载字段描述
参考官网地址:
https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/daemon-set-v1/
-
apiVersion: apps/v1
-
kind: DaemonSet
-
metadata
标准的对象元数据
-
spec
此守护进程集的预期行为
-
selector 必需
对由守护进程集管理的 Pod 的标签查询。Pod 必须匹配此查询才能被此 DaemonSet 控制。 查询条件必须与 Pod 模板的标签匹配
-
template 必需
描述将要创建的 Pod 的对象。DaemonSet 将在与模板的节点选择器匹配的每个节点上 (如果未指定节点选择器,则在每个节点上)准确创建此 Pod 的副本
-
minReadySeconds (int32)
新建的 DaemonSet Pod 应该在没有任何容器崩溃的情况下处于就绪状态的最小秒数,这样它才会被认为是可用的。 默认为 0(Pod 准备就绪后将被视为可用)
-
updateStrategy (DaemonSetUpdateStrategy)
用新 Pod 替换现有 DaemonSet Pod 的更新策略
-
revisionHistoryLimit (int32)
用来允许回滚而保留的旧历史记录的数量。此字段是个指针,用来区分明确的零值和未指定的指针。默认值是 10
-
2. DaemonSet 的使用
2.1 每个节点运行一个
我打算每个节点都运行一个基于 nginx 的 Pod
示例文件
###ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-demolabels:k8s-app: nginx
spec:selector:matchLabels:name: apptemplate:metadata:labels:name: appspec:tolerations:#这些容忍度设置是为了让该守护进程集在控制平面节点上运行- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedule- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedulecontainers:- name: nginximage: nginx:1.23imagePullPolicy: Never ##这个镜像拉取我是真的难受 直接弄本地来吧
运行查看一下
- 控制节点也是可以运行的,因为我加了一个东西
- 每个节点都只运行一个 Pod
尝试删除一个 Pod
##尝试删除一下 k8s-02上面的pod,跟着一下状态
kubectl delete pod ds-demo-dlzh4
- 可以看到最终还是会再该节点启动一个 Pod
2.2 DS 更新策略
DaemonSet 有两种更新策略:
OnDelete
: 使用OnDelete
更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。RollingUpdate
: 这是默认的更新策略。使用RollingUpdate
更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上
kubectl explain ds.spec.updateStrategy
2.3 滚动更新
我要对上面的资源更新一个镜像,修改一下 yaml 文件
###ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-demolabels:k8s-app: nginx
spec:selector:matchLabels:name: appupdateStrategy: ## 更新type: RollingUpdate ## 更新策略rollingUpdate: ##更新参数,仅在 type 值为 "RollingUpdate" 时出现maxUnavailable: 1 ##更新期间不可用的 DaemonSet Pod 的最大数量template:metadata:labels:name: appspec:tolerations:#这些容忍度设置是为了让该守护进程集在控制平面节点上运行- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedule- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedulecontainers:- name: nginximage: nginx:1.23.3imagePullPolicy: Never ##这个镜像拉取我是真的难受 直接弄本地来吧
更新一下,并跟踪状态
- 停一个,更新一个;停一个,更新一个;停一个;更新一个
查看更新状态
[root@k8s-01 k8s-yaml]# kubectl rollout status ds ds-demo
daemon set "ds-demo" successfully rolled out
[root@k8s-01 k8s-yaml]#
2.4 OnDelete 更新
我们再更新一次,换一种方式
###ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-demolabels:k8s-app: nginx
spec:selector:matchLabels:name: appupdateStrategy: ## 更新type: OnDelete ## 更新策略template:metadata:labels:name: appspec:tolerations:#这些容忍度设置是为了让该守护进程集在控制平面节点上运行- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedule- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedulecontainers:- name: nginximage: nginx:1.23imagePullPolicy: Never ##这个镜像拉取我是真的难受 直接弄本地来吧
更新运行看状态:kubectl apply -f ds.yaml
- 可以看到更新方式改变了,所以这次更新没反应
杀死一个 Pod 试试
[root@k8s-01 k8s-yaml]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-demo-6fxtx 1/1 Running 0 6m44s 192.168.0.135 k8s-02 <none> <none>
ds-demo-8zlpb 1/1 Running 0 6m29s 192.168.0.74 k8s-01 <none> <none>
ds-demo-9r7hv 1/1 Running 0 6m18s 192.168.0.7 k8s-03 <none> <none>
[root@k8s-01 k8s-yaml]# kubectl delete pod ds-demo-8zlpb
pod "ds-demo-8zlpb" deleted
[root@k8s-01 k8s-yaml]#
看一下是否更新完成:镜像是否改变 kubectl describe pod ds-demo-qgd49
- 可以看到镜像已经更新了
- 这种类型的更新细节就是:只有当你手动删除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才会被自动创建。
2.6 更新回滚
DS 修订版本
kubectl explain ds.spec
中的 [revisionHistoryLimit] 确认了版本保留的数量,默认就是10
查看 DS 的所有版本
kubectl rollout history ds ds-demo
查看指定版本的详细信息
kubectl rollout history ds ds-demo --revision=2
回滚到指定版本
kubectl rollout undo ds ds-demo --to-revision=2
查看更新结果
因为我之前改过更新策略,我必须杀死 Pod 后,才能回退成功
查看回滚进度
kubectl rollout status ds ds-demo
- 看提示是因为我的更新策略不适用这种查询方式
[root@k8s-01 k8s-yaml]# kubectl rollout status ds ds-demo
error: rollout status is only available for RollingUpdate strategy type
[root@k8s-01 k8s-yaml]#
2.5 故障排查
如果 DS 更新卡住的话,可能有以下一些原因:
- 节点可用资源耗尽
- 不完整的滚动更新
- 时钟偏差:如果在 DaemonSet 中指定了
.spec.minReadySeconds
,主控节点和工作节点之间的时钟偏差会使 DaemonSet 无法检测到正确的滚动更新进度
相关文章:

k8s学习之路 | k8s 工作负载 DaemonSet
文章目录1. DaemonSet 基础1.1 什么是 DS1.2 DS 的典型用法1.3 如何编写 DS 资源1.4 DS 示例文件1.5 DS Pod 是如何被调度的1.6 更新 DS1.7 DS 替代方案1.8 DS 工作负载字段描述2. DaemonSet 的使用2.1 每个节点运行一个2.2 DS 更新策略2.3 滚动更新2.4 OnDelete 更新2.6 更新回…...

Javaweb MVC模式和三层架构
MVC 模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。 7.1 MVC模式 MVC 是一种分层开发的模式,其中: M:Model,业务模型,处理业务 V:View&am…...
综合考虑,在客户端程序中嵌入网页程序,首选CefSharp。
综合考虑,在客户端程序中嵌入网页程序,首选CefSharp。 CefSharp 是一种将全功能符合标准的 Web 浏览器嵌入 C# 或 VB.NET 应用程序的简单方法。 https://www.jianshu.com/p/3f50cc747606 WinForm嵌入Web网页的解决方案 Microsoft Edge WebView2诞生较晚…...

【Java基础 下】 030 -- 网络编程
目录 一、什么是网络编程 1、常见的软件架构(CS & BS) ①、BS架构的优缺点 ②、CS架构的优缺点 2、小结 二、网络编程三要素 1、IP ①、IPv4 ②、IPv6 ③、小结 ④、IPv4的一些细节 ⑤、InetAddress的使用 2、端口号 3、协议 ①、TCP & UDP 三、…...
2021牛客OI赛前集训营-提高组(第三场) T3打拳
2021牛客OI赛前集训营-提高组(第三场) 题目大意 有2n2^n2n个选手参加拳击比赛,每个人都有一个实力,所有选手的实力用一个111到2n2^n2n的排列表示。 淘汰赛的规则是:每次相邻的两个选手进行比赛,实力值大…...

C++面向对象编程之四:成员变量和成员函数分开存储、this指针、const修饰成员和对象
在C中,成员变量和成员函数是分开存储的,只有非静态成员变量才存储在类中或类的对象上。通过该类创建的所有对象都共享同一个函数#include <iostream> using namespace std;class Monster {public://成员函数不占对象空间,所有对象共享同…...

卷积神经网络(CNN)基础知识
文章目录CNN的组成层卷积层卷积运算卷积的变种分组卷积转置卷积空洞卷积可变形卷积卷积层的输出尺寸和参数量CNN的组成层 在卷积神经⽹络中,⼀般包含5种类型的⽹络层次结构:输入层、卷积层、激活层、池化层和输出层。 输入层(input layer&a…...
opencv+python 常见图像预处理
import os import cv2 import numpy as np import pandas as pd from PIL import Image import matplotlib.pylab as plt """图像预处理"""#缩放 #灰度化 #二值化-otsu,自定义,自适应 #均值滤波 #中值滤波 #自定义滤波 #高斯/双倍滤波…...
如何实现一个单例模式
目录 前言 1.饿汉式 2.懒汉式 3.双重检测 4.静态内部类 5.枚举 总结: 前言 单例模式是我们日常开发过程中,遇到的最多的一种设计模式。通过这篇文章主要分享是实现单例的几种实现方式。 1.饿汉式 饿汉式的实现方式比较简单。在类加载的时候&#…...

传输线的物理基础(四):传输线的驱动和返回路径
驱动一条传输线对于将信号发射到传输线的高速驱动器,传输线在传输时间内的输入阻抗将表现得像一个电阻,相当于线路的特性阻抗。鉴于此等效电路模型,我们可以构建驱动器和传输线的电路,并计算发射到传输线中的电压。等效电路如下图…...

Java多态性
文章目录对象的多态性多态的理解举例7.2 多态的好处和弊端7.3 虚方法调用(Virtual Method Invocation)7.4 成员变量没有多态性7.5 向上转型与向下转型7.6 为什么要类型转换呢?7.7 如何向上转型与向下转型7.8 instanceof关键字7.9 复习:类型转换7.10 练习…...

算法拾遗二十七之窗口最大值或最小值的更新结构
算法拾遗二十七之窗口最大值或最小值的更新结构滑动窗口题目一题目二题目三题目四滑动窗口 第一种:R,R右动,数会从右侧进窗口 第二种:L,L右动,数从左侧出窗口 题目一 arr是N,窗口大小为W&…...

【带你搞定第二、三、四层交换机】
01 第二层交换机 OSI参考模型的第二层叫做数据链路层,第二层交换机通过链路层中的MAC地址实现不同端口间的数据交换。 第二层交换机主要功能,就包括物理编址、错误校验、帧序列以及数据流控制。 因为这是最基本的交换技术产品,目前桌面…...

C++基础了解-22-C++ 重载运算符和重载函数
C 重载运算符和重载函数 一、C 重载运算符和重载函数 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义…...
BatchNormalization
目录 Covariate Shift Internal Covariate Shift BatchNormalization Q1:BN的原理 Q2:BN的作用 Q3:BN的缺陷 Q4:BN的均值、方差的计算维度 Q5:BN在训练和测试时有什么区别 Q6:BN的代码实现 Covariate Shift 机器学习中&a…...
vue 中安装插件实现 rem 适配
vue 中实现 rem 适配vue 项目实现页面自适应,可以安装插件实现。 postcss-pxtorem 是 PostCSS 的插件,用于将像素单元生成 rem 单位。 autoprefixer 浏览器前缀处理插件。 amfe-flexible 可伸缩布局方案替代了原先的 lib-flexible 选用了当前众多浏览…...

Hadoop学习
1.分布式与集群 hosts文件: 域名映射文件 2.Linux常用命令 ls -a:查看当前目录下所有文件mkdir -p:如果没有对应的父文件夹,会自动创建rm -rf:-f:强制删除 -r:递归删除cp -r:复制文…...

Golang反射源码分析
在go的源码包及一些开源组件中,经常可以看到reflect反射包的使用,本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先,了解一下反射的定义: 反射是指计算机程序能够在运行时,能够描述其自身状态或行为、调整…...

Qt之悬浮球菜单
一、概述 最近想做一个炫酷的悬浮式菜单,考虑到菜单展开和美观,所以考虑学习下Qt的动画系统和状态机内容,打开QtCreator的示例教程浏览了下,大致发现教程中2D Painting程序和Animated Tiles程序有所帮助,如下图所示&a…...

易优cms attribute 栏目属性列表
attribute 栏目属性列表 attribute 栏目属性列表 [基础用法] 标签:attribute 描述:获取栏目的属性列表,或者单独获取某个属性值。 用法: {eyou:attribute typeauto} {$attr.name}:{$attr.value} {/eyou:attri…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...