kubernetes有了deployment,为什么还有pod定义?
我感觉deployment中的template定义基本可以代替pod定义,并且deployment可以一次性定义部署多个pod副本,如果是这样,为什么还需要有pod定义呢?工作时是否可以只用deployment不用pod定义?
deployment可以理解为由两部分组成,其中的template其实就是定义Pod,replicas定义需要的状态,Deployment Controller保证pod数量等一直满足需要的状态。
Pod是k8s的最小调度单位,一个Pod中可以有多个containers,彼此共享网路等,这是k8s的核心概念。Deployment,StatefulSet是Controller,保证Pod一直运行在你需要的状态。
就好像java中有了Integer类,它的功能要比int强大多了,但为什么还要有最基本的int类型?而且编写java程序的时候,基础类型反而是大量被应用,而类似于Integer等包装类在应用程度上要远远弱于基础类型。
其实道理很简单,就好像生活中既然有了大炮,为什么还要有苍蝇拍在世界上?大炮的破坏力完全可以满足苍蝇拍所制造的威力,但是为什么大家都买苍蝇拍打苍蝇而不买大炮呢?
Pod是k8s资源中最基础的单位,其他资源基本上都是围绕著Pod而展开,比如RC或者RS,这两种资源可以控制Pod的副本数,所以它们就比Pod高级一点,在定义它们的时候和Deployment一样,需要在template中定义Pod中的容器等内容,而Deployment是比RC或者RS更高级的一种资源,它不但可以控制Pod的副本数,同时还可以控制Pod的版本,所以这么高级的资源并不是时时刻刻都需要的,比如你就想暂时性的部署一个小程序,用完就不要了,那么你就没有必要使用RS或者RC,更没有必要去用Deploment。
中国有句俗话,叫杀鸡焉用牛刀,就是这个道理。
从开发者角度看,deployment顾明思意,既部署,对于完整的应用部署流程,除了运行代码(既pod)之外,需要考虑更新策略,副本数量,回滚,重启等步骤,而运行代码的方式有很多种,例如有一次性的也就是job,有定时执行的也就是crontabjob,有排号的也就是sts,为了复用运行代码的功能所以抽象为pod,从而进行复用。从用户角度看,我们操作时也会根据不同的代码副本进行查看,例如日志,资源占用都是实例级别的也需要这么一个抽象
日常使用 很少直接用pod
一半就 deployment ds ss 够用了。
pod 虽然是 k8s 的最小调度单元,但 pod 下还可以有多个 container
pod的类型分为两部分:
- 自主式pod,即直接编写yaml定义pod资源
- 控制器所控制的pod,通过Deployments,StatefulSets,Jobs等控制器控制
自主式pod不具备弹性扩容,故障恢复等高级的特性,而需要通过上层封装如Deployment控制器来实现,而控制器按照功能有多种,两者之间是嵌套调用的关系,不能替代,原因如下:
- kubernetes调度的最小调度单元是pod
- pod以template的形式被其他控制器所引用
- 拆分后,单个pod副本异常时不会影响整体业务欢迎大家订阅我的专栏,一起交流k8s,云原生技术,
云计算技术专栏的全部内容 - 云+社区 - 腾讯云?cloud.tencent.com
先有的pod再有的deployment呀,不能先吃第4个馒头
depkoyment也是调用pod来实现高级需求,但是pod就在那里你可以不用但是deployment statusful daemonsey 都要用,但是也没必要关掉万一你有奇葩需求需要自己调度pof呢
推荐阅读: