【云原生 | Kubernetes 实战】15、K8s 控制器 Daemonset 入门到企业实战应用

news2025/2/3 13:55:12

目录

一、DaemonSet 控制器:概念、原理解读

1.1  DaemonSet 概述

1.2  DaemonSet 工作原理:如何管理 Pod ?

1.3  Daemonset 典型的应用场景

1.4  DaemonSet 与 Deployment 的区别

二、DaemonSet 资源清单文件编写技巧 

三、DaemonSet 使用案例:部署日志收集组件 fluentd

四、Daemonset 管理 pod:滚动更新

4.1 查看 daemonset 的滚动更新策略:

4.2 创建带有 RollingUpdate 更新策略的 DaemonSet 


 

一、DaemonSet 控制器:概念、原理解读

1.1  DaemonSet 概述

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

1.2  DaemonSet 工作原理:如何管理 Pod ?

        daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。

1.3  Daemonset 典型的应用场景

  • 在每个节点上运行集群守护进程,比如:glusterd 或 cep。
  • 在每个节点上运行日志收集守护进程,比如:flunentd 、 logstash、filebeat 等。
  • 在每个节点上运行监控守护进程,比如:Prometheus、 Node Exporter 、collectd 等。

        一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。 

1.4  DaemonSet 与 Deployment 的区别

  • Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。
  • DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。

        DaemonSet 与 Deployment 非常类似, 它们都能创建 Pod,并且 Pod 中的进程都不希望被终止(例如,Web 服务器、存储服务器)。

        建议为无状态的服务使用 Deployment,比如前端服务。 对这些服务而言,对副本的数量进行扩缩容、平滑升级,比精确控制 Pod 运行在某个主机上要重要得多。 当需要 Pod 副本总是运行在全部或特定主机上,并且当该 DaemonSet 提供了节点级别的功能(允许其他 Pod 在该特定节点上正确运行)时, 应该使用 DaemonSet。

        例如,网络插件通常包含一个以 DaemonSet 运行的组件。 这个 DaemonSet 组件确保它所在的节点的集群网络正常工作。

DaemonSet 概念官方参考文档:DaemonSet | Kubernetes

二、DaemonSet 资源清单文件编写技巧 

# 查看定义 Daemonset 资源需要的字段有哪些
[root@k8s-master01 ~]# kubectl explain daemonset
KIND:     DaemonSet
VERSION:  apps/v1

DESCRIPTION:
     DaemonSet represents the configuration of a daemon set.

FIELDS:
   apiVersion	<string>            # 当前资源使用的 api 版本,跟 VERSION:  apps/v1 保持
     

   kind	<string>                    # 资源类型,跟 KIND:  DaemonSet 保持一致
     

   metadata	<Object>                # 元数据,定义 DaemonSet 名字的
     

   spec	<Object>                    # 定义容器的


   status	<Object>                # 状态信息,不能修改


# 查看 DaemonSet 的 spec 字段如何定义
[root@k8s-master01 ~]# kubectl explain daemonset.spec
KIND:     DaemonSet
VERSION:  apps/v1

RESOURCE: spec <Object>

DESCRIPTION:
     The desired behavior of this daemon set. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

     DaemonSetSpec is the specification of a daemon set.

FIELDS:
   minReadySeconds	<integer>        # 当新的 pod 启动几秒种后,再 kill 掉旧的 pod
    

   revisionHistoryLimit	<integer>    # 历史版本
     The number of old history to retain to allow rollback. This is a pointer to
     distinguish between explicit zero and not specified. Defaults to 10.

   selector	<Object> -required-      # 用于匹配 pod 的标签选择器  


   template	<Object> -required-      # 定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的 


   updateStrategy	<Object>         # daemonset 的升级策略


# 查看 DaemonSet 的 spec.template 字段如何定义?
# 对于 template 而言,其内部定义的就是 pod,pod 模板是一个独立的对象
[root@k8s-master01 ~]# kubectl explain daemonset.spec.template
KIND:     DaemonSet
VERSION:  apps/v1

RESOURCE: template <Object>

DESCRIPTION:
     An object that describes the pod that will be created. The DaemonSet will
     create exactly one copy of this pod on every node that matches the
     template's node selector (or on every node if no node selector is
     specified). More info:
     https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template

     PodTemplateSpec describes the data a pod should have when created from a
     template

FIELDS:
   metadata	<Object>


   spec	<Object>
······

三、DaemonSet 使用案例:部署日志收集组件 fluentd

下面的 daemonset.yaml 文件描述了一个运行 fluentd-elasticsearch Docker 镜像的 DaemonSet:

# 根据帮助命令编写 
[root@k8s-master01 ~]# kubectl explain ds
[root@k8s-master01 ~]# kubectl explain ds.metadata
[root@k8s-master01 ~]# kubectl explain ds.spec
[root@k8s-master01 ~]# kubectl explain ds.spec.template
[root@k8s-master01 ~]# kubectl explain ds.spec.template.metadata
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec
[root@k8s-master01 ~]# kubectl explain ds.spec.selector
[root@k8s-master01 ~]# kubectl explain ds.spec.selector.matchLabels
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec.containers
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec.containers.resources
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec.containers.resources.requests
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec.tolerations
[root@k8s-master01 ~]# kubectl explain ds.spec.template.spec.volumes

# 查看控制节点的污点
[root@k8s-master01 ~]# kubectl describe nodes k8s-master01 | grep Taints
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

# 创建 DaemonSet
[root@k8s-master01 ~]# mkdir daemonset
[root@k8s-master01 ~]# cd daemonset/
[root@k8s-master01 daemonset]# vim daemonset.yaml
apiVersion: apps/v1                        # DaemonSet 使用的 api 版本
kind: DaemonSet                            # 资源类型
metadata:                            
  name: fluentd-elasticsearch              # 资源的名字  
  namespace: kube-system                   # 资源所在的名称空间 
  labels:
    k8s-app: fluentd-logging               # 资源具有的标签
spec:
  selector:                                # 标签选择器
    matchLabels:
      name: fluentd-elasticsearch          # 需与模板中的 pod 标签一致
  template:
    metadata:
      labels:                              # 基于这次模板定义的 pod 具有的标签
        name: fluentd-elasticsearch
    spec:
      tolerations:                         # 定义容忍度,根据实际情况填写。为了让 pod 在控制节点运行
      - key: node-role.kubernetes.io/control-plane
        effect: NoSchedule
      containers:                          # 定义容器
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        imagePullPolicy: IfNotPresent
        resources:                         # 资源配额
          limits:
            cpu: 100m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:                      
        - name: varlog
          mountPath: /var/log              # 容器内的挂载目录
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers  # 容器内的挂载目录
          readOnly: true                   # 挂载目录是只读权限
      terminationGracePeriodSeconds: 30    # 优雅的关闭服务
      volumes:
      - name: varlog
        hostPath:
          path: /var/log                   # 基于本地目录创建一个卷
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers # 基于本地目录创建一个卷   

# 更新资源清单文件
[root@k8s-master01 daemonset]# kubectl apply -f daemonset.yaml 

# 查看 daemonset 是否创建成功
[root@k8s-master01 daemonset]# kubectl get ds -n kube-system -l k8s-app=fluentd-logging
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd-elasticsearch   3         3         3       3            3           <none>          6m56s

# 查看 pod
[root@k8s-master01 daemonset]# kubectl get pods -n kube-system -o wide -l name=fluentd-elasticsearch
NAME                          READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
fluentd-elasticsearch-97td6   1/1     Running   0          2m13s   10.244.36.89     k8s-node1      <none>           <none>
fluentd-elasticsearch-nsw8s   1/1     Running   0          2m13s   10.244.32.132    k8s-master01   <none>           <none>
fluentd-elasticsearch-trggq   1/1     Running   0          2m13s   10.244.169.185   k8s-node2      <none>           <none>

        通过上面可以看到在 k8s 的三个节点均创建了 fluentd 这个 pod,而且 pod 的名字是由 <控制器的名字-随机数> 组成的。

编写 DaemonSet Spec 官方参考文档:DaemonSet | Kubernetes 

四、Daemonset 管理 pod:滚动更新

4.1 查看 daemonset 的滚动更新策略:

[root@k8s-master01 ~]# kubectl explain ds.spec.updateStrategy
KIND:     DaemonSet
VERSION:  apps/v1

RESOURCE: updateStrategy <Object>

DESCRIPTION:
     An update strategy to replace existing DaemonSet pods with new pods.

     DaemonSetUpdateStrategy is a struct used to control the update strategy for
     a DaemonSet.

FIELDS:
   rollingUpdate	<Object>
     Rolling update config params. Present only if type = "RollingUpdate".

   type	<string>
     Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is
     RollingUpdate.

     Possible enum values:
     - `"OnDelete"` Replace the old daemons only when it's killed
     - `"RollingUpdate"` Replace the old daemons by new ones using rolling
     update i.e replace them on each node one after the other.

[root@k8s-master01 ~]# kubectl explain ds.spec.updateStrategy.rollingUpdate

DaemonSet 有两种更新策略:

  • OnDelete: 使用 OnDelete 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。
  • RollingUpdate: 这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。

4.2 创建带有 RollingUpdate 更新策略的 DaemonSet 

要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.type 为 RollingUpdate

你可能想设置 .spec.updateStrategy.rollingUpdate.maxUnavailable (默认为 1), .spec.minReadySeconds (默认为 0) 和 .spec.updateStrategy.rollingUpdate.maxSurge (默认为 0)。

下面的 YAML 包含一个 DaemonSet,其更新策略为 'RollingUpdate':

# 将原来的 yaml 简单修改下
[root@k8s-master01 daemonset]# vim daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  updateStrategy:                        # 增加滚动更新内容
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
······
      containers:
      - name: fluentd-elasticsearch
        image: billygoo/tomcat8-jdk8     # 修改镜像
        imagePullPolicy: IfNotPresent
······

[root@k8s-master01 daemonset]# kubectl apply -f daemonset.yaml 
daemonset.apps/fluentd-elasticsearch configured

[root@k8s-master01 daemonset]# kubectl get pods -n kube-system -o wide -l name=fluentd-elasticsearch
NAME                          READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
fluentd-elasticsearch-g8p97   1/1     Running   0          34s   10.244.32.133    k8s-master01   <none>           <none>
fluentd-elasticsearch-jm4qq   1/1     Running   0          33s   10.244.36.92     k8s-node1      <none>           <none>
fluentd-elasticsearch-k6psp   1/1     Running   0          31s   10.244.169.187   k8s-node2      <none>           <none>

# 最后,观察 DaemonSet 最新滚动更新的进度
[root@k8s-master01 ~]# kubectl rollout status daemonset fluentd-elasticsearch -n kube-system 

 当滚动更新完成时,输出结果如下:

DaemonSet 执行滚动更新官方参考文档:对 DaemonSet 执行滚动更新 | Kubernetes 

 上一篇文章:【云原生 | Kubernetes 实战】14、K8s 控制器 Statefulset 入门到企业实战应用_Stars.Sky的博客-CSDN博客

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

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

相关文章

零基础如何自学Python编程?

零基础如何系统地自学Python编程&#xff1f;绝大多数零基础转行者学习编程的目的就是想找一份高薪有发展前景的工作&#xff0c;哪个编程语言就业前景好越值得学习。零基础的同学学Python是一个不错的选择。 对于零基础的初学者最迷茫的是不知道怎样开始学习&#xff0c;建议…

基础背包问题--0 1背包与完全背包

&#x1f389;&#x1f389;&#x1f389;写在前面&#xff1a; 博主主页&#xff1a;&#x1f339;&#x1f339;&#x1f339;戳一戳&#xff0c;欢迎大佬指点&#xff01; 目标梦想&#xff1a;进大厂&#xff0c;立志成为一个牛掰的Java程序猿&#xff0c;虽然现在还是一个…

JS基于base64编码加密解密文本和图片

JS基于base64编码加密解密文本和图片 ​ 密码学&#xff0c;体系太庞大了&#xff0c;常见的加密解密算法很多&#xff0c;我仅了解了一下&#xff0c;这里仅介绍采用实现base64加密解密的方法。 严格地说base64不是加密算法&#xff0c;他只是一种编码方式&#xff0c;是一…

企业经营管理的核心是什么?

一、企业经营管理是什么&#xff1f; 企业经营管理通常是指&#xff0c;企业为了满足自身生存发展&#xff0c;通过对企业内部成员的经营活动进行计划、组织、协调、指挥、控制。企业经营管理主要目的是为了让企业在面向市场和用户是时&#xff0c;可以充分利用企业自身优势和…

excel日期函数:如何计算项目的开始和完成日期

制定工作计划是我们平时工作中经常会遇到的一类事务&#xff0c;例如某个项目&#xff0c;需要分成七个阶段来完成&#xff0c;已知项目的开始日期和每个项目需要的时间&#xff08;以天为单位&#xff09;&#xff0c;就可以做出一个项目的工作计划表&#xff1a; 需要重点强调…

无约束优化:修正阻尼牛顿法

文章目录无约束优化&#xff1a;修正阻尼牛顿法梯度法的困难经典牛顿法定义收敛性证明修正阻尼牛顿法考虑修正阻尼牛顿法的起因如何构造修正矩阵M参考文献无约束优化&#xff1a;修正阻尼牛顿法 梯度法的困难 无约束优化&#xff1a;线搜索最速下降 对于光滑函数而言&#x…

pg 锁机制深析

spin lock 使用 cas 去获取锁&#xff0c;先获取 spins_per_delay 次数&#xff0c;如果还失败&#xff0c;则每次获取失败将 delay 时长延长至 1~2倍 delay 值加 0.5 us&#xff0c;spins_per_delay 的值在获取锁后会做更新&#xff0c;如果这次没有等待&#xff0c;则下次可…

Python可视化——matplotlib.pyplot绘图的基本参数详解

目录 1.matplotlib简介 2.图形组成元素的函数用法 2.1. figure()&#xff1a;背景颜色 2.2 xlim()和 ylim()&#xff1a;设置 x&#xff0c;y 轴的数值显示范围 2.3 xlabel()和 ylabel()&#xff1a;设置 x&#xff0c;y 轴的标签文本 2.4 grid()&#xff1a;绘制刻度线的…

NVIDIA深度学习基础-理论与实践入门课程笔记及测验参考代码

1. 使用MNIST数据集进行图像分类 1.1 MNIST数据集 在深度学习的历史当中,对 MNIST 数据集里的70000张手写体数字的图像进行0到9的正确分类是一个重大的进展。如今,这个问题被认为是微不足道的,但是使用 MNIST 进行图像分类已经成为深度学习的一个 Hello World 练习。 以下…

TDC-GP30固件升级笔记

Bootloader介绍 系统重置或系统INIT发生后&#xff0c;总是请求引导加载程序。但是&#xff0c;只有在设置了引导加载器发布代码时&#xff0c;才会执行引导加载器操作。 Bootloader操作包括&#xff1a; “Register Configuration” 寄存器配置”&#xff0c;将配置数据传输…

8-Arm PEG-DBCO分子量决定外观性状,用于修饰生物分子

英文名称&#xff1a;8-Arm PEG-DBCO 中文名称&#xff1a;八臂-聚乙二醇-二苯基环辛炔 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k&#xff08;可按需定制&#xff09; 质量控制&#xff1a;95% 存储条件&#xff…

计算机毕设Python+Vue学校教务管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机中丢失vcruntime140_1.dll,要怎么修复这个问题

关于计算机中丢失vcruntime140_1.dll其实是非常的常见的&#xff0c;当出现这种情况的时候&#xff0c;不需要担心&#xff0c;其实有好多种方法可以解决的。 解决丢失vcruntime140_1.dll的方法 第一种方法&#xff1a;既然计算机丢失了这个vcruntime140_1.dll文件&#xff0…

git:合并多个commit

目录1. 查看提交记录2. 合并commit3. 查看合并后的日志记录1. 查看提交记录 git log --oneline --graph2. 合并commit 这里希望合并最后3个commit&#xff08;modify1&#xff0c;modify2&#xff0c;modify3&#xff09; git rebase -i idid需要使用倒数第4个commit的id&am…

【docker】安装MySQL

实战&#xff1a;安装MySQL 思考&#xff1a;MySQL的数据持久化的问题 #获取镜像 docker pull mysql:5.7 #运行容器&#xff0c;需要做数据挂载 #安装启动MySQL&#xff0c;需要配置密码&#xff08;docker Hub&#xff09; #官方测试 docker run --name some-mysql -e MYSQL…

WebAPi实现多文件上传,并附带参数

需要实现的效果为&#xff0c;通过WebApi实现多文件上传功能&#xff0c;并且在上传时需要能附带文件说明参数&#xff0c;用于保存文件记录 –这里是需要的文件说明参数类 /// <summary>/// 前端文件上传时参数数据/// </summary>public class DistributionData{…

【Spring篇】基于xml的自动装配

&#x1f353;个人主页&#xff1a;个人主页 &#x1f352;系列专栏&#xff1a;SSM框架 自动装配&#xff1a; 根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或接口类 型属性赋值 ①场景模拟 创建类UserControllerpublic…

29.图像卷积代码实现

1. 互相关运算 接下来&#xff0c;我们在corr2d函数中实现如上过程&#xff0c;该函数接受输入张量X和卷积核张量K&#xff0c;并返回输出张量Y。 import torch from torch import nn from d2l import torch as d2ldef corr2d(X,K): # X是输入&#xff0c;K是核矩阵计算二维互…

Cambridge IGCSE Chemistry 真题讲解1

考试局&#xff1a;Cambridge Assessment International Education (CAIE)考试类别&#xff1a;Cambridge International General Certificate of Secondary Education (IGCSE)考试科目&#xff1a;Chemistry考试单元&#xff1a;Paper 2 Multiple Choice (Extended)试卷代码&a…

什么是混合云、公有云、私有云?

很多用户都不清楚混合云、公有云、私有云的定义是什么&#xff0c;很多用户都不是很清楚具体的含义接下来一起跟着小编来看看吧。 一、混合云( hybrid cloud) 在混合云模式中&#xff0c;云平台由两种不同模式(私有或公有)云平台组合而成。这些平台依然是独立实体&#xff0c;但…