Kubernetes的DaemonSet(上篇)
背景
静儿作为美团容器化团队HULK的一员,经常需要和Kubernetes(k8s)打交道。第一次登陆node(宿主机)的时候,发现连续登陆几台都看到了Prometheus-Node-Exporter字样的docker进程。他们和普通的Pod(容器)一样,占用IP等资源,占用宿主机允许的pod数上限。后来通过看书了解到这是DaemonSet控制管理的Pod.
DaemonSet官方文档译文
一个DaemonSet确保了所有的node上仅有一个的Pod的一个实例。当node被添加到集群中,Pod也被添加上去。当node被从集群移除,这些Pod会被垃圾回收。删除一个DaemonSet将会清理它创建的Pod。
举一些DaemonSet典型用法的例子:
在每个node上运行一个集群存储守护进程,例如glusterd、ceph
在每个node上运行一个日志集合,例如fuentd或者logstash
在每个node上运行一个node监控后台线程,例如Prometheus Node Exporter,collectd,Dynatrace OneAgent,AppDynamics Agent,Datadog agent,New Relic agent,Ganglia gmod 或者Instana agent.
在一种简单的场合下,一个DeamonSet会被使用在任意种后台线程、覆盖所有的node。在更复杂的安装方式中,多个DaemonSet会被用于一种后台线程。但是在不同的硬件类型会对应不同的标识或者不同的内存和CPU请求。
写一个DaemonSet Spec
创建一个DaemonSet
在YAML文件中生命一个DaemonSet。daemonset.yaml文件描述了一个运行着fluentd-elasticsearch的docker镜像的DaemonSet。
controllers/daemonset.yaml
apiVersion: apps/v1kind: DaemonSetmetadata:name: fluentd-elasticsearchnamespace: kube-systemlabels:k8s-app: fluentd-loggingspec:selector:matchLabels:name: fluentd-elasticsearchtemplate:metadata:labels:name: fluentd-elasticsearchspec:tolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: fluentd-elasticsearchimage: k8s.gcr.io/fluentd-elasticsearch:1.20resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: trueterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers
创建一个基于YAML文件的DaemonSet
kubectl create -f https://k8s.io/examples/controllers/daemonset.yaml
所需的字段
和其他的Kubernetes配置文件一样,一个DaemonSet需要apiVersion,kind和metadata字段。配置文件的通用信息,可以看deploying application,configuring containers和object management using kubectl文档。
一个DaemonSet也需要一个spec区
Pod模板
.spec.template是.spec的必需字段。
.spec.template是一个pod模板。除了是嵌套的并且没有apiVersion或者kind之外,它的schema和pod是一样的。
除了pod必需的字段,在DaemonSet中的pod模板必需指定合适的label(详见pod selector)。
在DaemonSet中的pod模板必需要有一个Always的RestartPolicy。如果没有明确指定,默认也是Aways。
Pod选择器
.spec.selector字段是pod的选择器。它的功能和job的.spec.selector一样。
在Kubernetes1.8中,必需指定一个带有.spec.template的pod选择器。当pod选择器为空时将不会再是默认的选择器。选择器默认和kubectl apply是不兼容的。一旦DaemonSet被创建,.spec.selector就不能变了。一旦改变了pod选择器,可能会导致意外将这个pod变成「孤岛」。用户会很迷惑。
.spec.selector是有两个字段组成的对象:
matchLabels - 和ReplicationController的.spec.selector是一样的
matchExpressions - 通过制定key、values列表、operatorl来定制更加精细的选择器。
指定了两个,它们的作用关系是and。
一旦.spec.selector被指定,就必须和.spec.template.metadata.labels匹配。不匹配的配置会被API拒掉。
同时,用户平时也不应该创建匹配这些选择器的标签。包括直接创建、通过其他的DaemonSet创建,或者通过其他的像ReplicaSet这样的控制器来创建。否则,DaemonSet控制器会认为这些pod是自己创建的。但是如果说想手动创建一个值不同的pod放在node上做测试就另当别论了。
在指定node上运行pod
指定.spec.template.spec.nodeSelector,DaemonSet控制器会在node上创建一个匹配node选择器的pod。同时,如果指定.spec.template.spec.affinity,这时候DaemonSet控制器会创建匹配node的affinity的pod。如果什么两者都不指定,DaemonSet控制器将会在所有node上创建pod。
Daemon的pod是怎么被调度的
通过DaemonSet控制器来调度(1.12版本被禁用)
pod实际运行的设备通常是Kubernetes调度器来选择的。但是DaemonSet控住器创建的pod是已经指定好了设备的(Pod在创建时.spec.nodeName已经被指定了,所以会被调度器忽略)。基于这个原因:
node节点上的字段unschedulable会被DaemonSet控制器忽略。
DaemonSet控制器在调度还没开始时就会创建Pod来帮助启动集群。
被默认调度器调度(1.12版本开始默认启动)
DaemonSet确保所有有资格的node运行一个pod的一个实例。一般来说,Kubernetes控制器决定了一个Pod选择哪个node。但是DaemonSet控制器却负责创建和调度DaemonSet的pod。这引入了下面的问题:
不一致的Pod行为:普通Pod会以Pending状态创建出来等待调度。但是DaemonSet的Pod的初始状态却不是Pending。这让用户很疑惑。
默认调度器处理Pod优先权(Pod preemption)。当preemption被启用,DaemonSet控制器在做调度决策时就不考虑pod优先权。
ScheduleDaemonSetPods允许你使用默认调度器而不是DaemonSet控制器来调度。这是通过添加NodeAffinity项而不是.spec.nodeName到DaemonSet的Pod来实现的。默认调度被应用于绑定pod到目标宿主机。DaemonSet Pod的node affinity已经存在时会被替换。DaemonSet控制器只在创建或者修改DaemonSet Pod时才会这样。不会修改DaemonSet的spec.template。
nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchFields:- key: metadata.nameoperator: Invalues:- target-host-name
污点和容忍
Daemon Pod支持污点和容忍。下面的容忍会根据相应的特性被自动添加到DaemonSet。

总结
初学一个技术如果感觉无法下手,学了也记不住的赶脚。不如先从一个问题出发:为什么会有这个Pod存在?这样先进行感知再系统学习。
相关阅读
Kubernetes的DaemonSet(上篇)的更多相关文章
- Kubernetes的DaemonSet(下篇)
用Daemon Pod来进行通信 使用Pod来再DaemonSet中通信的手段有: 推的方式:在DaemonSet中的Pod会被配置成发送更新到如状态数据库这样的服务.这些都没有客户端. IP+端口方 ...
- Kubernetes之DaemonSet控制器
DaemonSet 简介 DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这些 P ...
- Kubernetes组件-DaemonSet
⒈简介 Replicationcontroller和ReplicaSet都用于在Kubermetes集群上部署运行特定数量的pod.但是,当某些情况下我们希望在集群中的每个节点上运行同一个指定的pod ...
- Kubernetes之DaemonSet
1.DaemonSet在每个节点上运行一个pod K8s中Replicationcontroller和ReplicaSet都用于在Kubernetes集群上运行部署特定数量的pod.但是,当希望pod ...
- kubernetes之DaemonSet以及滚动更新
1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...
- 二进制部署kubernetes集群(上篇)
1.实验架构 1.1.硬件环境 准备5台2c/2g/50g虚拟机,使用10.4.7.0/24 网络 .//因后期要直接向k8s交付java服务,因此运算节点需要4c8g.不交付服务,全部2c2g足够. ...
- 关于kubernetes我们还有什么可做的?
kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性.加上开放可扩展的理念,使得周边社区非常活跃.从既有调研结果看,kubernetes已成为容器编排领域的标准 ...
- 【云计算】K8S DaemonSet 每个node上都运行一个pod
Kubernetes容器集群中的日志系统集成实践 Kubernetes是原生的容器编排管理系统,对于负载均衡.服务发现.高可用.滚动升级.自动伸缩等容器云平台的功能要求有原生支持.今天我分享一下我们在 ...
- 8 分钟了解 Kubernetes
Kubernetes 脱胎于 Google 的 Borg 系统,是一个功能强大的容器编排系统.Kubernetes 及其整个生态系统(工具.模块.插件等)均使用 Go 语言编写,从而构成一套面向 AP ...
随机推荐
- IntelliJ IDEA 配置maven
以下内容引自http://blog.csdn.net/qq_32588349/article/details/51461182. 使用IntelliJ IDEA 配置Maven(入门) ...
- Redis分布式锁的try-with-resources实现
Redis分布式锁的try-with-resources实现 一.简介 在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然 而 ...
- BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望
BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...
- Windows上安装配置SSH教程(1)——知识点汇总
1.是什么SSH? 维基百科:https://zh.wikipedia.org/wiki/Secure_Shell 其他博客:http://www.ruanyifeng.com/blog/2011/1 ...
- python——在文件存放路径下自动创建文件夹!
1.a.py文件存放的路径下为(D:\Auto\eclipse\workspace\Testhtml\Test) 2.通过os.getcwd()获取的路径为:D:\Auto\eclipse\works ...
- Netty自定义协议解析原理与应用
目前,大家都选择Netty做为游戏服务器框架网络通信的框架,而且目前也有很多优秀的产品是基于Netty开发的.它的稳定性,易用性和高效率性已得到广泛的认同.在游戏服务器开发中,选择netty一般就意味 ...
- 华为云(ECS)-linux服务器中-Ubuntu图形界面安装-解决root登录受限-VNCviwer/Teamviwer远程访问教程
安装ubuntu-desktop .更新软件库 apt-get update .升级软件 apt-get upgrade .安装桌面 apt-get install ubuntu-desktop 解决 ...
- MIUI目前为止最简单安装谷歌服务框架教程
安装谷歌服务框架方法有很多,比如用第三方 rec卡刷gapps包.用第三方工具安装......然而这些对于新手来说还是比较难的! 我今天说的方法可以说是最简单的:1.不需要修改文件:2.不需要借助第三 ...
- javascript正则表达式学习(二)--位置匹配
文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...
- Oracle 经典面试题
第一题 create table test( id ) primary key, type ) , t_id ), value ) ); ,,,'张三'); ,,,'男'); ,,,'); ,,,'刘 ...