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

17 | 经典PaaS的记忆:作业副本与水平扩展

张磊 2018-10-01
你好,我是张磊。今天我和你分享的主题是:经典 PaaS 的记忆之作业副本与水平扩展。
在上一篇文章中,我为你详细介绍了 Kubernetes 项目中第一个重要的设计思想:控制器模式。
而在今天这篇文章中,我就来为你详细讲解一下,Kubernetes 里第一个控制器模式的完整实现:Deployment。
Deployment 看似简单,但实际上,它实现了 Kubernetes 项目中一个非常重要的功能:Pod 的“水平扩展 / 收缩”(horizontal scaling out/in)。这个功能,是从 PaaS 时代开始,一个平台级项目就必须具备的编排能力。
举个例子,如果你更新了 Deployment 的 Pod 模板(比如,修改了容器的镜像),那么 Deployment 就需要遵循一种叫作“滚动更新”(rolling update)的方式,来升级现有的容器。
而这个能力的实现,依赖的是 Kubernetes 项目中的一个非常重要的概念(API 对象):ReplicaSet。
ReplicaSet 的结构非常简单,我们可以通过这个 YAML 文件查看一下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
从这个 YAML 文件中,我们可以看到,一个 ReplicaSet 对象,其实就是由副本数目的定义和一个 Pod 模板组成的。不难发现,它的定义其实是 Deployment 的一个子集。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(40)

  • 小龙
    老师真的是厉害,我在极客时间买了17门课了,这个是含金量最高的一门

    作者回复: 17门,你也厉害!

    2018-10-01
    1
    54
  • 胖宝王
    金丝雀部署:优先发布一台或少量机器升级,等验证无误后再更新其他机器。优点是用户影响范围小,不足之处是要额外控制如何做自动更新。
    蓝绿部署:2组机器,蓝代表当前的V1版本,绿代表已经升级完成的V2版本。通过LB将流量全部导入V2完成升级部署。优点是切换快速,缺点是影响全部用户。
    本文学习的滚动更新,我觉得就是一个自动化更新的金丝雀发布。

    作者回复: 说的没错,可以看看文末的例子实践一下

    2018-10-01
    32
  • 黑米
    老师真的是厉害,我在极客时间买了24门课了,这个是含金量第二高的一门

    作者回复: 不是第一高不开心

    2018-12-22
    4
    8
  • 胖宝王
    金丝雀发布:先发布一台机器或少量机器,做流量验证。如果新版没问题在把剩余机器全部更新。优点是影响范围小,不足的是要自己想办法如何控制自动更新。
    蓝绿部署:事先准备好一组机器(绿组)全部更新,然后调整LB将流量全部引到绿组。优点是切换快捷回滚方便。不足的是有问题则影响全部用户。
    对于本文学习的 rolling update,我理解的像是自动化更新的金丝雀发布。
    2018-10-01
    8
  • 蜗牛
    关于Pod的状态一直有一些疑问, 学完这节课就更混了, 囧. 还望老师能解答下.

    `kubectl get deployments` 得到的 available 字段表示的是处于Running状态且健康检查通过的Pod, 这里有一个疑问: 健康检查不是针对Pod里面的Container吗? 如果某一个Pod里面包含多个Container, 但是这些Container健康检查有些并没有通过, 那么此时该Pod会出现在 available里面吗?

    Pod通过健康检查是指里面所有的Container都通过吗?

    作者回复: 都通过

    2018-10-07
    7
  • 原来只是梦
    老师你好!之前有同学提到这个rollout像自动化的金丝雀发布,对于这一点我不太理解。发布的时候会是一个轮换的过程,也就是说用不了多少时间,就会都运行在新的rs,或者都回滚到老的rs(出错)。我的理解要金丝雀的话,需要保持同时存在两个rs一定时间,以确保新版本没问题。那么这个在k8s里是怎么实现呢?
    2018-12-16
    1
    5
  • Tigerfive
    半夜从火车上醒来,就来看看有没有更新,果然没有让我失望!

    作者回复: 国庆可以充电啦

    2018-10-01
    5
  • 千寻
    在滚动更新的过程中,Service的流量转发会有怎样的变化呢?

    作者回复: service只会代理readiness检查返回正确的pod

    2018-10-01
    4
  • 黑米
    不用不高兴,你第二没人敢认第一👍
    2018-12-23
    3
  • Nokiak8
    Cronjob 类型也有spec.revisionHistoryLimit么?

    作者回复: successfulJobsHistoryLimit和failedJobsHistoryLimit

    2018-10-12
    3
  • 阿文
    注意,在这里,我额外加了一个–record 参数。它的作用,...

    这个应该要解释下--record 是只记录当前命令,老师,你下面的命令没有加。history 里面只看到
       kubectl create --filename=nginx-deployment.yaml --record=true

    作者回复: 对

    2019-08-16
    2
  • 王由华
    有个问题,scale down时,k8s是对pod里的容器发送kill 信号吗?所以应用需要处理好这个信号?

    作者回复: 先term 再kill。需要处理。

    2018-12-17
    1
    2
  • 一棵树
    请教个问题,如果水平收缩的过程中,某个pod中的容器有正在运行的业务,而业务如果中断的话可能会导致数据库数据出错,该怎么办?如何保证把pod的业务执行完再收缩?

    作者回复: 业务需要优雅处理sig term

    2018-11-04
    2
  • DI-陈赜(ze)
    revisionHistoryLimit默认是10个版本
    2019-08-15
    1
  • 哈希碰撞
    一个 ReplicaSet 对象,不难发现是 Deployment 的一个子集?
    请问怎么不难发现? 我觉得很难发现。。。从示例的YAML文件内容上看,看不出任何关连。
    2019-08-08
    1
    1
  • Sir
    老师您好,我们有一个集群,滚动升级,遇到新的deploy已经健康了,老的deploy一直还在,持续很久!不知道老师遇到过嘛~
    2018-12-19
    1
  • Yao1931
    知识点好多的一节课!!老师写的都很透彻!
    2018-11-02
    1
  • 小小笑儿
    有几个问题想请问一下:
    1是在 deployment rollout undo 的时候,是也会创建一个新的rs对象吗?如果是的话那么这个rs的template hash不就重复了?如果不是得话又是如何处理的呢?
    2是deployment 关注的应该是自身的api对象和rs的api对象,但是我看deployment controller 的源码中也关注了pod的变更,这是为了处理哪种情况?

    作者回复: 回滚又不是创建新版本,版本与rs一一对应,怎么会出现新的rs呢?滚动升级反向操作即可。

    它只关心pod被全删除的情况,因为有一种滚动更新策略是这时候重新创建新的deployment

    2018-10-01
    1
  • 阿鹏
    老师,我们公司准备试水k8s,我看网上很多文章都在说跨主机容器间通信的解决方案,如果我们的服务分批容器化,需要解决宿主机网络和容器网络的互通,我用flannel或者calico目前都只能做到宿主机能访问容器网络或者容器能访问宿主机网络,不能做到双向通讯,老师能指点一下吗?

    作者回复: 为什么是 或者?宿主机和容器网络互通是基本假设。

    2018-10-01
    1
  • 虎虎❤️
    滚动升级指定比例的pod处于离线或新建,这个desired 值25%怎么算的呢?分子和分母各是什么?
    国庆有时间充电,多来点内容呀!加油!

    作者回复: 就是desired * 0.25

    2018-10-01
    1
收起评论
40
返回
顶部