kubernetes進階之六:StatefulSet & DaemonSet


StatefulSet(有狀態):

  StatefulSet適合持久性的應用程序,有唯一的網絡標識符(IP),持久存儲,有序的部署,拓展,刪除和滾動更新.

  在Kubernetes系統中,Pod的管理對象RC、Deployment、DaemonSet和Job都是面向無狀態的服務。但現實中有很多服務是有狀態的,

  特別是一些復雜的中間件集群, 例如MySQL集群、MongoDB集群、Kafka集群、Zookeeper集群等,這些應用集群有以下一些共同點。

  • 每個節點都有固定的身份ID,通過這個ID,集群中的成員可以相互發現並且通信。
  • 集群的規模是比較固定的,集群規模不能隨意變動。
  • 集群里的每個節點都是有狀態的,通常會持久化數據到永久存儲中。
  • 如果磁盤損壞,則集群里的某個節點無法正常運行,集群功能受損。

  如果用RC/Deployment控制Pod副本數的方式來實現上述有狀態的集群,則我們會發現第一點是無法滿足的,因為Pod的名字是隨機產生的,

  Pod的IP地址也是在運行期才確定且可能有變動的,我們事先無法為每個Pod確定唯一不變的ID,為了能夠在其他節點上恢復某個失敗的節點,

  這種集群中的Pod需要掛接某種共享存儲,為了解決這個問題,Kubernetes從v1.4版本開始引入了PetSet這個新的資源對象,

  並且在v1.5版本時更名為StatefulSet,StatefulSet從本質上來說,可以看作Deployment/RC的一個特殊變種,它有如下一些特性。

  • StatefulSet里的每個Pod都有穩定、唯一的網絡標識,可以用來發現集群內的其他成員。假設StatefulSet的名字叫kafka,那么第一個Pod叫kafak-0,第二個Pod叫kafak-1,以此類推。

  • StatefulSet控制的Pod副本的啟停順序是受控的,操作第n個Pod時,前n-1個Pod已經時運行且准備好的狀態。

  • StatefulSet里的Pod采用穩定的持久化存儲卷,通過PV/PVC來實現,刪除Pod時默認不會刪除與StatefulSet相關的存儲卷(為了保證數據的安全)。

  StatefulSet除了要與PV卷捆綁使用以存儲Pod的狀態數據,還要與Headless Service配合使用,即在每個StatefulSet的定義中要聲明它屬於哪個Headless Service。

  Headless Service與普通Service的關鍵區別在於,它沒有Cluster IP,如果解析Headless Service的DNS域名,則返回的是該Service對應的全部Pod的Endpoint列表。

  StatefulSet在Headless Service的基礎上又為StatefulSet控制的每個Pod實例創建了一個DNS域名,這個域名的格式為:

 $(podname).$(headless service name) 

  比如一個3節點的Kafka的StatefulSet集群,對應的Headless Service的名字為kafka,StatefulSet的名字為kafka,

  則StatefulSet里面的3個Pod的DNS名稱分別為kafka-0.kafka、kafka-1.kafka、kafka-3.kafka,這些DNS名稱可以直接在集群的配置文件中固定下來。

DaemonSet:

  DaemonSet確保所有(或一些)節點運行同一個pod。當節點加入kubernetes集群中,pod會被調度到該節點上運行,

  當節點從集群中移除時,DaemonSet的Pod會被刪除.刪除DaemonSet會清理它所有創建的Pod.






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM