再談 StatefulSet

上一篇提到 StatefulSet 是與 Deployment 不同之處,今日要針對下面兩個特點,特別獨立出此篇來敘述。

  • 穩定的唯一性網路標誌 Stable, unique network identifiers.

  • 穩定的持久化儲存服務 Stable, persistent storage.

StatefulSet Pods 具有一組唯一識別的 ordinal,穩定的網路狀態與儲存服務, 無需在意 pod 是在哪些 K8s node 上運行。

ordinal index

  • 對於有 N replicas 的 StatefulSet,此識別序號必然是唯一性,有其重要性。

  • 每個 StatefulSet Pod 皆賦予一組整數序號,從 0 開始至 N-1。

Stable Network ID

  • 每個 StatefulSet Pod 的 name 作為前綴加上 ordinal,建構出 hostname = $(statefulset name)-$(ordinal)

  • 上一篇 StatefulSet 範例中,將創建出三個名稱是 web 的 Pod,其 hostname = web-0、web-1、web-2

Domain

  • StatefulSet 可以透過 Headless Service 來決定旗下的 Pod Domain。

  • 此 Domain 的格式:$(service name).$(namespace).svc.cluster.local ; 其中 “cluster.local” 是 Cluster Domain。

  • 每個 Pod 建立時,將取得一個 DNS subdomain 格式:

    • $(podname).$(governing service domain) ;

    • 其中 governing service 取之於 StatefulSet yaml 定義中的 serviceName 欄位。

官網解說的,上面敘述的方法使我自己也好複雜,需要心靜的腦筋消化~ 下面有簡單的解說方式~

StatefulSet 中每個 Pod DNS Domain 格式如下:

$(statefulset name)-$(ordinal).$(service name).$(namespace).svc.cluster.local

$(statefulset name) 是 StatefulSet 的名字。
-$(ordinal) 是 StatefulSet Pod 賦予的一組整數序號,從 0 開始至 N-1。
$(service name) 是 Headless Service 的名字。
$(namespace) 是服務所在的 namespace,Headless Service 和 StatefulSet 需在相同的 namespace。
.cluster.local 是 Cluster Domain。

Stable Storage

  • 在K8s StatefulSet 中,透過 VolumeClaimTemplate 所定義的規格建立出 PV。

  • 當相關的 Pod 重新被調度至其他 K8s node 上,則會掛載與 PersistentVolume Claim 關聯的 PV。

  • 需要注意:

    • 依此 PersistentVolume Claim 關聯的 PV 在 Pods or StatefulSet 刪除時,不會刪除 PV 內資料,需要手動移除。

補充說明:什麼是 StorageClass

  • StorageClass 透過 PV 的類別(等級)名稱,來定義 PV 的類別屬性,方便管理者去分門別類儲存屬性,例如 High/Slow IO

  • 建立 StorageClass 時,管理員設置名稱與相關參數,一但建立後不可再對其進行更新。

  • 一個有指定StorageClassName的 PV,只許被相同StorageClassName的 PVC 綁定請求。

  • 一個沒指定StorageClassName的 PV,只有無指定StorageClassName的 PVC 綁定請求。

K8s API server 上的 DefaultStorageClass 是否啟用,攸關到 StorageClass default 的變因。

  • 如啟用,可以設定 default StorageClassName,當 PVC 中沒有設置StorageClassName,則會套用 default StorageClassName。

  • 如啟用,但沒設定 defaultStorageClassName,當 PVC 創建時 K8s 會回應。

  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 如沒啟用,則就沒有 StorageClass 概念;

  • 在此情況,没有storageClassName的 PVC 與 「storageClassName: ""的 PVC 」 的處理方式相同。

Last updated