1.DaemonSet在每个节点上运行一个pod

  K8s中Replicationcontroller和ReplicaSet都用于在Kubernetes集群上运行部署特定数量的pod。但是,当希望pod在集群中的每个节点上运行时(并且每个节点都需要正好一个运行的pod实例),就会出现某些情况。

  这些情况包括pod执行系统级别的与基础结构相关的操作。例如,希望在每个节点上运行日志收集器和资源监控器。另一个典型的例子是Kubernetes自己的kube-proxy进程,它需要运行在所有节点上才能使服务工作。

  在Kuberneters之外,此类进程通常在节点启动期间通过系统初始化脚本或systemd守护进程启动。在Kuberneters节点上,仍然可以使用systemd运行系统进程,但这样就不能利用所有的Kuberneters特性了。

1.1 使用DaemonSet在每个节点上运行一个pod

  要在所有集群节点上运行一个pod需要创建一个DaemonSet对象,这很像一个ReplicationController或ReplicaSet,除了由DaemonSet创建的pod,己经有一个指定的目标节点并跳过Kubemetes调度程序。它们不是随机分布在集群上的。

  DaemonSet确保创建足够的pod,并在自己的节点上部署每个pod。

  尽管ReplicaSet(或ReplicationController)确保集群中存在期望数量的pod副本,但DaemonSet并没有期望的副本数的概念。它不需要,因为它的工作是确保一个pod匹配它的选择器并在每个节点上运行。

  如果节点下线,DaemonSet不会在其他地方重新创建pod。但是,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例。如果有人无意中删除了一个pod,那么它也会重新创建一个新的pod。与ReplicaSet—样,DaemonSet从配置的pod模板创建pod。

1.2 使用DaemonSet只在特定的节点上运行pod

  DaemonSet将pod部署到集群中的所有节点上,除非指定这些pod只在部分节点上运行。这是通过pod模板中的nodeSelector属性指定的,这是DaemonSet定义的一部分(类似于ReplicaSet或ReplicationController中的pod模板)。

  也可以使用节点选择器将pod部署到特定的节点上。DaemonSet中的节点选择器与之相似——它定义了DaemonSet必须将其pod部署到的节点。

  注意:节点可以被设置为不可调度的,防止pod被部署到节点上。DaemonSet甚至会将pod部署到这些节点上,因为无法调度的属性只会被调度器使用,而DaemonSet管理的pod则完全绕过调度器。这是预期的,因为DaemonSet的目的是运行系统服务,即使是在不可调度的节点上,系统服务通常也需要运行。

  用一个例子来解释DaemonSet

  假设有一个名为ssd-monitor的守护进程,它需要在包含固态驱动器(SSD)的所有节点上运行。你将创建一个DaemonSet,它在标记为具有SSD的所有 节点上运行这个守护进程。集群管理员己经向所有此类节点添加了disk=ssd的标签,因此你将使用节点选择器创建DaemonSet,该选择器只选择具有该标签的节点,如图4.9所示。

  创建一个DaemonSet YAML定义文件

  假设将创建一个运行模拟的ssd-monitor监控器进程的DaemonSet,该进程每5秒会将“SSD OK”打印到标准输出。为DaemonSet创建一个YAML文件,如下面的代码清单所示。

#代码4.10 一个DaemonSet的YAML: ssd-monitor-daemonset.yaml
apiVersion: apps/v1beta2 #DaemonSet在apps的API组中,版本是v1beta2
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector: #pod模版包含一个节点选择器,会选择所有disk=ssd标签的节点
disk: ssd
containers:
- name: main
image: luksa/ssd-monitor

  创建DaemonSet

  创建一个DaemonSet就像从YAML文件创建资源那样:

$ kubectl create -f ssd-monitor-daemonset.yaml
daemonset "ssd-monitor" created

  来看一下创建的DaemonSet:

$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR
ssd-monitor 0 0 0 0 0 disk=ssd

  这0看起来很奇怪。DaemonSet应该部署pod吗? 现在列出pod:

$ kubectl get po
No resources found

  pod在哪里呢?知道发生了什么吗?是的,忘记给节点打上disk=ssd标签了。 打上标签之后,DaemonSet将检测到节点的标签己经更改,并将pod部署到有匹配标签的所有节点。

  向节点上添加所需的标签

  无论你使用的是Minikube、GKE或其他多节点集群,都需要首先列出节点,因为在标记时需要知道节点的名称:

$ kubectl get node
NAME STATUS AGE VERSION
minikube Ready 4d v1.6.0

  现在给节点添加disk=ssd标签(如果没有使用Minikube,用你的节点名替换minikube)

 kubectl label node minikube disk=ssd
node "minikube" labeled

  DaemonSet现在应该己经创建pod了

$ kubectl get po
NAME READY STATUS RESTARTS AGE
ssd-monitor-hgxwq 1/1 Running 0 35s

  现在看起来一切正常。如果有多个节点并且其他的节点也加上了同样的标签,将会看到DaemonSet在每个节点上都启动pod。

  从节点上删除所需的标签

  现在假设给其中一个节点打错了标签。它的硬盘是磁盘而不是SSD。这时修改了标签会发生什么呢?

$ kubectl label node minikube disk=hdd --overwrite
node "minikube" labeled

  看一下更改是否影响了运行在节点上的pod:

$ kubectl get po
NAME READY STATUS RESTARTS AGE
ssd-rnonitor-hgxwq 1/1 Terminating 0 4m

  pod如预期中正在被终止。这里对DaemonSet的探索就要结束了,因此可能想要删除ssd-monitor DaemonSet。如果还有其他的pod在运行,删除DaemonSet也会一起删除这些pod。

Kubernetes之DaemonSet的更多相关文章

  1. Kubernetes的DaemonSet(下篇)

    用Daemon Pod来进行通信 使用Pod来再DaemonSet中通信的手段有: 推的方式:在DaemonSet中的Pod会被配置成发送更新到如状态数据库这样的服务.这些都没有客户端. IP+端口方 ...

  2. Kubernetes的DaemonSet(上篇)

    背景 静儿作为美团容器化团队HULK的一员,经常需要和Kubernetes(k8s)打交道.第一次登陆node(宿主机)的时候,发现连续登陆几台都看到了Prometheus-Node-Exporter ...

  3. Kubernetes之DaemonSet控制器

    DaemonSet 简介 DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这些 P ...

  4. Kubernetes组件-DaemonSet

    ⒈简介 Replicationcontroller和ReplicaSet都用于在Kubermetes集群上部署运行特定数量的pod.但是,当某些情况下我们希望在集群中的每个节点上运行同一个指定的pod ...

  5. kubernetes之DaemonSet以及滚动更新

    1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...

  6. 【云计算】K8S DaemonSet 每个node上都运行一个pod

    Kubernetes容器集群中的日志系统集成实践 Kubernetes是原生的容器编排管理系统,对于负载均衡.服务发现.高可用.滚动升级.自动伸缩等容器云平台的功能要求有原生支持.今天我分享一下我们在 ...

  7. 8 分钟了解 Kubernetes

    Kubernetes 脱胎于 Google 的 Borg 系统,是一个功能强大的容器编排系统.Kubernetes 及其整个生态系统(工具.模块.插件等)均使用 Go 语言编写,从而构成一套面向 AP ...

  8. Kubernetes网络分析之Flannel

    Flannel是cereos开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包.传输以及拆包的示意图,从这个图片中可以看出两台机器的docker0分别处于不同的段:10.1.20.1 ...

  9. 关于kubernetes我们还有什么可做的?

    kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性.加上开放可扩展的理念,使得周边社区非常活跃.从既有调研结果看,kubernetes已成为容器编排领域的标准 ...

随机推荐

  1. JAVA的基本介绍和JDK的安装

    JAVA帝国 JAVA特性和优势 简单 面向对象 可复制性 高性能 分布式 动态性 多线性 安全性 健壮性 JAVA三大版本 javaSE:标准版(桌面程序.控制台开发) javaME(嵌入式开发) ...

  2. ansible常用方法

    1.安装ansible yum -y install ansible 2.主机清单推荐格式 [root@controller ~]# vi /etc/ansible/hosts [controller ...

  3. 针对Tab键不能使用解决办法(Linux系统)

    Tab键在装Linux操作系统时,最小化安装没有安装能使用Tab键的安装包,Tab键就无法使用,但命令和本该有的目标也有. 这时就需要安装bash-completion包.,废话不多说,直接上! 一. ...

  4. MyBatis 动态SQL(十二)

    动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...

  5. 2.5if语句

    判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?-- 程序 ...

  6. PID基础

    经常有人会问到PID的用法,今天小编在这里例举温度控制中的PID部分,希望能够把PID的具体应用说明白. 先说几个名词: 1.直接计算法和增量算法:这里的所谓增量算法就是相对于标准算法的相邻两次运算之 ...

  7. Java基础语法,常用知识复习

    1.开发环境搭建 1.1JDK.JRE.JVM.的关系 JDK = JRE + 开发工具集(例如javac编译工具集等) JRE = JVM + Java SE 标准类库 2.基本语法 2.1.jav ...

  8. salesforce零基础学习(一百零三)项目中的零碎知识点小总结(五)

    本篇参考:Salesforce Admin篇(四) Security 之Two-Factor Authentication & Single Sign On https://developer ...

  9. Go语言web开发---Beego基础

    一.框架 框架:可复用的设计组件,它规定了应用的体系结构,明确了整个设计,协作各个组件之间的依赖关系,责任分配,和流程控制.通俗解释框架就是一堆代码的集合,为了提高软件的开发效率和质量,一般都会使用框 ...

  10. 解决servlet响应乱码问题

    当我们使用servlet响应中文时,浏览器接收的内容就会乱码显示出来,原因是响应数据时使用的是utt-8编码,而浏览器解析响应用的的编码却不是utf-8,这样就会造成乱码. 解决办法: respons ...