深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116705 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

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

Pod模板
控制器模式
spec.revisionHistoryLimit
kubectl rollout resume
kubectl rollout pause
kubectl rollout history
kubectl rollout undo
kubectl set image
kubectl describe deployment
kubectl rollout status
kubectl get deployments
kubectl create -f
kubectl scale
ReplicaSet
版本控制
滚动更新
Pod的“水平扩展/收缩”
Deployment
A/B测试
蓝绿发布
金丝雀发布
控制器模式
应用发布模式
Kubernetes项目
经典PaaS的记忆
经典PaaS的记忆:作业副本与水平扩展

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:经典 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Kubernetes中Deployment的控制器模式及实现方法。Deployment实现了Pod的“水平扩展/收缩”和“滚动更新”功能,依赖于ReplicaSet对象的管理。文章通过实例分析了“滚动更新”过程,展示了Deployment Controller的操作和Pod版本升级的流程。同时,介绍了Deployment对应用进行版本控制的具体原理,包括如何回滚到指定版本以及控制“历史”ReplicaSet的数量。此外,还介绍了如何通过kubectl指令实现“水平扩展/收缩”和“滚动更新”,以及如何控制多次更新操作只生成一个ReplicaSet。文章还提到了金丝雀发布、蓝绿发布等应用发布模式,以及对有状态应用的管理。整体而言,本文对于想要深入了解PaaS设计思想和Kubernetes编排能力的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(76)

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

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

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

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

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

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

    2018-12-22
    35
    45
  • Pixar
    关于Pod的状态一直有一些疑问, 学完这节课就更混了, 囧. 还望老师能解答下. `kubectl get deployments` 得到的 available 字段表示的是处于Running状态且健康检查通过的Pod, 这里有一个疑问: 健康检查不是针对Pod里面的Container吗? 如果某一个Pod里面包含多个Container, 但是这些Container健康检查有些并没有通过, 那么此时该Pod会出现在 available里面吗? Pod通过健康检查是指里面所有的Container都通过吗?

    作者回复: 都通过

    2018-10-07
    30
  • bus801
    如果我直接edit rs,将image修改成新的版本,是不是也能实现pod中容器镜像的更新?我试了一下,什么反应也没有。既然rs控制pod,为什么这样改不能生效呢?还请指教一下

    作者回复: 因为rs controller 不处理rollout逻辑

    2020-02-19
    3
    24
  • 阿文
    注意,在这里,我额外加了一个–record 参数。它的作用,... 这个应该要解释下--record 是只记录当前命令,老师,你下面的命令没有加。history 里面只看到 kubectl create --filename=nginx-deployment.yaml --record=true

    作者回复: 对

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

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

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

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

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

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

    2018-10-01
    14
  • Tigerfive
    半夜从火车上醒来,就来看看有没有更新,果然没有让我失望!

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

    2018-10-01
    10
收起评论
显示
设置
留言
76
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部