深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22549 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

21 | 容器化守护进程的意义:DaemonSet

张磊 2018-10-10
你好,我是张磊。今天我和你分享的主题是:容器化守护进程的意义之 DaemonSet。
在上一篇文章中,我和你详细分享了使用 StatefulSet 编排“有状态应用”的过程。从中不难看出,StatefulSet 其实就是对现有典型运维业务的容器化抽象。也就是说,你一定有方法在不使用 Kubernetes、甚至不使用容器的情况下,自己 DIY 一个类似的方案出来。但是,一旦涉及到升级、版本管理等更工程化的能力,Kubernetes 的好处,才会更加凸现。
比如,如何对 StatefulSet 进行“滚动更新”(rolling update)?
很简单。你只要修改 StatefulSet 的 Pod 模板,就会自动触发“滚动更新”:
$ kubectl patch statefulset mysql --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"mysql:5.7.23"}]'
statefulset.apps/mysql patched
在这里,我使用了 kubectl patch 命令。它的意思是,以“补丁”的方式(JSON 格式的)修改一个 API 对象的指定字段,也就是我在后面指定的“spec/template/spec/containers/0/image”。
这样,StatefulSet Controller 就会按照与 Pod 编号相反的顺序,从最后一个 Pod 开始,逐一更新这个 StatefulSet 管理的每个 Pod。而如果更新发生了错误,这次“滚动更新”就会停止。此外,StatefulSet 的“滚动更新”还允许我们进行更精细的控制,比如金丝雀发布(Canary Deploy)或者灰度发布,这意味着应用的多个实例中被指定的一部分不会被更新到最新的版本。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(26)

  • 虎虎❤️
    思考题,

    我觉得应该是效率的问题。

    查了一下v1.11 的 release notes。scheduler关于affinity谓词的性能大大提高了。

    查阅了Ds用默认调度器代替controller的设计文档
    之前的做法是:
    controller判断调度谓词,符合的话直接在controller中直接设置spec.hostName去调度。
    目前的做法是:
    controller不再判断调度条件,给每个pode设置NodeAffinity。控制器根据NodeAffinity去检查每个node上是否启动了相应的Pod。并且可以利用调度优先级去优先调度关键的ds pods。

    作者回复: 是的,关键就在于,调度优先级这个特性出现了。所以现在的设计其实没啥特别的地方。

    2018-10-10
    7
  • DJH
    张老师,请教几个基础问题:
    1. 在上一讲中,有一点我还是没想通,为何MySQL的数据复制操作必须要用sidecar容器来处理,而不用Mysql主容器来一并解决,你当时提到说是因为容器是单进程模型。如果取消sidecar容器,把数据复制操作和启动MySQL服务这两个操作一并写到MySQL主容器的sh -c命令中,这样算不算一个进程呢?

    2. StatefulSet的容器启动有先后顺序,那么当序号较小的容器由于某种原因需要重启时,会不会先把序号较大的容器KILL掉,再按照它们本来的顺序重新启动一次?

    3. 在这一讲中,你提到了滚动升级时StatefulSet控制新旧副本数的spec.updateStrategy.rollingUpdate.Partition字段。假设我现在已经用这个功能已经完成了灰度发布,需要把所有POD都更新到最新版本,那么是不是Edit或者Patch这个StatefulSet,把spec.updateStrategy.rollingUpdate.Partition字段修改成总的POD数即可?

    4. 在这一讲中提到ControllerRevision这个API对象,K8S会对StatefulSet或DaemonSet的每一次滚动升级都会产生一个新的ControllerRevision对象,还是每个StatefulSet或DaemonSet对象只会有一个关联的ControllerRevision对象,不同的revision记录到同一个ControllerRevision对象中?

    5. Deployment里可以控制保留历史ReplicaSet的数量,那么ControllerRevision这个API对象能不能做到保留指定数量的版本记录?

    问题比较多,谢谢!

    作者回复: 已经解释。不会,重启不会破坏拓扑规则,而且文章里说了,你要确保你的脚本不受重启影响。去掉partition。多个对象。支持,字段也一样。

    2018-10-10
    7
  • 宋晓明
    老师:有没有公司这样用k8s的:apiserver管理很多pod 每个pod的ip地址全部暴露出来 nginx的upstream配置全是pod的ip地址,访问流程也就是client—>nginx—>pod:port 还有一个程序会监控pod地址变化,一旦变化,自动更新nginx配置。这是新公司使用k8s的流程,感觉好多k8s特性都没用到,比如service,ingress等 大材小用了。。。

    作者回复: 小规模用用可以,上生产环境还是要用标准的功能。你会发现越用越爽。

    2018-10-10
    1
    5
  • 北卡
    我跟上面的朋友有同样的疑问,关于Partition更新的。

    我设置了Partition,用部分pod来做灰度发布,然后发现没问题,我要全部更新,就只需要去掉Partition字段吗?
    然后我下一次更新的时候,就要再先加上Partition,然后再更新。全部更新时再去掉。

    我看了老师的回复,表达的是这个意思吗?

    作者回复: 是的。准确的说,是一步一步的减小partition ,一直减成0。就发布完了。

    2018-10-10
    4
  • maomaostyle
    Stateful set 管理的replica 不是通过RS实现的么?

    作者回复: 不是。直接管pod

    2018-11-12
    3
  • donson
    “需要注意的是,在 Kubernetes v1.11 之前,由于调度器尚不完善,DaemonSet 是由 DaemonSet Controller 自行调度的,即它会直接设置 Pod 的 spec.nodename 字段,这样就可以跳过调度器了。”,后来随着调度器的完善,调度器就把DaemonSet的调度逻辑收回,由调度器统一调度。划清边界,领域内聚

    作者回复: 调度器只是原因之一。

    2018-10-10
    3
  • 紫夜
    张老师,DaemonSet的滚动更新,是先delete旧的pod,再启动新的pod,还是和Deployment一样,先创建新的pod,再删除旧的pod?

    作者回复: 到目前为止,DS只有一种策略就是先删除再创建 OnDelete

    2019-08-15
    1
    2
  • 初学者
    还是没有明白damonset的实现与"污点"的关系,理论上为了实现每个node上有且只有pod, daemonset controller 和nodeaffinity就可以了,为啥需要"污点"机制?

    作者回复: 所以你就得在daemonset controller里写调度了

    2018-10-29
    2
  • 无名氏
    假设有这么一种场景,业务Pod需要在每个Node上有且只有1个,在灰度升级时,按10%,30%,50%,100%批量升级,后续某个版本再次升级时,这种升级策略可能会变更,比如10%,70%,100%,请问怎么处理,谢谢。
    2019-03-01
    1
  • 虎虎❤️
    一直不理解notation和label的区别,他们的设计思想是什么呢?加污点是前者还是后者?

    作者回复: 系统用的和用户用的。taint是spec的一个字段

    2018-10-10
    1
  • Tao
    DaemonSet如何保证每个node上只运行一个pod。
    我理解Nodeaffinity保证了daemonSet指定运行在哪些node上,Toleration保证了指定的Node上都可以运行pod;
    但是没有看到那个地方限制了DaemonSet保证在node上只允许一个pod。
    2019-11-30
  • 憶海拾貝
    > 到目前为止,DS只有一种策略就是先删除再创建 OnDelete.
    我查k8s的ds源码以及k8s的ds文档,都有提到RollingUpdate.
    所以特别好奇张sir评论中的这条回复, ds不使用RollingUpdate策略更新, 是因为RollingUpdate坑比较多,所以实践中推荐使用OnDelete?
    2019-09-22
  • 紫夜
    张老师,我想请教个问题,daemonset使用滚动更新策略,如果update时只是变更了nodeaffinity,template中其他字段保持不变,控制器是如何处理的?比如我在nodeaffinity中新增了一个node,是只在新增的node上部署一个pod,其它pod保持不变,还是所有节点上的pod都会更新?
    2019-09-07
  • 张老师,您好 Daemonset既然出现的时机比kubernetes集群设置都要早,那为什么还能调用apiserver组件?
    2019-08-21
  • 冷风
    老师请教一个问题,是否可以对daemonset启动的每个pod设置不同的hostname? 感谢回答!
    2019-08-09
  • beenchaos
    请问老师,在一个集群上部署一类daemonset类型的服务,能否进行灰度发布呢?
    2019-05-10
  • ichiro
    老师,为什么deployment set,不用controllerrevison来作为版本管理么?
    2019-03-21
  • bluefantasy1
    请教老师一个问题:如果直接在一台物理机上部署各个pod,肯定不需要安装网络插件和存储插件了吧?
    2019-03-16
  • abc
    张老师,DS的滚动升级是先创建新的再删除旧的吗?还是说滚动升级有策略可以配置。该如何配置?
    2018-12-06
  • Terry Hu
    发现一个好像是bug,我在set image 的时候,k8s.gcr.io/fluentd-elasticsearch的v2.1.0版本即使我加了--record,在rollout history里面也显示v2.2.0,不知道是为啥。。
    2018-11-29
收起评论
26
返回
顶部