k8s学习之路 | k8s 工作负载 DaemonSet

news2024/11/15 8:38:57

文章目录

  • 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>

image-20230307145752337

kubectl explain ds.spec

image-20230307145808351

必须字段

  1. apiVersionkindmetadata
  2. .spec
    • Pod 模块:.spec.template
    • Pod 选择算符:.spec.selector

特定节点运行

如果指定了 .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-elasticsearch
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

运行查看一下结果

image-20230307151453931

  • 没有像以前设置 Pod 的副本数多少,因为 DS资源会在每一个节点只运行一个,控制节点除外,好像要特殊设置才行,遇到了我再看看

1.5 DS Pod 是如何被调度的

  1. DaemonSet 控制器为每个符合条件的节点创建一个 Pod,并添加 Pod 的 spec.affinity.nodeAffinity 字段以匹配目标主机:kubectl get ds fluentd-elasticsearch

image-20230307152147922

  1. Pod 创建以后,默认的调度程序通常通过设置 Pod 的 .spec.nodeName 字段来接管 Pod 并将 Pod 绑定到目标主机,如果新的 Pod 无法放在节点上,默认的调度程序可能会根据新 Pod 的优先级抢占某些现存的 Pod

image-20230307153003328

用户通过设置 DaemonSet 的 .spec.template.spec.schedulerName 字段,可以为 DamonSet 的 Pod 指定不同的调度程序。不设置就是 default-scheduler

image-20230307153100396

关于亲和性、污点、容忍度后续进行一个补充

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-demo
  labels:
    k8s-app: nginx
spec:
  selector:
    matchLabels:
      name: app
  template:
    metadata:
      labels:
        name: app
    spec:
      tolerations:
      #这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: nginx
        image: nginx:1.23
        imagePullPolicy: Never  ##这个镜像拉取我是真的难受 直接弄本地来吧

运行查看一下

image-20230307163300030

  • 控制节点也是可以运行的,因为我加了一个东西
  • 每个节点都只运行一个 Pod

尝试删除一个 Pod

##尝试删除一下 k8s-02上面的pod,跟着一下状态
kubectl delete pod ds-demo-dlzh4

image-20230307163544294

  • 可以看到最终还是会再该节点启动一个 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

image-20230307165119899

2.3 滚动更新

我要对上面的资源更新一个镜像,修改一下 yaml 文件

###ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-demo
  labels:
    k8s-app: nginx
spec:
  selector:
    matchLabels:
      name: app
  updateStrategy:  ## 更新
    type: RollingUpdate  ## 更新策略
    rollingUpdate:  ##更新参数,仅在 type 值为 "RollingUpdate" 时出现
      maxUnavailable: 1 ##更新期间不可用的 DaemonSet Pod 的最大数量
  template:
    metadata:
      labels:
        name: app
    spec:
      tolerations:
      #这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: nginx
        image: nginx:1.23.3
        imagePullPolicy: Never  ##这个镜像拉取我是真的难受 直接弄本地来吧

更新一下,并跟踪状态

  • 停一个,更新一个;停一个,更新一个;停一个;更新一个

image-20230307170135739

查看更新状态

[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-demo
  labels:
    k8s-app: nginx
spec:
  selector:
    matchLabels:
      name: app
  updateStrategy:  ## 更新
    type: OnDelete   ## 更新策略
  template:
    metadata:
      labels:
        name: app
    spec:
      tolerations:
      #这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: nginx
        image: nginx:1.23
        imagePullPolicy: Never  ##这个镜像拉取我是真的难受 直接弄本地来吧

更新运行看状态kubectl apply -f ds.yaml

  • 可以看到更新方式改变了,所以这次更新没反应

image-20230307170505019

杀死一个 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]#

image-20230307170652752

看一下是否更新完成:镜像是否改变 kubectl describe pod ds-demo-qgd49

  • 可以看到镜像已经更新了
  • 这种类型的更新细节就是:只有当你手动删除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才会被自动创建。

image-20230307170734065

2.6 更新回滚

DS 修订版本

kubectl explain ds.spec 中的 [revisionHistoryLimit] 确认了版本保留的数量,默认就是10

查看 DS 的所有版本

kubectl rollout history ds ds-demo

image-20230307172409541

查看指定版本的详细信息

kubectl rollout history ds ds-demo --revision=2

image-20230307172605686

回滚到指定版本

kubectl rollout undo ds ds-demo --to-revision=2

查看更新结果

因为我之前改过更新策略,我必须杀死 Pod 后,才能回退成功

image-20230307172916918

查看回滚进度

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 无法检测到正确的滚动更新进度

image-20230307173358512

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

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

相关文章

重新认识下网页水印

使用背景图图片 单独使用 css 实现&#xff0c;使用 backgroundImage&#xff0c;backgroundRepeat 将背景图片平铺到需要加水印的容器中即可。 如果希望实现旋转效果&#xff0c;可以借助伪元素&#xff0c;将背景样式放到伪元素中&#xff0c;旋转伪元素实现&#xff1a; &l…

CHAPTER 5 文件共享 - FTP

文件共享 - FTP1 FTP1.1 传输方式1. ASCII传输方式2. 二进制传输模式3. 两种传输方式的区别1.2 支持的模式1. 主动模式(PORT)2. 被动模式(PASV)3. 如何选择4. 为什么绝大部分互联网应用都是被动模式&#xff1f;1.3 搭建FTP服务器&#xff08;使用vsftpd&#xff09;1. 安装软件…

计算机中信息的表示和处理 整数和小数的二进制表示

信息的表示和处理整数进制字移位运算无符号数和有符号数加法运算小数定点表示IEEE 浮点表示规格化和非规格化舍入浮点运算现代计算机存储和处理的信息以二值信号表示&#xff0c;这些二进制数字称为位&#xff0c;为什么要用二进制来进行编码&#xff1f;因为二进制只有1和0两种…

信捷 XDH Ethercat A_STOP指令

本指令使运动中的轴进行减速停止/急停。最常见的情况是用来停止以指定速度运行的轴。只要在运动&#xff0c;都可以用本指令停止。上图中&#xff0c;在M150的上升沿&#xff0c;执行A_STOP指令。A_STOP HD150 D150 M151 K0HD150--输入参数起始地址&#xff0c;HD158--输入参数…

创宇猎幽APT流量监测系统获CSTC年度网络安全优秀案例

近日&#xff0c;由中国软件评测中心发起的“2022 年度网络安全和数据安全优秀案例评选”活动评选结果正式公布。在众多参与案例中&#xff0c;创宇猎幽APT流量监测系统&#xff08;NDR&#xff09;凭借出色的行业场景实践和出众的产品表现力脱颖而出&#xff0c;成功入选“202…

5、score diffusion model

DDIM中遇到的Score-based SDE这里采用表示神经网络的预测值&#xff0c;用表示。同时等价于DDPM回顾贝叶斯公式原始公式前向过程表示连乘反向过程由前向过程可知&#xff1a;所以&#xff1a;正态分布&#xff1a;重参数技巧&#xff1a;反向过程&#xff1a;优化目标&#xff…

ASP.NETCore学习资料

1.ASP.NETCore比ASP.NET更具优势的地方是什么&#xff1f; ASP.NET Core(ASP.NET Core 简介) ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET(ASP.NET 简介) ASP.NET 是一个成熟的框架&#xff0c;提…

Git学习笔记(七)——其他操作

一、自定义Git Git除了配置user.name 和user.email 还有很多可配置项。 &#xff08;1&#xff09;命令git config --global color.ui true 让Git显示颜色&#xff0c;会让命令输出看起来更醒目.Git 会适当显示不同的颜色。 $ git config --global color.ui true查看分支会有…

延迟队列docker插件

文章目录 目录 文章目录 前言 一、环境准备与使用 总结 前言 一、环境准备与使用 下载对应版本的插件 https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases 然后在虚拟机上随便找个文件夹 cd /home/docker 先把容器运行 然后在当前文件下 将插件拷贝…

半入耳式耳机运动会不会掉、佩戴超稳固的运动耳机推荐

现在越来越多的人开始意识到运动的重要性&#xff0c;用运动给身体增加一道“防护墙”是最好的生活方式了&#xff0c;不过&#xff0c;日复一日做着几乎相同的动作&#xff0c;难免索然无味&#xff0c;所以很多人都会选择在运动时戴上耳机听歌解闷&#xff0c;这时候也有不少…

选射频线缆的困难和调试多链路匹配板子的心酸

今日痛点&#xff1a;选电缆和板子出问题 选线缆选到后面&#xff1a;有同事给我说&#xff0c;我还要高精度转接头&#xff0c;我还要BNC转接头 ​ 你们如果知道我选择线缆的艰辛&#xff0c;换做你们会怎么想 附上我选择线缆的心得&#xff1a; 1.S11尽量要考虑桌子的宽度&a…

Vector - CAPL - 文件处理函数

在当前平台化的趋势下,就算是协议层测试依然需要适配各种各样的项目,也需要处理各类型的文件,那我们如何对文件进行读取、写入、修改等类型的操作呢?今天我们就会介绍此类型的函数,主要适用于text、bin文件的处理。 打开文件 Open

MySQL之Explain分析

4 Explain分析&#xff08;重点&#xff09; 4.1 Explain介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设置一个标记&#xff0c;执行查询会返回执行…

TCP的11种状态

CLOSED状态&#xff1a;初始状态&#xff0c;表示TCP连接是“关闭的”或者“未打开的”LISTEN状态&#xff1a;表示服务端的某个端口正处于监听状态&#xff0c;正在等待客户端连接的到来SYN_SENT状态&#xff1a;当客户端发送SYN请求建立连接之后&#xff0c;客户端处于SYN_SE…

Gradle安装配置阿里云

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;也增加了基于Kotlin语言的kotlin-based DSL&#xff0c;抛弃了基于XML的各种繁琐配置。 面向Java应用为主。当前其支持的语言C、J…

数据结构——哈希表

一、哈希表介绍1.1 哈希表初了解哈希表是属于一个数据结构&#xff0c;并不是一个算法哈希表&#xff1a;hashtable&#xff0c;也叫散列表&#xff0c;根据关键码值(Key value)而直接进行访问的数据结构。通过把关键码值映射到表中的一个位置来访问记录&#xff0c;以加快查找…

解析永春堂1300模式为何风靡新零售市场

最近&#xff0c;永春堂1300模式风靡新零售市场&#xff0c;它凭借兼顾大、小、新、老会员&#xff0c;没有沉淀和泡沫等特点&#xff0c;引起市场的热切关注。而永春堂1300模式如此受欢迎的原因&#xff0c;最重要的&#xff0c;还是它丰厚的奖项报酬。永春堂1300直销模式主要…

Spring Boot 实现接口幂等性的 4 种方案

一、什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂…

多态与虚(函数)表

前言续接上回&#xff08;继承&#xff09;&#xff0c;我们了解了继承是如何通过虚基表&#xff0c;来解决派生类和父类有相同的成员变量的情况&#xff0c;但是类和对象中可不只有成员变量&#xff0c;如果成员函数也有同名&#xff0c;更或者如果我们想在访问不同情况&#…

Zeppelin【部署 01】Zeppelin最新版本zeppelin-0.10.1下载安装配置启动及问题处理(一篇学会部署Zeppelin)

1.简单介绍 来自百度百科&#xff1a; Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架。提供了数据分析、数据可视化等功能。是一个提供交互数据分析且基于Web的笔记本。方便你做出可数据驱动的、可交互且可协作的精美文档&#xff0c;并且支持多种语言…