深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22531 人已学习
课程目录
已完结 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
登录|注册

16 | 编排其实很简单:谈谈“控制器”模型

张磊 2018-09-28
你好,我是张磊。今天我和你分享的主题是:编排其实很简单之谈谈“控制器”模型。
在上一篇文章中,我和你详细介绍了 Pod 的用法,讲解了 Pod 这个 API 对象的各个字段。而接下来,我们就一起来看看“编排”这个 Kubernetes 项目最核心的功能吧。
实际上,你可能已经有所感悟:Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已。
说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说,还是太过简单了。这就好比,集装箱固然好用,但是如果它四面都光秃秃的,吊车还怎么把这个集装箱吊起来并摆放好呢?
所以,Pod 对象,其实就是容器的升级版。它对容器进行了组合,添加了更多的属性和字段。这就好比给集装箱四面安装了吊环,使得 Kubernetes 这架“吊车”,可以更轻松地操作它。
而 Kubernetes 操作这些“集装箱”的逻辑,都由控制器(Controller)完成。在前面的第 12 篇文章《牛刀小试:我的第一个容器化应用》中,我们曾经使用过 Deployment 这个最基本的控制器对象。
现在,我们一起来回顾一下这个名叫 nginx-deployment 的例子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(25)

  • jasine
    除了上面朋友提到的主动与被动区别,事件往往是一次性的,如果操作失败比较难处理,但是控制器是循环一直在尝试的,更符合kubernetes申明式API,最终达到与申明一致,这样理解对吗

    作者回复: 厉害。这个就说到点子上了。

    2018-09-28
    1
    120
  • uncleli
    相当于select和epoll的区别

    作者回复: 太专业啦

    2018-09-28
    27
  • 小小笑儿
    deployment会创建rs,然后由rs创建pod,所以pod的owner应该是rs?

    作者回复: 明白人。

    2018-09-28
    21
  • 龙坤
    老师,大概可以这样理解吧。一个是主动,一个被动
    “事件驱动”,对于控制器来说是被动,只要触发事件则执行,对执行后不负责,无论成功与否,没有对一次操作的后续进行“监控”
    “控制器模式”,对于控制器来说是主动的,自身在不断地获取信息,起到事后“监控”作用,知道同步完成,实际状态与期望状态一致

    作者回复: 基本正确。

    2018-09-28
    11
  • Dale
    控制器模型是在一个循环中主动收集各个pod的运行状态,预先知道自己要处理哪些模块,然后比较状态来触发对应的操作,有点像有序同步操作。
    事件驱动模型是一个异步回调过程,各个模块向控制器注册好事件方法,当模块自己检测到事件发生了,则将事件添加到控制器处理队列,控制器不关心各个模块状态,只关心队列中是否有事件。
    请指正。
    2018-09-28
    6
  • 包子
    控制器主动获取pod状态,在这个集群中,有那么多pod,某个pod在某一时刻状态有变,怎样及时通知到控制器呢?

    作者回复: informer机制,后面会讲到

    2018-09-28
    5
  • 蜗牛
    有一个疑问没太弄清楚, 比如Deployment, 是我创建一个Deployment 就会生成一个对应的 Deployment-Controller 实例来管理该它 还是整个k8s系统只有一个 Deployement-Controller 来同一管理该系统的所有Deployment呢?

    作者回复: 当然只有一个controller

    2018-10-07
    4
  • chf007
    我可以先写Pod,再写Deployment,不写 template,只靠标签控制 Pod 么?

    K8s只靠标签进行match控制,如果万一写错便签会不会直接调度了以前就存在的Pod,但是 不是我想要操作的 Pod 呢?

    作者回复: 不可以,控制器需要使用模版。的确会有重合的可能。

    2018-10-10
    3
  • 北卡
    对于十一还在上班的我,摸鱼时间看这套教程让我感到了莫大的快乐。
    2018-10-02
    2
  • Vincen
    后面文章会讲watch机制吗?

    作者回复: 会的

    2018-09-28
    2
  • Harvey
    这个区别国外有个专门的术语,level trigered 和 edge trigered 是借用数字电路的术语,控制器使用了level trigered 保证状态的变化最终被执行
    2019-09-04
    1
  • 哈哼
    面向目标的代码好写,不用处理event失败,丢了等问题,因为这些问题很不好处理
    2019-02-21
    1
  • Jeff.W
    唯一的不变就是变化本身,你所看到的稳定不变的状态,都是有人在默默付出的。pod的稳定状态,背后控制器的默默奉献~
    2018-10-15
    1
  • Spark
    老师,我是初学者,这个课程让我获益匪浅,但每次都有很多问题想问但无人解答。请问能不能建一个交流群,大家共同讨论学习。

    作者回复: 极客时间好像马上要上线这个功能

    2018-09-29
    1
  • A-
    我理解:
    事件驱动是被动的:被控制对象要自己去判断是否需要被编排,调度。实时将事件通知给控制器。
    控制器模式是主动的:被控制对象只需要实时同步自己的状态(实际由kubelet做的),具体的判断逻辑由控制去做。
    不对请指正

    作者回复: 基本正确,还可以再深入

    2018-09-28
    1
  • Godruoyi
    控制器循环的伪代码实现

    while (true) {
        $lebels = Etcd.getLebels();
    $pods = k8s.allPods()->filter($lebels)->get();
        $count = count($pods) - Etcd.replicas();

        if ($count > 0) {
            // 删除指定数量的 Pod
            destory($pods, $count)
        } elseif ($count < 0) {
            // 创建指定数量的 Pod
            create($count)
        }
    }
    2019-09-15
  • 牛头人
    ownerReference 应该是metadata下全部的kv吧
    2019-01-24
  • 勇敢的心
    复习一下
    2019-01-08
  • jimmy
    命令式api和声明式api的区别
    2018-10-18
  • 广宇
    控制器的作用是确保对象处在所定义的状态上,这跟很多运维自动化工具中的概念是类似的,确保一致性,不一致的要回归收敛到一致。
    2018-10-06
收起评论
25
返回
顶部