Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

18|Deployment:让应用永不宕机

你好,我是 Chrono。
在上一节课里,我们使用 kubeadm 搭建了一个由两个节点组成的小型 Kubernetes 集群,比起单机的 minikube,它更接近真实环境,在这里面做实验我们今后也更容易过渡到生产系统。
有了这个 Kubernetes 环境,接下来我们就在“初级篇”里学习的 Pod 知识基础上,深入研究一些由 Pod 衍生出来的其他 API 对象。
今天要看的 API 对象名字叫“Deployment”,顾名思义,它是专门用来部署应用程序的,能够让应用永不宕机,多用来发布无状态的应用,是 Kubernetes 里最常用也是最有用的一个对象。

为什么要有 Deployment

第 13 讲里,我们学习了 API 对象 Job 和 CronJob,它们代表了生产环境中的离线业务,通过对 Pod 的包装,向 Pod 添加控制字段,实现了基于 Pod 运行临时任务和定时任务的功能。
那么,除了“离线业务”,另一大类业务——也就是“在线业务”,在 Kubernetes 里应该如何处理呢?
我们先看看用 Pod 是否就足够了。因为它在 YAML 里使用“containers”就可以任意编排容器,而且还有一个“restartPolicy”字段,默认值就是 Always,可以监控 Pod 里容器的状态,一旦发生异常,就会自动重启容器。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中的Deployment对象是部署应用程序的重要API对象,能够实现应用的永不宕机。本文首先介绍了为什么需要Deployment,指出了使用Pod管理在线业务的局限性,以及Deployment作为解决方案的优势。文章详细介绍了如何使用YAML描述Deployment,包括创建Deployment的样板和关键字段的含义。重点解释了Deployment的关键字段`replicas`和`selector`,以及它们在实现多实例、高可用等功能中的作用。通过图示和比较说明了Deployment与被它管理的Pod的组合关系。文章还介绍了如何使用kubectl操作Deployment,以及如何实现应用的扩容和缩容。总的来说,本文通过清晰的解释和示例,帮助读者快速了解了Deployment对象的重要性和使用方法。 Deployment不仅能够保证应用永远在线,还支持滚动更新、版本回退、自动伸缩等高级功能。读者在学习了Deployment这个API对象后,应该不再使用“裸Pod”,即使只运行一个Pod,也要以Deployment的方式来创建它,因为Deployment会保证应用永远在线。此外,Deployment还有一些高级功能,如滚动更新、版本回退、自动伸缩等,这些在“高级篇”里可以进一步学习。

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

全部留言(28)

  • 最新
  • 精选
  • 郑小鹿
    问题回答 1、如果把 Deployment 里的 replicas 字段设置成 0 会有什么效果?有什么意义呢? 做了下实验,效果如下: $ kubectl get po -n nginx-deploy No resources found in default namespace. $ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/0 0 0 意义:关闭服务的同时,又可以保留服务的配置,下次想要重新部署的时候只需要修改deployment就可以快速上线。 2、你觉得 Deployment 能够应用在哪些场景里?有没有什么缺点或者不足呢? 使用场景:用在部署无状态服务,部署升级,对服务的扩缩容;多个Deployment 可以实现金丝雀发布 不足:Deployment把所有pod都认为是一样的服务,前后没有顺序,没有依赖关系,同时认为所有部署节点也是一样的,不会做特殊处理等 疑问:Deployment变更副本数时,是先删除pod,然后再重建pod,如果服务启停时间比较长,会出现什么问题不?

    作者回复: 回答的很好。 这个其实是后面要讲的滚动更新,Deployment会保证任何时候都会有足够数量的pod处于可用状态,保证应用正常对外提供服务。

    2022-08-01归属地:北京
    6
    34
  • 岁月长
    回答问题1: 之前在公司的时候,有时候会把服务下线,这个时候就会把 replicas 字段改为 0,观察一段时间没问题后在把配置删除,如果有报错也方便马上恢复

    作者回复: great。

    2022-09-15归属地:北京
    29
  • YueShi
    懂后恍然大悟,不懂时举步维艰,学习的快乐大抵如此

    作者回复: nice

    2022-08-02归属地:北京
    25
  • dst
    回答一下问题2,deploy是只能用在应用是无状态的场景下,对于有状态的应用它就无能为力了,需要使用其他的api

    作者回复: good

    2022-08-01归属地:北京
    2
    8
  • 朱雯
    老师,我想线创建一个pod,然后直接使用ngx-aadep来管理老的pod,这样的方式不行吗,你课程里说,pod不属于deployment。那我就单独创建,但是显示我语法错误。 cat ngx-aadep.yaml kind: Deployment metadata: creationTimestamp: null labels: app: ngx-aa name: ngx-aa spec: replicas: 1 selector: matchLabels: app: ngx-aa cat ngx-aapod.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: ngx-aa app: ngx-aa name: ngx-aa spec: containers: - image: nginx:alpine name: ngx-aa

    作者回复: Pod是由Deployment模板创建出来的,它受Deployment管控,单独创建Pod无法纳入Deployment的管理,因为Kubernetes就是这么规定的运行机制。 “pod不属于deployment”这个说法可能带来了一些误解,这个实际上是相对于Job来说的,不是强绑定关系。

    2022-08-02归属地:北京
    2
    7
  • nc_ops
    对这句话有个疑问,“kubectl scale 是命令式操作,扩容和缩容只是临时的措施,如果应用需要长时间保持一个确定的 Pod 数量,最好还是编辑 Deployment 的 YAML 文件” 我刚实验通过kubectl scale去扩容pod数量,然后通过kubectl delete去删除一个pod,立马又会新生成一个pod,所以通过kubectl scale也是能保持一个确定的pod数量的吧?通过yaml文件去改变副本的好处准确来说应该是让整个生产环境里只有一份配置的描述,避免当kubectl scale执行后,实际deployment规格与yaml文件里不一致,避免让运维引发混淆

    作者回复: 是的,就是这个意思。kubectl scale使用后会让Deployment的状态和YAML 不一致,所以说是临时的。

    2022-09-28归属地:北京
    5
  • 摊牌
    我有个疑惑,如果像部署redis, etcd等集群模式,比如3个pod, 对应的集群里应该会有个master,像这种有状态的服务,如果采用deployment模式部署会有影响吗,还是单独部署3个pod, 望大家指点

    作者回复: 不能用Deployment,应该用StatefulSet,高级篇会讲。

    2022-08-18归属地:上海
    4
  • 朱雯
    1. 设置为0,就是pod没了,deployment还有,看同学们回答是保留配置,这个不错。 2. 管理无状态服务,什么叫有状态,什么叫无状态,我不太理解。 另外,我刚刚突发奇想,deployment只留一个头加上select配置,然后里面的pod对象单独取出来,建立一个文件,pod可以建立,但是deloyment无法建立,但是提示我是语法错误,其实我不太理解。既然这两服务是独立了,我为啥不能这么做呢

    作者回复: 后面讲StatefulSet的时候就可以理解了。 Pod YAML 只能创建一个对象,而Deployment里的pod定义是一个“模板”,可以创建出任意多个对象。而且Kubernetes就是规定要这么使用Deployment,不这样做当然就报错了。

    2022-08-02归属地:北京
    4
  • 一只鱼
    按照文章中的说法,一层一层嵌套:deployment 管理 pod , pod 管理 containers 那谁来管理 deployment 呢,如果 deployment 出错了怎么办?

    作者回复: deployment由kubernetes来管理,也就是控制面里的controller。

    2023-07-11归属地:广东
    3
  • 郑小鹿
    「 下属字段“matchLabels”定义了 Pod 对象应该携带的 label,它必须和“template”里 Pod 定义的“labels”完全相同 」 老师这个应该是指某个标签的内容完全一样吧。selector.matchLabels”是“template.matadata”中“labels”的子集。

    作者回复: 是完全一样,不是子集,可以自己改一下试试。

    2022-08-01归属地:北京
    3
    3
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部