概述

官网文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/

DaemonSet简称ds

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

使用场景:

  • 在每个节点上运行集群守护进程

    • 比如:kube-proxy
  • 在每个节点上运行日志收集守护进程
    • 比如:filebeat
  • 在每个节点上运行监控守护进程
    • 比如:zabbix-agent2

资源清单文件详解

apiVersion: apps/v1       # API 版本,当前稳定版本为 apps/v1
kind: DaemonSet # 资源类型为 DaemonSet
metadata:
name: example-daemonset # DaemonSet 名称,需在命名空间内唯一
namespace: default # 所属命名空间,默认值为 default
labels: # 标签,用于关联 Pod/Selector 等
app: monitoring
spec:
selector: # 标签选择器,用于匹配受控的 Pod
matchLabels:
app: monitoring
template: # Pod 模板,定义 Pod 的具体配置
metadata:
labels:
app: monitoring # 需与 selector.matchLabels 一致
spec:
containers:
- name: agent # 容器名称
image: agent:v1 # 镜像地址
resources: # 资源限制(可选)
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
nodeSelector: # 节点选择器(可选),指定 Pod 调度到符合条件的节点
disk: ssd
tolerations: # 污点容忍(可选),允许 Pod 调度到带有特定污点的节点
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
updateStrategy: # 更新策略(可选,默认 RollingUpdate)
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 滚动更新时允许的最大不可用 Pod 数
minReadySeconds: 30 # 等待 Pod 就绪的最短时间(可选)

DaemonSet实战

# 定义资源清单文件
[root@master01 ~/daemonset]# cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
hostPort: 30280
# 创建daemonset资源
[root@master01 ~/daemonset]# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset created

查看daemonset资源

# 查看daemonset资源
[root@master01 ~/daemonset]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 2 2 0 2 0 <none> 5s # 查看pod,发现调度到node01和node02节点上
[root@master01 ~/daemonset]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-bwgdw 1/1 Running 0 115s 100.95.185.254 node02 <none> <none>
nginx-daemonset-dtpw2 1/1 Running 0 115s 100.117.144.153 node01 <none> <none>

为什么master节点上没有调度?

因为master节点上默认存在一个污点,而上面的案例中没有配置污点容忍,所以没有调度过去

# 查看污点
[root@master01 ~/daemonset]# kubectl describe node master01 | grep -i taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule

如果需要调度到master节点,需要做污点容忍。

关于污点和污点容忍学习可以阅读这篇文章:K8s中的污点和容忍

示例:

[root@master01 ~/daemonset]# cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
# 污点容忍
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx:1.25.3
ports:
- containerPort: 80
hostPort: 30280
# 创建daemonset资源
[root@master01 ~/daemonset]# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset configured

查看一下

[root@master01 ~/daemonset]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 3 3 2 1 2 <none> 9m58s
# 查看pod,发现master节点也已经调度上了
[root@master01 ~/daemonset]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-2pzdk 1/1 Running 0 102s 100.85.170.132 master01 <none> <none>
nginx-daemonset-dtpw2 1/1 Running 0 11m 100.117.144.153 node01 <none> <none>
nginx-daemonset-fr4dr 0/1 ContainerCreating 0 88s <none> node02 <none> <none>

daemonset资源的管理

查看DaemonSet

语法:

kubectl get daemonset <daemonset-name>

删除DaemonSet

kubectl delete daemonset <daemonset-name>

更新DaemonSet

Damonset资源的更新、回滚策略和Deployment是一样的,可以参考这篇文章:K8s进阶之Deployment的更新&回滚

1、使用kubectl edit命令更新

2、使用对应的资源清单文件进行更新

3、快速更新镜像:

# 语法
kubectl set image daemonset <daemonset资源> <pod-名称>=<镜像>:<镜像tag> # 示例
kubectl set image daemonset/example-daemonset agent=agent:v2

4、快速回滚到上一个版本:

kubectl rollout undo daemonset/example-daemonset

K8s新手系列之DaemonSet资源的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  2. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  3. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. Github干货系列:C++资源集合-

    Awesome CPP,这又是一个 Awesome XXX 系列的资源整理,由 fffaraz 发起和维护.内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. ...

  6. FrameBuffer系列 之 一点资源

    Iamonlyme的FrameBuffer编程实例http://download.csdn.net/detail/iamonlyme/6512955 light588的通过framebuffer直接写 ...

  7. Android新手系列教程(申明:来源于网络)

    Android新手系列教程(申明:来源于网络) 地址:http://blog.csdn.net/column/details/androidcoder666.html

  8. k8s 入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  9. SignalR新手系列教程详解总结(转)

    SignalR新手系列教程详解总结 GlobalHost.ConnectionManager.GetHubContext<TodoListHub>() .Clients.Clients(l ...

  10. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

随机推荐

  1. 帝国CMS下iframe标签无法引入视频,ueditor编辑器中html标签无法显示问题,设置ueditor默认行高为1.75

    问题描述: 1.帝国cms后台添加优酷视频,使用到iframe,富文本编辑器中使用iframe引入视频后检查发现html代码未出现iframe字样,排查后发现为ueditor限制过滤了部分html代码 ...

  2. 提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的。同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序。

    提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的.同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序. 首先,我们需要了解一下 ...

  3. MySQL2022.3.2

    创建库 CREATE DATABASE STUDENT; 创建表 CREATE TABLE STU(SNO INT PRIMARY KEY,//主键SNM CHAR(2) NOT NULL,//不能为 ...

  4. 写一个简单的SQL生成工具

    知识点: MyBatis 语法概览 MyBatis 是一个强大的数据持久化框架,它提供了一种半自动化的 ORM 实现方式.通过 MyBatis,开发者可以通过简单的 XML 或注解来配置和映射原生信息 ...

  5. mongodb查询某个字段数据

    如下 db.集合名.find( {}, {需要查询的字段:1, _id:0} ) 例如 db.userInfo.find({}, {'created_at':1, _id: 0}) 默认会显示 _id ...

  6. SQL Server如何跟踪自动统计信息更新?

    SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要.一般情况下,我们会开启"自动更新统计信息"(Auto Update Statistics)这个选项,以便数据 ...

  7. linux 根目录与分区

    1.2  根目录的建立 大家一般都会知道根目录的产生方式,就是系统使用mount指令,将系统所在的分区挂载到[/]目录中,这样便完成了所谓的根目录.但你是否想过, 虽然看起来合理却有点诡异,因为根目录 ...

  8. C 语言内存布局深度剖析:从栈到堆,你真的了解吗?

    大家好,我是小康. 今天咱们聊点看似复杂实则简单的东西 -- C 语言的内存布局. 别急着翻页!相信我,读完这篇文章,你会拍着大腿说:"原来这么简单!" 微信搜索 「跟着小康学编程 ...

  9. 【Java】String字符串格式化

    一.前言 String.format() 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", &qu ...

  10. RESTful的连接时间超时时间设定

    dsResrful的连接方式时,如何设定timeout呢? DSRestConnection.HTTP.ConnectTimeout := 5000; 就这么简单.因为封装的indy的TidHTTP. ...