k8s--基础--19--DaemonSet

这篇具有很好参考价值的文章主要介绍了k8s--基础--19--DaemonSet。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

k8s–基础–19–DaemonSet


1、介绍

  1. 是个控制器
  2. 能够确保k8s的所有节点都运行一个相同的pod副本,假设这个pod名称为pa
    1. 当增加node节点时,这个节点会自动创建一个pa副本
    2. 当删除node节点时,pa副本会自动删除
  3. 删除daemonset会删除它们创建的pod

1.1、使用场景

  1. 需要在每一个node节点运行一个存储服务,例如gluster,ceph
  2. 需要在每一个node节点运行一个日志收集服务,例如fluentd,logstash
  3. 需要在每一个node节点运行一个监控服务,例如Prometheus Node Exporter,zabbix agent等

1.2、用法

1.2.1、简单用法

在所有的节点上都启动一个 DaemonSet

1.2.2、复杂用法

单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志,并且对不同硬件类型具有不同的内存、CPU要求。

2、创建DaemonSet

2.1、创建脚本

vi /root/test2/daemonset-nginx.yaml 

内容

 

apiVersion: apps/v1
kind: DaemonSet
metadata:
  # DaemonSet的名称
  name: daemonset-nginx
  # 命名空间
  namespace: kube-system
  labels:
    # DaemonSet 标签
    la-nginx: daemonset-nginx
spec:
  # 标签选择器
  selector:
    matchLabels:
      # 使用 k2-nginx: daemonset-nginx2 标签的template
      k2-nginx: daemonset-nginx2
  # 定义模板
  template:
    metadata:
      labels:
        # 定义标签
        k2-nginx: daemonset-nginx2
    spec:
      # 定义容忍度,容忍哪些污点
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      # 定义容器
      containers:
      - name: c-nginx
        image: nginx
        # 定义资源
        resources:
          # 最大CPU和内存
          limits:
            cpu: 200m
            memory: 200Mi 
          # 最小CPU和内存
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
          # 引入名称为nginx-volume1的存储定义
        - name: nginx-volume1
          # 容器存储卷目录
          mountPath: /usr/share/nginx/html
        - name: nginx-volume2
          mountPath: /usr/share/nginx/conf
          readOnly: true
      # pod中断所需的时间
      terminationGracePeriodSeconds: 30
      volumes:
        # 存储卷名称
      - name: nginx-volume1
        # 存储卷类型
        hostPath:
          # 节点的目录
          path: /data/nginx-volume1
      - name: nginx-volume2
        hostPath:
          path: /data/nginx-volume2
 
 

2.2、执行

kubectl apply -f /root/test2/daemonset-nginx.yaml 

# 查看
kubectl -n kube-system get pods  -o wide

k8s--基础--19--DaemonSet

3、DaemonSet运行在哪个节点上

  1. 有指定节点,那就在指定节点创建pod
  2. 未指定节点,将在所有节点上创建Pod

3.1、daemonset.spec.template.spec.nodeName

DaemonSet只在某个节点上创建Pod

k8s--基础--19--DaemonSet


apiVersion: apps/v1
kind: DaemonSet
metadata:
  # DaemonSet的名称
  name: daemonset-nginx
  # 命名空间
  namespace: kube-system
  labels:
    # DaemonSet 标签
    la-nginx: daemonset-nginx
spec:
  # 标签选择器
  selector:
    # 匹配拥有哪些标签的pod
    matchLabels:
      # 使用 k2-nginx: daemonset-nginx2 标签的template
      k2-nginx: daemonset-nginx2
  # 定义模板
  template:
    metadata:
      labels:
        # 定义标签
        k2-nginx: daemonset-nginx2
    spec:  
      # DaemonSet将在node1节点上创建Pod
      nodeName: node1
      # 定义容忍度,容忍哪些污点
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      # 定义容器
      containers:
      - name: c-nginx
        image: nginx

k8s--基础--19--DaemonSet

3.2、daemonset.spec.template.spec.affinity

DaemonSet控制器将在与该节点关联相匹配的节点上创建Pod。

kubectl explain daemonset.spec.template.spec.affinity

4、怎么调度daemonset pod

  1. 通过默认scheduler调度,DaemonSet确保所有符合条件的节点都运行相同的Pod副本
  2. 运行Pod的节点由Kubernetes调度器选择。

4.1、DaemonSet pods 由 DaemonSet 创建和调度。这将引入以下问题:

  1. Pod 行为的不一致性:
    1. 等待调度的正常Pod已被创建并处于Pending 状态,但DaemonSet pods未在Pending状态下创建。
  2. Pod preemption由默认scheduler处理。启用抢占后,DaemonSet控制器将在不考虑pod优先级和抢占的情况下制定调度决策。

4.2、ScheduleDaemonSetPods允许使用默认调度器而不是DaemonSet来调度

DaemonSets方法是将NodeAffinity添加到DaemonSet pods,而不是.spec.nodeName。 然后使用默认调度器将pod绑定到目标主机。 如果DaemonSet pod的亲和节点已存在,则替换它。

4.3、DaemonSet 控制器仅在创建或修改 DaemonSet pods时执行这些操作,并且不对 DaemonSet的spec.template进行任何更改。

nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchFields:
      - key: metadata.name
        operator: In
        values:
        - target-host-name

  1. 系统会自动添加 node.kubernetes.io/unschedulable:NoSchedule 容忍度到 DaemonSet Pods。
  2. 在调度DaemonSet Pod时,默认调度器会忽略unschedulable节点。

5、污点和容忍度

尽管Daemon Pods遵循污点和容忍度规则,根据相关特性,会自动将以下容忍度添加到 DaemonSet Pods 中。

k8s--基础--19--DaemonSet

6、与DaemonSet中的Pod进行通信

与DaemonSet中的Pod进行通信的几种可能模式如下

  1. Push
  2. NodeIP和已知端口
  3. DNS
  4. Service

6.1、Push

将DaemonSet中的Pod配置为将更新发送到其他服务,例如统计数据库。

6.2、NodeIP和已知端口

  1. DaemonSet 中的Pod可以使用hostPort,从而可以通过 节点IP 访问到 Pod。
  2. 客户端能通过某种方法获取 节点IP 列表,并且基于此也可以获取到相应的端口。

6.3、DNS

创建具有相同PodSelector的 Headless Service,然后通过使用 endpoints 资源或从 DNS 中检索到多个 A 记录来发现 DaemonSet。

6.4、Service

创建具有相同PodSelector 的 Service,并使用该 Service 随机访问到某个节点上的DaemonSet pod(没有办法访问到特定节点)。

7、更新 DaemonSet

  1. 如果修改了节点标签,DaemonSet将立刻向新匹配上的节点添加Pod,同时删除不能够匹配的节点上的Pod。
  2. 可以修改DaemonSet创建的Pod。然而,不允许对Pod的所有字段进行更新。
    1. 当下次节点(即使具有相同的名称)被创建时,DaemonSet Controller 还会使用最初的模板。
  3. 可以删除一个DaemonSet。
    1. 如果使用kubectl并指定 --cascade=false,则Pod将被保留在节点上。
  4. 可以创建具有不同模板的新DaemonSet。
    1. 具有不同模板的新DaemonSet将能够通过标签匹配并识别所有已经存在的Pod。
  5. 如果有任何Pod需要替换,则DaemonSet根据它的 updateStrategy来替换

8、DaemonSet 的可替代选择

8.1、init 脚本

我们很可能希望直接在一个节点上启动daemon(守护)进程(例如,使用 init、upstartd、systemd)。这非常好,但基于DaemonSet来运行这些进程有如下一些好处

  1. 像对待应用程序一样,具备为daemon提供监控和管理日志的能力。
  2. 为daemon和应用程序使用相同的配置语言和工具(如Pod模板、kubectl)。
  3. 在资源受限的容器中运行daemon,能够增加daemon和应用容器的隔离性。然而,这也实现了在容器中运行daemon,但却不能在Pod中运行, 例如:直接基于Docker启动

9、Deployments和Daemonset区别联系

9.1、相似性

  1. 都能创建Pod
  2. 创建的Pod对应的进程都不希望被终止掉,举例如下
    1. Web 服务器
    2. 存储服务器

9.2、使用Deployments的场景

无状态的Sevice使用Deployments,需要实现对副本的数量进行扩缩容、平滑升级,就用Deployments

9.3、使用Daemonset的场景

需要Pod副本总是运行在全部或特定主机上,并需要先于其他Pod启动,就用daemonset。文章来源地址https://www.toymoban.com/news/detail-445534.html

到了这里,关于k8s--基础--19--DaemonSet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s控制器之DaemonSet--第二弹创建DaemonSet

    下面是 DaemonSet 的 YAML 文件示例 daemonset.yaml。该例子中的 DaemonSet 运行了一个 fluentd-elasticsearch 的 docker 镜像: 执行如下命令可创建该 DaemonSet: 执行结果: 与其他所有 Kubernetes API 对象相同,DaemonSet 需要如下字段: apiVersion kind metadata 除此之外,DaemonSet 还需要 .spec 字段 .spec

    2024年02月10日
    浏览(31)
  • 持续集成部署-k8s-资源调度:DaemonSet

    在 Kubernetes 中, DaemonSet 是一种用于在集群中运行一个 Pod 副本的控制器对象。它可以保证在每个节点上都运行一个 Pod 副本,并且在节点加入或退出集群时自动地更新。 DaemonSet 通常用于在集群中部署一些系统级别的服务,例如日志收集、监控、网络代理等。它们需要在每个

    2024年02月08日
    浏览(33)
  • 在K8S中,DaemonSet类型资源特性?

    在Kubernetes(简称K8S)中,DaemonSet是一种控制器资源对象,它的主要特性包括: 每个节点运行一个实例 : DaemonSet确保集群中的每个工作节点上都运行着一个指定的Pod副本。这意味着当DaemonSet被创建时,系统会自动调度Pod到所有符合条件的节点上,确保每个节点上都有且仅有一

    2024年02月19日
    浏览(28)
  • k8s控制器之DaemonSet--第三弹DaemonSet 是如何调度的

    v1.12以后默认禁用 通常,Kubernetes Scheduler(调度器)决定了 Pod 在哪个节点上运行。然而 DaemonSet Controller 创建的 Pod 已经指定了 .spec.nodeName 字段,因此: Node 节点的 unschedulable (opens new window)字段将被 DaemonSet Controller 忽略 DaemonSet Controller 可以在 kubernetes scheduler 启动之前创建

    2024年02月10日
    浏览(34)
  • 飞天使-k8s知识点21-kubernetes实操6-daemonset

    daemonset service endpoint pod 之间的关系 service 基于Service访问外部服务

    2024年02月22日
    浏览(37)
  • 学习笔记二十八:K8S控制器Daemonset入门到企业实战应用

    DaemonSet控制器能够确保k8s集群所有的节点都运行一个相同的pod副本,当向k8s集群中增加node节点时,这个node节点也会自动创建一个pod副本,当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它们创建的pod daemonset的控制器会监听kuberntes的daemonset对象、pod对象、

    2024年02月05日
    浏览(34)
  • k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC

    1.1、定义 工作负载能让Pod能拥有自恢复能力,会写Pod,研究不同的工作负载怎么控制Pod的行为 1.2、分类 2.1、定义 一个 Deployment 为 Pods 和 ReplicaSets 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变

    2024年02月11日
    浏览(29)
  • K8s(Kubernetes)学习(四):Controller 控制器:Deployment、StatefulSet、Daemonset、Job

    什么是 Controller 以及作用 常见的 Controller 控制器 Controller 如何管理 Pod Deployment 基本操作与应用 通过控制器实现 Pod 升级回滚和弹性伸缩 StatefulSet 基本操作与应用 Daemonset 基本操作与应用 Job 基本操作与应用 Controller 无法解决问题 1 Controller 控制器 官网: http://kubernetes.p2hp.com/

    2024年02月09日
    浏览(44)
  • 19-k8s的附加组件-coreDNS组件

            coreDNS组件:就是将svc资源的名称解析成ClusterIP;         kubeadm部署的k8s集群自带coreDNS组件,二进制部署需要自己手动部署; [root@k8s231 ~]# kubectl get pods -o wide -A     k8s系统中安装了coreDNS组件后,会有一个coreDNS开头的pod资源;         查看kubelet的配置文件中,可以

    2024年02月21日
    浏览(31)
  • 实战:k8s证书续签-2023.6.19(测试成功)

    https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 k8s集群核心的证书有2套,还有1套非核心的(即使出问题也问题不大)。 ⚠️ 如果是kubeadm搭建的k8s集群,其有效期为1年。 二进制搭建可以指定证书过期时间的。 测试环境 测试软件(无) ①查看证书有效期 k8s证书目录: /etc/kuberne

    2024年02月10日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包