18|Deployment:让应用永不宕机
为什么要有 Deployment
- 深入了解
- 翻译
- 解释
- 总结
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归属地:北京634 - 岁月长回答问题1: 之前在公司的时候,有时候会把服务下线,这个时候就会把 replicas 字段改为 0,观察一段时间没问题后在把配置删除,如果有报错也方便马上恢复
作者回复: great。
2022-09-15归属地:北京29 - YueShi懂后恍然大悟,不懂时举步维艰,学习的快乐大抵如此
作者回复: nice
2022-08-02归属地:北京25 - dst回答一下问题2,deploy是只能用在应用是无状态的场景下,对于有状态的应用它就无能为力了,需要使用其他的api
作者回复: good
2022-08-01归属地:北京28 - 朱雯老师,我想线创建一个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归属地:北京27 - 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归属地:北京33