K8S實戰(五)| 控制器 StatefulSet 的原理

前言

Deployment 中能夠隨意的關閉和啓動一個 Pod,Pod 之間的關係是平等的。html

當 Pod 之間有主從關係,以及每一個 Pod 對應特定的存儲卷中的內容時,沒法使用 Deployment 控制器來隨意的操做 Pod。linux

咱們須要使用一個叫作 StatefulSet 的控制器來處理這種有狀態應用 Pod。web

更新歷史

StatefulSet 控制器工做原理

管理有狀態應用 Pod 的祕訣是,提供穩定不變的 Pod 標識和穩定不變的存儲。服務器

穩定不變的拓撲狀態,即不變的主機名

  • 該標識和 Pod 是綁定的,無論 Pod 被調度到哪一個節點上
  • StatefulSet 中每一個 Pod 將被分配一個整數序號,從 0 到 N-1,該序號在 StatefulSet 上是惟一的
  • 每一個 Pod 根據 StatefulSet 的名稱和 Pod 的序號派生出它的主機名。組合主機名的格式爲 $(StatefulSet 名稱)-$(序號)
  • StatefulSet 名稱爲 web,replicas 爲 3,那麼將會建立三個名稱分別爲 web-0、web-一、web-2 的 Pod。一旦每一個 Pod 建立成功,就會獲得一個匹配的 DNS 名稱,格式爲:<pod-name>. <service-name>.<namespace>.svc.cluster.local,其中 service-name 由 StatefulSet 的 serviceName 域來設定
  • 而且這些 Pod 的建立,是嚴格按照編號順序進行的。好比,在 web-0 進入到 Running 狀態、而且 Conditions 成爲 Ready 以前,web-1 會一直處於 Pending 狀態
  • 當咱們把這幾個 Pod 刪除以後,Kubernetes 會按照原先編號的順序,建立出新的 Pod。而且,Kubernetes 依然爲它們分配了與原來相同的「網絡身份」
  • 經過這種嚴格的對應規則,StatefulSet 就保證了 Pod 網絡標識的穩定性

穩定不變的存儲

  • 每一個 Pod 都會綁定一個固定編號的 PVC,這些 PVC 的名字都是 <PVC名>-<Pod名>
  • 名叫 web-0 的 Pod,會聲明使用名叫 www-web-0 的 PVC
  • PV/PVC 經過動態卷的方式存儲於遠程存儲服務器
  • 當一個 Pod 被刪除後,對應的 PVC 和 PV 並不會被刪除,數據依然存在於遠程服務器,Pod 被重建後,StatefulSet 會從新查找對應名稱的 PVC 來進行綁定

結束語

StatefulSet 擴展了 Deployment,對 Pod 和對應的存儲卷都進行了固定名稱和編號,無論 Pod 如何處理,這些對應關係都不會有變化,從而將業務邏輯關係以及存儲關係固定了下來,確保了有狀態應用正常運行。微信

聯繫我

微信公衆號:zuolinux_com網絡

微信掃碼關注

相關文章
相關標籤/搜索