【k8s资源调度--DaemonSet】

news2024/12/29 13:51:07

1、什么是守护进程

有以下这样一个商品场景:
1、用户在商城查询商品信息,查询商品信息的时候需要登录用户,如果用户想要下单,需要提交到订单服务,最后下单完成后,需要更新仓库的商品数量信息。
2、如果每一个流程都是后端的一个微服务pod形式,那么如果在某个环节出错,那我们需要去查日志,首先需要去查询商品微服务这个Pod的日志,如果日志没有错误信息,在去查用户这个微服务的Pod日志,如果没有,继续查询其他的日志。
3、如果每次这样去查询的日志的时候,就会很麻烦,不利于解决问题。
4、这次有人会想,那每个node上都装一个日志收集器就可以了,这样其实也可以,但k8s给我们提供了一种更好的的方案----守护资源。

在这里插入图片描述

2、配置文件

apiVersion: apps/v1
kind: DaemonSet   # 创建 DaemonSet 守护资源
metadata:
  name: fluentd  # DaemonSet 名字
spec:
  selector:   # 选择器
    matchLabels: 
    app: logging  # 选择器通过标签匹配pod节点
  template:
    metadata:
      labels:   # 标签
        app: logging
        id: fluentd
      name: fluentd  # pod的名字 
    spec:
      containers:
      - name: fluentd-es  # 容器名字
        image: agilestacks/fluentd-elasticsearch:v1.3.0
        env:   # 环境变量
        - name: FLUENTD_ARGS  # 环境变量的key
          value: -qq          # 环境变量的值
        volumeMounts:   # 加载数据卷,避免数据丢失
        - name: containers  # 数据卷的名字
          mountPath: /var/lib/docker/containers # 数据卷挂载到容器的哪个目录
        - name: varlog  # 数据卷名字
          mountPath: /var/log
      volumes: # 定义数据卷
      - hostPath:  # 数据卷类型,主机路径的模式,也就是与node共享目录
          path: /var/lib/docker/containers  # node中的共享目录
        name: containers  #定义数据卷名称
      - hostPath:
          path: /var/log
        name: varlog

3、使用DaemonSet守护进程

  • DaemonSet会忽略Node的unschedulable状态,有两种方式来指定Pod只运行在指定的Node节点上:
  • nodeSelector:只调度到匹配指定label的Node上
  • nodeAffinity:功能更丰富的Node选择器,比如支持集合操作
  • podAffinity:调度到满足条件的Pod所在的Node上

3.1 创建DaemonSet(不添加选择器)会如何?

如果在创建DaemonSet的时候,不添加选择器

在这里插入图片描述

创建资源的时候会提示我们必须要设置选择器

[root@k8s-master ~]# kubectl create -f fluentd.yaml
The DaemonSet "fluentd" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"logging", "id":"fluentd"}: `selector` does not match template `labels`

3.2 创建DaemonSet资源(添加选择器)

[root@k8s-master ~]# kubectl create -f fluentd.yaml
daemonset.apps/fluentd created

3.3 查看daemonset的状态

可以看到给我们创建了2个fluentd资源,reday 0个,up-to-date 2个

[root@k8s-master ~]# kubectl get daemonsets.apps  fluentd
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd   2         2         0       2            0           <none>          18s

3.4 查看daemonset的描述信息

可以看到创建了两个pod信息

[root@k8s-master ~]# kubectl describe daemonsets.apps  fluentd
Name:           fluentd
Selector:       app=logging
Node-Selector:  <none>
Labels:         <none>
Annotations:    deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 0
Number of Nodes Misscheduled: 0
Pods Status:  0 Running / 2 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=logging
           id=fluentd
  Containers:
   fluentd-es:
    Image:      agilestacks/fluentd-elasticsearch:v1.3.0
    Port:       <none>
    Host Port:  <none>
    Environment:
      FLUENTD_ARGS:  -qq
    Mounts:
      /var/lib/docker/containers from containers (rw)
      /varlog from varlog (rw)
  Volumes:
   containers:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/docker/containers
    HostPathType:
   varlog:
    Type:          HostPath (bare host directory volume)
    Path:          /var/log
    HostPathType:
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulCreate  35s   daemonset-controller  Created pod: fluentd-5rz5d
  Normal  SuccessfulCreate  35s   daemonset-controller  Created pod: fluentd-6kpbr

3.5 查看pod状态

查看到fluentd的这个pod还在创建中

[root@k8s-master ~]# kubectl get pod
NAME            READY   STATUS              RESTARTS      AGE
dns-test        1/1     Running             1 (16h ago)   16h
fluentd-5rz5d   0/1     ContainerCreating   0             54s
fluentd-6kpbr   0/1     ContainerCreating   0             54s

3.6 查看pod的描述信息

从events事件中可以看到在拉取镜像和启动pod,并且已经启动成功

[root@k8s-master ~]# kubectl describe  po fluentd-5rz5d
Name:             fluentd-5rz5d
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-node-01/10.10.10.177
Start Time:       Sat, 24 Feb 2024 19:43:29 +0800
Labels:           app=logging
                  controller-revision-hash=5c58fcb7d4
                  id=fluentd
                  pod-template-generation=1
Annotations:      <none>
Status:           Running
IP:               10.2.2.28
IPs:
  IP:           10.2.2.28
Controlled By:  DaemonSet/fluentd
Containers:
  fluentd-es:
    Container ID:   docker://d5bf8b2018b02edb79e410041a0f0764efb472801ab446ff672631ef1904ff7e
    Image:          agilestacks/fluentd-elasticsearch:v1.3.0
    Image ID:       docker-pullable://agilestacks/fluentd-elasticsearch@sha256:9a5bd621f61191ac3bc88b8489dee4b711b22bf675cb5d99c7f0a99603e18b82
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sat, 24 Feb 2024 19:45:30 +0800
    Ready:          True
    Restart Count:  0
    Environment:
      FLUENTD_ARGS:  -qq
    Mounts:
      /var/lib/docker/containers from containers (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-rtc4b (ro)
      /varlog from varlog (rw)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  containers:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/docker/containers
    HostPathType:
  varlog:
    Type:          HostPath (bare host directory volume)
    Path:          /var/log
    HostPathType:
  kube-api-access-rtc4b:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/disk-pressure:NoSchedule op=Exists
                             node.kubernetes.io/memory-pressure:NoSchedule op=Exists
                             node.kubernetes.io/not-ready:NoExecute op=Exists
                             node.kubernetes.io/pid-pressure:NoSchedule op=Exists
                             node.kubernetes.io/unreachable:NoExecute op=Exists
                             node.kubernetes.io/unschedulable:NoSchedule op=Exists
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m6s  default-scheduler  Successfully assigned default/fluentd-5rz5d to k8s-node-01
  Normal  Pulling    2m6s  kubelet            Pulling image "agilestacks/fluentd-elasticsearch:v1.3.0"
  Normal  Pulled     7s    kubelet            Successfully pulled image "agilestacks/fluentd-elasticsearch:v1.3.0" in 1m58.498496853s
  Normal  Created    6s    kubelet            Created container fluentd-es
  Normal  Started    6s    kubelet            Started container fluentd-es

3.7 Pod已经成功运行,并且运行在了非master节点上

node节点上并没有我们设置的选择器标签”app=logging“,他会自动创建资源并且运行在非master节点上。

[root@k8s-master ~]# kubectl get po
NAME            READY   STATUS    RESTARTS      AGE
dns-test        1/1     Running   1 (16h ago)   16h
fluentd-5rz5d   1/1     Running   0             2m14s
fluentd-6kpbr   1/1     Running   0             2m14s
[root@k8s-master ~]# kubectl get po  -o wide
NAME            READY   STATUS    RESTARTS      AGE     IP          NODE          NOMINATED NODE   READINESS GATES
dns-test        1/1     Running   1 (16h ago)   16h     10.2.1.38   k8s-node-02   <none>           <none>
fluentd-5rz5d   1/1     Running   0             2m28s   10.2.2.28   k8s-node-01   <none>           <none>
fluentd-6kpbr   1/1     Running   0             2m28s   10.2.1.50   k8s-node-02   <none>           <none>


# node节点上并没有我们设置的选择器标签”app=logging“
[root@k8s-master ~]#  kubectl get nodes  --show-labels
NAME          STATUS   ROLES           AGE     VERSION   LABELS
k8s-master    Ready    control-plane   4d21h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node-01   Ready    <none>          4d20h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-01,kubernetes.io/os=linux
k8s-node-02   Ready    <none>          2d21h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-02,kubernetes.io/os=linu

3.8 给node-01节点添加一个标签

[root@k8s-master ~]# kubectl label nodes k8s-node-01  type=microsvc --overwrite
node/k8s-node-01 labeled
[root@k8s-master ~]# kubectl get nodes  --show-labels
NAME          STATUS   ROLES           AGE     VERSION   LABELS
k8s-master    Ready    control-plane   4d22h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node-01   Ready    <none>          4d21h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-01,kubernetes.io/os=linux,type=microsvc
k8s-node-02   Ready    <none>          2d21h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-02,kubernetes.io/os=linux

3.9 通过edit选项设置一个node选择器

在这里插入图片描述

3.10 查看DaemonSet资源的状态

如下代码中可以看到DaemonSet的资源变为了1个,reday也是1个,这是由于刚才我们给node-01节点打上了标签,所以只在node-01上有pod,node-02上是没有,如果给node-02上打上标签,node-02上也有会这个pod。

[root@k8s-master ~]# kubectl get daemonsets.apps  fluentd
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd   1         1         1       1            1           type=microsvc   39m


[root@k8s-master ~]# kubectl get po -o wide
NAME            READY   STATUS    RESTARTS      AGE   IP          NODE          NOMINATED NODE   READINESS GATES
dns-test        1/1     Running   1 (17h ago)   17h   10.2.1.38   k8s-node-02   <none>           <none>
fluentd-59k8k   1/1     Running   0             22s   10.2.2.29   k8s-node-01   <none>           <none>

3.11 给node-02也添加一个标签

[root@k8s-master ~]# kubectl label nodes k8s-node-02 type=microsvc
node/k8s-node-02 labeled
[root@k8s-master ~]# kubectl get daemonsets.apps  fluentd
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd   2         2         2       2            2           type=microsvc   42m
[root@k8s-master ~]# kubectl get po -o wide
NAME            READY   STATUS    RESTARTS      AGE     IP          NODE          NOMINATED NODE   READINESS GATES
dns-test        1/1     Running   1 (17h ago)   17h     10.2.1.38   k8s-node-02   <none>           <none>
fluentd-59k8k   1/1     Running   0             3m35s   10.2.2.29   k8s-node-01   <none>           <none>
fluentd-hhtls   1/1     Running   0             5s      10.2.1.51   k8s-node-02   <none>           <none>

3.12 DaemonSet的滚动更新

不建议使用RollingUpdate,建议使用OnDelete模式,这样避免频繁更新导致资源的浪费

3.12.1 查看DaemonSet的默认更新方式

在这里插入图片描述

3.12.2 建议设置为OnDelete

在这里插入图片描述

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

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

相关文章

mysql和redis双写一致性策略分析

mysql和redis双写一致性策略分析 一.什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新&#xff1b; 数据读取的流程&#xff1a; 1.读取redis,如果value!null,直接返回&#xff1b; 2.如果redis中valuenull&#xff0c;读取mysql中数据对应的…

P2040 打开所有的灯

题目传送门&#xff1a;P2040 打开所有的灯 用深度优先搜索实现的一个填色题。 题目步骤&#xff1a; 1..dfs 首先dfs要判断是否符合题意&#xff0c;如果符合题意就更新最短路&#xff1b; 如果不符合题意就枚举 如果是关的就把周围四个包括 给标记上和原来相反的&#xf…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…

python语言1

一、pytho中的注释 1.1注释的理解 程序员在代码中对代码功能解释说明的标注性文字可以提高代码的可读性注释的内容将被python解释器忽略&#xff0c;不被计算机执行 1.2注释的分类 注释分为&#xff1a;单行注释、多行注释、中文声明注释 &#xff08;1&#xff09;单行注…

计算机网络-网络互连和互联网(五)

1.路由器技术NAT&#xff1a; 网络地址翻译&#xff0c;解决IP短缺&#xff0c;路由器内部和外部地址进行转换。静态地址转换&#xff1a;静态NAT&#xff08;一对一&#xff09; 静态NAT&#xff0c;内外一对一转换&#xff0c;用于web服务器&#xff0c;ftp服务器等固定IP的…

大模型的智慧之源:图技术的崛起

自2023年以来&#xff0c;大语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的兴起已经改变了科技行业的面貌。 科创公司如果不涉足这一领域&#xff0c;似乎就不好意思称自己是科技企业。 然而&#xff0c;随着大语言模型的普及&#xff0c;它固有的…

Linux高级编程:进程(三),线程(一)

进程的一生&#xff1a; execute&#xff1a; exec族 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c; 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的 用户空间…

Python复合型数据避坑指南

目录 前言 列表&#xff08;Lists&#xff09; 1. 修改可变对象 2. 浅拷贝和深拷贝 元组&#xff08;Tuples&#xff09; 集合&#xff08;Sets&#xff09; 字典&#xff08;Dictionaries&#xff09; 1. 键值唯一性 2. 键的类型 实际应用场景 1. 数据分析与清洗 2. 网络…

微信小程序云开发教程——墨刀原型工具入门(安装以及基础使用教程)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章&#xff0c;我来介绍一下我的项目中的另外一个功能&#xff1a;显示评论和添加评论。 其实这两个功能都不怎么重要&#xff0c;我感觉最重要的应该是用户注册登录功能&#xff0c;这个也了解一下&#xff0c;知道这么一回事儿就好。 首先设计DAO层。 Mapper public …

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索&#xff08;BFS&#xff09;深度优先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&a…

配置之道:深入研究Netty中的Option选项

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 配置之道&#xff1a;深入研究Netty中的Option选项 前言Option的基础概念ChannelOption与Bootstrap Option常见的ChannelOption类型ChannelConfig的使用Option的生命周期不同传输协议的Option 前言 在…

【MySQL】MySQL复合查询--多表查询自连接子查询 - 副本

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询 4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询 4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------…

Java——建造者模式(Builder)

建造者模式&#xff08;Builder&#xff09; 1、建造者模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂对象的创建型模式&#xff0c;它允许使用者在不知道内部建造细节的情况下&…

vue3的router

需求 路由组件一般放在&#xff0c;pages或views文件夹, 一般组件通常放在component文件夹 路由的2中写法 子路由 其实就是在News组件里面&#xff0c;再定义一个router-view组件 他的子组件&#xff0c;机会渲染在router-view区域 路由传参 <RouterLink :to"/news…

Charles抓包 - 安装、激活、证书配置

最近刚好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;这几年一直听大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建议掌握一种抓包方式即可&#xff0c;都可以解决同种需求场景&#xff09; 抓包 Fiddler抓包 Charles 下载、安…

Day08:基础入门-算法分析传输加密数据格式密文存储代码混淆逆向保护

目录 传输数据-编码型&加密型等 传输格式-常规&JSON&XML等 密码存储-Web&系统&三方应用 代码混淆-源代码加密&逆向保护 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/I…

HotFix原理学习

原文链接&#xff1a;Unity 游戏用XLua的HotFix实现热更原理揭秘-CSDN博客 本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法。这个方法的 第一步&#xff1a;通过对C#的类与函数设置Hotfix标签。来标识需要支持热更的类和函数。第二步&#xff1a;生成函数连接器…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…