前言
Deployment 中可以隨意的關閉和啟動一個 Pod,Pod 之間的關系是平等的,
當 Pod 之間有主從關系,以及每個 Pod 對應特定的存盤卷中的內容時,無法使用 Deployment 控制器來隨意的操作 Pod,
我們需要使用一個叫做 StatefulSet 的控制器來處理這種有狀態應用 Pod,
更新歷史
- 20200605 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/06/05/about-controller-statefulset.html
StatefulSet 控制器作業原理
管理有狀態應用 Pod 的秘訣是,提供穩定不變的 Pod 標識和穩定不變的存盤,
穩定不變的拓撲狀態,即不變的主機名
-
該標識和 Pod 是系結的,不管 Pod 被調度到哪個節點上
-
StatefulSet 中每個 Pod 將被分配一個整數序號,從 0 到 N-1,該序號在 StatefulSet 上是唯一的
-
每個 Pod 根據 StatefulSet 的名稱和 Pod 的序號派生出它的主機名,組合主機名的格式為 $(StatefulSet 名稱)-$(序號)
-
StatefulSet 名稱為 web,replicas 為 3,那么將會創建三個名稱分別為 web-0、web-1、web-2 的 Pod,一旦每個 Pod 創建成功,就會得到一個匹配的 DNS 名稱,格式為:
. . .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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/180094.html
標籤:其他
