理解k8s控制器DaemonSet创建及使用场景

目录
  • DaemonSet 简介
  • DaemonSet 使用场景
  • DaemonSet 创建
  • 查看 DaemonSet
  • 更新 DaemonSet
  • 删除 DaemonSet
  • 其它使用场景
    • 容忍性 Toleration 使用
    • 节点亲和性 nodeAffinity 使用
  • 总结

DaemonSet 简介

DaemonSet 的主要作用,是在 Kubernetes 集群里,运行一个 Daemon Pod。 DaemonSet 只管理 Pod 对象,然后通过 nodeAffinity 和 Toleration 这两个调度器参数的功能,保证了每个节点上有且只有一个 Pod。

DaemonSet 是一种面向特定应用场景的 Pod 控制器,尽管它也可以管理 Pod 的多个副本,但它主要用于保证一个 Node 上只运行一个 Pod 的场景:

DaemonSet 使用场景

每个节点上只有一个这样的 Daemon Pod 实例,然后当有新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来。当旧节点被删除后,它上面的 Pod 也会相应地被回收掉。

Daemon Pod 的意义确实是非常重要的。比如的作用:

  • 网络插件的 Agent 组件,都必须运行在每一个节点上,用来处理这个节点上的容器网络。
  • 存储插件的 Agent 组件,也必须运行在每一个节点上,用来在这个节点上挂载远程存储目录,操作容器的 Volume 目录,比如:glusterd、ceph。
  • 监控组件和日志组件,也必须运行在每一个节点上,负责这个节点上的监控信息和日志搜集,比如:fluentd、logstash、Prometheus 等。

DaemonSet 创建

k8s 环境搭建参考网上教程,这里就不再赘述了。

先来个简单的例子快速体验 DaemonSet 控制器是如何应用的。

一个简单的 DaemonSet 配置如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.0

初步看,这份配置跟 Deployment 基本类似,唯一一个显著的差异是 DaemonSet 不需要指定副本数,因为它的副本数取决于工作节点数。

DaemonSet 配置中 spec.selector 和 spec.template 作用我们已在介绍 Deployment 时介绍过,在此不再赘述。

该份配置将创建一个 DaemonSet 对象,然后 DaemonSet 控制器会根据该对象信息分别在每个节点上创建一个 Pod 副本。

接下来使用kubectl create命令将该配置提次给 kube-apiserver,如下所示:

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

查看 DaemonSet

首先查看刚刚创建的 DaemonSet 对象:

[root@k8s-master]# kubectl get daemonset
NAME  DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonset     3     3     3     3     3      <none>          1m3s

命令行输出中各字段含义如下:

  • NAME: DaemonSet 对象名称,同配置中的 metadata.name;
  • DESIRED:需求副本个数,由于没有刻意筛选节点,所以副本个数等同于节点个数(默认);
  • CURRENT:当前已创建的副本个数;
  • READY:处于 Ready 状态的副本个数;
  • UP-TO-DATE:已按最新 Pod 模版创建的 Pod 个数;
  • AVAILABLE:可用的副本个数;
  • NODE SELECTOR:节点选择器,本例中我们没有选择,值为空;
  • AGE:创建至今经历的时间。

上面的字段中,除了 NODE SELECTOR 以外,我们已在前面的章节中介绍过。其实 Node Selector 并不是 DaemonSet 对象特有的配置,它是 Pod 模版中用于为 Pod 匹配节点的配置,DaemonSet 控制器使用该 Node Selector 来筛选需要创建副本的节点,如果没有指定,则默认选择全部节点。

接着,查看 DaemonSet 控制器所创建的 Pod 副本信息:

[root@k8s-master]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE           NOMINATED NODE   READINESS GATES
nginx-daemonset-66dbc   1/1     Running   0          5m13s   10.135.3.2   k8s-master   <none>           <none>
nginx-daemonset-akpdg   1/1     Running   0          5m13s   10.135.1.2   k8s-node1   <none>           <none>
nginx-daemonset-l3wnd   1/1     Running   0          5m13s   10.135.2.2   k8s-node2    <none>           <none>

可以看到,在每个节点上均创建了一个副本,是符合预期的。

更新 DaemonSet

下面我们适当的调整下 Pod 部署策略,只希望 Pod 运行在名为 k8s-node 的节点上,这样我们只需要配置 DaemonSet 对象的 spec.template.spec.nodeSelector 来选择节点即可。

在 k8s-node 的节点中存在一个标识节点的 label:

kubernetes.io/hostname: k8s-node1

使用 kubectl edit 命令修改配置的 spec.template.spec.nodeSelector 参数如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  ...
spec:
  ...
  template:
    ...
    spec:
      ...
      nodeSelector:
        kubernetes.io/hostname: k8s-node1

然后再次观察 DaemonSet 对象和 Pod 副本:

[root@k8s-master]# kubectl get daemonsets
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                        AGE
nginx-daemonset   1         1         1       1            1           kubernetes.io/hostname=k8s-node1   37m
[root@k8s-master]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
nginx-daemonset-66gk2   1/1     Running   0          10s   10.135.2.3   k8s-node1   <none>           <none>

可以发现 DaemonSet 状态中,NODE SELECTOR 正确地展示了上面的修改,而且需求的 Pod 副本数也变成了 1 个,符合预期。

原来运行的 3 个 Pod 副本减少到 1 个,而且只在我们配置选定的节点(k8s-node1)上运行。

删除 DaemonSet

像其他 Pod 控制器一样,当删除 DaemonSet 对象时,其所管理的 Pod 默认也会被删除,操作如下所示:

[root@k8s-master ~]# kubectl delete daemonsets nginx-daemonset
daemonset.apps "nginx-daemonset" deleted
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.

其它使用场景

容忍性 Toleration 使用

DaemonSet 还会给这个 Pod 自动加上另外一个与调度相关的字段,叫作 tolerations。这个字段意味着这个 Pod,会“容忍”(Toleration)某些 Node 的“污点”(Taint)。

Toleration 使用 yaml 配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: with-toleration
spec:
  tolerations:
  - key: node.kubernetes.io/unschedulable
    operator: Exists
    effect: NoSchedule

在正常情况下,被标记了 unschedulable“污点”的 Node,是不会有任何 Pod 被调度上去的(effect: NoSchedule)。

可是,DaemonSet 自动地给被管理的 Pod 加上了这个特殊的 Toleration,就使得这些 Pod 可以忽略这个限制,继而保证每个节点上都会被调度一个 Pod。

当然,如果这个节点有故障的话,这个 Pod 可能会启动失败,而 DaemonSet 则会始终尝试下去,直到 Pod 启动成功。

主要作用:

通过这样一个 Toleration,调度器在调度这个 Pod 的时候,就会忽略当前节点上的“污点”,从而成功地将一些组件调度到这台机器上启动起来。

这种机制,正是我们在部署 Kubernetes 集群的时候,能够先部署 Kubernetes 本身、再部署网络插件的根本原因:因为当时我们所创建的 Weave 的 YAML,实际上就是一个 DaemonSet。

节点亲和性 nodeAffinity 使用

正常情况下 DaemonSet Controller 会在创建 Pod 的时候,自动在这个 Pod 的 API 对象里,加上这样一个 nodeAffinity 定义。

在这个 Pod 里,声明了一个 spec.affinity 字段,然后定义了一个 nodeAffinity。其中,spec.affinity 字段,是 Pod 里跟调度相关的一个字段。

nodeAffinity 使用 yaml 配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: demo-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: metadata.name
            operator: In
            values:
            - demo-node

以上关键参数含义:

  • requiredDuringSchedulingIgnoredDuringExecution 这个代表 nodeAffinity 必须在每次调度的时候予以考虑,同时,这也意味着可以设置在某些情况下不考虑这个 nodeAffinity;
  • 这个 Pod,将来只允许运行在“metadata.name”是“demo-node”的节点上。

总结

DaemonSet 其实就是依靠 nodeAffinity 和 Toleration 实现的。这是一种不需要增加设计结构,而直接使用标签等方式完成的 Daemon 进程。这样的结构非常符合 Kubernetes 的控制器模式,正所谓一切皆对象。

以上就是k8s控制器DaemonSet理解的详细内容,更多关于k8s控制器DaemonSet的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言k8s kubernetes使用leader election实现选举

    目录 一.背景 二.官网代码示例 三.锁的实现 一.背景 在kubernetes的世界中,很多组件仅仅需要一个实例在运行,比如controller-manager或第三方的controller,但是为了高可用性,需要组件有多个副本,在发生故障的时候需要自动切换.因此,需要利用leader election的机制多副本部署,单实例运行的模式.应用程序可以使用外部的组件比如ZooKeeper或Etcd等中间件进行leader eleaction, ZooKeeper的实现是采用临时节点的方案,临时节

  • Centos7 安装部署Kubernetes(k8s)集群实现过程

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4.1 环境介绍 4.2 配置节点的基本环境 4.3 节点安装docker,并进行相关配置 4.4 安装kubelet,kubeadm,kubectl 4.5 kubeadm初始化 4.6 添加worker节点到k8s集群 4.7 部署CNI网络插件calico 4.8 配置kubectl命令tab键自

  • MySQL on k8s 云原生环境部署

    目录 一.概述 二.开始部署(一主两从) 1)添加源 2)修改配置 3)开始安装 4)测试验证 5)Prometheus监控 6)卸载 一.概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一.这里主要讲mysql部署在k8s上,

  • K8S节点本地存储被撑爆问题彻底解决方法

    目录 存储的内容 镜像 可写层 日志 emptyDir 存储的限制方法 K8S的GC 日志总量限制 emptyDir Volume 限制 临时数据的总量限制 存储的内容 现在云原生越来越流行,很多企业都上马了K8S,但是这里边也有很多的坑要填,这篇文章就聊一下K8S节点本地存储被撑爆的问题,也就是磁盘被占满的问题. 要解决存储使用过多的问题,就得先了解存储中都保存了些什么内容,否则解决不了问题,还可能带来更多的风险. 镜像 容器要在节点上运行,kubelet 首先要拉取容器镜像到节点本地,然后再

  • Kubernetes集群模拟删除k8s重装详解

    目录 一.系统环境 二.前言 三.重装Kubernetes集群 3.1 环境介绍 3.2 删除k8s所有节点(node) 3.3 kubeadm初始化 3.4 添加worker节点到k8s集群 3.5 安装calico 一.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64 二.前言 当我们安装部署好一套Kubernetes集群,使用一段时间之后可能会有重新

  • go语言K8S 的 informer机制浅析

    目录 正文 使用方法 创建Informer工厂 创建对象Informer结构体 注册事件方法 启动Informer 机制解析 Reflector Controller Processer & Listener Indexer 总结 正文 Kubernetes的控制器模式是其非常重要的一个设计模式,整个Kubernetes定义的资源对象以及其状态都保存在etcd数据库中,通过apiserver对其进行增删查改,而各种各样的控制器需要从apiserver及时获取这些对象,然后将其应用到实际中,即将这

  • k8s node节点重新加入master集群的实现

    1.删除node节点 执行kubectl delete node node01 2.这时如果直接执行加入,会报错.如下: [root@k8s-node02 pki]# kubeadm join 192.168.140.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:a3d9827be411208258aea7f3ee9aa396956c0a77c8b570503dd677aa3b6eb6

  • Kubernetes k8s configmap 容器技术解析

    目录 1.什么是 ConfigMap? 2.ConfigMap 能带来什么好处? 3.ConfigMap 三种创建方式 4.ConfigMap 作为环境变量三种使用方式 单个引用 多个引用 args 方式传递环境变量 5.挂载 volume 6.Secret 使用 7.应用程序怎么做到不重启情况下读取最新配置 总结 1.什么是 ConfigMap? ConfigMap 是用来存储配置文件的 Kubernetes 资源对象,配置对象存储在 Etcd 中,配置的形式可以是完整的配置文件.key/va

  • 理解k8s控制器DaemonSet创建及使用场景

    目录 DaemonSet 简介 DaemonSet 使用场景 DaemonSet 创建 查看 DaemonSet 更新 DaemonSet 删除 DaemonSet 其它使用场景 容忍性 Toleration 使用 节点亲和性 nodeAffinity 使用 总结 DaemonSet 简介 DaemonSet 的主要作用,是在 Kubernetes 集群里,运行一个 Daemon Pod. DaemonSet 只管理 Pod 对象,然后通过 nodeAffinity 和 Toleration 这

  • 详解iOS的UI开发中控制器的创建方法

    控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中创建一个控制器. 复制代码 代码如下: #import "YYAppDelegate.h" #import "YYViewController.h" @implementation YYAppDelegate - (BOOL)application:(UIApplication *)ap

  • laravel框架中控制器的创建和使用方法分析

    本文实例讲述了laravel框架中控制器的创建和使用方法.分享给大家供大家参考,具体如下: laravel中我们可以使用 artisan 命令来帮助我们创建控制器文件. php artisan make:controller TestController TestController 控制器名我们可以任意指定.文件默认会创建在 app\Http\Controllers 目录下. 打开控制器文件,我们就可以添加自已的方法了. <?php namespace App\Http\Controllers

  • 深入理解React中es6创建组件this的方法

    首发于:https://mingjiezhang.github.io/. 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的demo说起 Facebook最近一次更新react时,将es6中的class加入了组件的创建方式当中.Facebook也推荐组件创建使用通过定义一个继承自 React.Component 的class来定义一个组件类.官方的demo: class LikeButton extends React.Component

  • K8S中五种控制器的介绍以及使用

    目录 k8s的控制器类型 pod与控制器之间的关系 Deployment(无状态化应用) 状态与无状态化对特点 Deployment的更新 Deployment的回滚 CronJob控制器 总结 k8s的控制器类型 Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为 Deployment:适合无状态的服务部署 StatefullSet:适合有状态的服务部署 DaemonSet:一次部署,所有的node节点都会部署,例如一些典型的应

  • k8s编排之DaemonSet知识点详解

    目录 如何对 StatefulSet 进行“滚动更新”(rolling update)? 下面重点讲解一个\知识点:DaemonSet 列举几个例子: API 对象的定义 如何在指定的 Node 上创建新 Pod 呢? nodeAffinity 含义 如何对 StatefulSet 进行“滚动更新”(rolling update)? 你只要修改 StatefulSet 的 Pod 模板,就会自动触发“滚动更新”: kubectl patch statefulset mysql --type='j

  • ASP.NET Core MVC创建控制器与依赖注入讲解

    默认的IControllerActivator 在 ASP.NET Core 中,当 MVC 中间件接收到请求时,通过路由选择要执行的控制器和操作方法.为了实际的执行操作, MVC 中间件必须创建所选控制器的实例. 创建控制器的过程依赖众多不同的提供者和工厂类,但最终是由实现IControllerActivator接口的实例来决定的.实现类只需要实现两个方法: public interface IControllerActivator { object Create(ControllerCont

  • iOS通过多种方式创建控制器

    本文教大家通过storyboard创建控制器,希望对大家的学习有所帮助. 1.怎么自己通过storyboard创建控制器,之前都是系统加载storyboard,帮我们创建好控制器. 通过UIStoryboard这个对象,就能加载storyboard文件 注意:必须要有storyboard,创建UIStoryboard对象才有意义,alloc init创建UIStoryboard对象没有意义 1.1> instantiateInitialViewController:默认加载箭头指向的控制器 1.

  • K8s创建资源的两种方法实例

    目录 前言 kubectl run kubectl kubectl create/apply kubectl create 与 kubectl apply create apply 总结 前言 在 K8s 中,创建资源有两种方式: 直接使用 kubectl run 命令创建 使用 kubectl create/apply 命令从 YAML 文件创建 在本文中,我将通过示例解释这两种方法,以及它们分别应该在何时使用. kubectl run kubectl run 命令在 pod 中创建并运行特定

  • k8s中job与cronjob使用实例详解

    目录 一.前言 二.k8s中job特点 三.Job模板配置文件核心配置参数 3.1 ttlSecondsAfterFinished 3.2 activeDeadlineSeconds 3.3 backoffLimit 3.4 parallelism 3.5 completions 四.job案例操作演示 五.cronjob 理论 六.cronjob 模板配置文件核心配置参数 七.cronjob 案例操作演示 cronjob的运行状态 job的运行状态 pod的运行状态 cronjob使用场景 一

随机推荐