我们在进行Openshift学习的过程中,经常会被一个问题混淆困扰,就是Openshift提供了一个叫Deployment Config的对象,那它与Kubernetes定义的对象 Deployment有什么区别,为什么有了Deployment了,我们还需要Deployment Config这个对象呢?
Kubernetes 的Deployment 是一个重要的对象,是Kubernetes v1.2后引入的概念,我们可以简单理解为我们可以在Deployment 中定义应用部署,以及应用部署后正常应该处于的目标状态,如在Deployment 的配置yaml文件里定义要部署应用对应的容器镜像Image,在spec.replicas上定义对应的运行Pod数,等等。我们只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮我们把将 Pod 和ReplicaSet 的实际状态改变到我们想要的目标状态。
而实际上,照上述所属,Deployment 是K8S在V1.2才引入的,而Deployment configurations其实早在Deployment 被引入K8S之前,已经在Openshift 中存在。所以一定程度上可以这么理解:由于实际部署管理需要,红帽的Openshift先实现了Deployment configurations,此后,K8S也意识到这方面的能力需要,所以也增加了Deployment 这个对象;由于红帽在K8S社区的影响力和领导力,K8S的Deployment 很大程度参照了Openshift的Deployment configurations,这也和K8S的许多版本规范定义类似,红帽Openshift的许多实践,最后慢慢成了Kubernetes 社区的标准,这也是一种典型的影响社区、反哺社区体现。
从目前来看,Openshift的Deployment configurations和K8S的Deployment 功能类似,但也有部分区别,Deployment configurations在Automatic Rollbacks、Triggers、生命周期钩子(Lifecycle Hook)以及其它部分有一些特性功能,而Deployment 在Rollover、Proportional Scaling、 Pausing Mid-rollout等方面也有一些特性功能。
从长远来看,我们希望未来只有一个部署对象,能在K8S 的Deployment里定义更丰富的能力,包括实现收纳更多的Openshift的Deployment configurations的能力定义;当然,当前Openshift平台对K8S的Deployment和Deployment configurations部署都能支持,而在使用策略上,除非我们需要Deployment configurations提供的特定功能或行为,否则建议使用Deployments。
参考文档:
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/