我感覺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呢


推薦閱讀:
相关文章