Concepts - Workload Management - statefulsets
如果在前面的 deployment 應該會發現
pod name 會有一串 random id
statefulset 則是會讓 pod 有固定名稱(固定的 hostname)
通常來說 deployment 如果有 mount volume, 會是所有 replica mount 同一 volume
statefulset 則是能讓每個 pod mount 各自的 volume
after restart 也是 mount 固定 volume
因此可以達成 ‘stateful’
statefulset 適用在以下需求
- Stable, unique network identifiers.
- Stable, persistent storage.
- Ordered, graceful deployment and scaling.
- Ordered, automated rolling updates.
Limitations
- volume 一定要使用 PersistentVolume Provisioner 去建立 volume, 或者 pre-provisioned volume
- 刪除 or scaleing in 不會刪除 volume, 藉此確保 volume safety
- statefule 如果需要 Headless Service(之後再說明), 你需要自己建立
- k8s 不負責 gracelful shutdown, 因此在 stop workloading 應該要自己注意步驟
manifest sample
|
|
以下是這些新參數的解釋:
minReadySeconds
是一個 Pod 規格中的欄位,定義了 Pod 在被標記為「可用 (available)」之前,必須保持「就緒 (ready)」狀態的最小秒數。
- 目的:這對於確保新啟動的 Pod 在接收流量之前,有足夠的時間進行初始化和預熱非常有用。例如,一個應用程式可能需要幾秒鐘來載入配置、建立資料庫連線或執行初始設定,即使其容器已經啟動並通過了就緒探針 (readiness probe)。
terminationGracePeriodSeconds
定義了 Pod 在被強制終止之前,給予 graceful shutdown的時間
- 目的:當 Pod 被刪除或需要重新排程時(例如,由於節點故障或資源重新分配),Kubernetes 會先向 Pod 中的容器發送
SIGTERM
訊號。這個訊號通知應用程式它即將被終止,應用程式應該開始清理工作,例如關閉現有連線、保存狀態或完成正在進行的請求。 - 流程:
- Kubernetes 向 Pod 發送
SIGTERM
。 - Pod 中的應用程式有
terminationGracePeriodSeconds
所定義的時間來執行清理。 - 如果在寬限期結束時應用程式仍未終止,Kubernetes 會發送
SIGKILL
訊號,強制終止所有剩餘的程序。
- Kubernetes 向 Pod 發送
- 重要性:對於有狀態應用程式尤其重要,因為它確保應用程式在關閉前能妥善處理資料和狀態,避免資料損壞或遺失。
volumeClaimTemplates
是 StatefulSet 特有的功能,用於為 StatefulSet 中的每個 Pod 自動創建一個 PersistentVolumeClaim (PVC)
, PVC 之後會再說明 。
- 目的:StatefulSet 中的每個 Pod 都需要一個獨立且穩定的儲存空間。
volumeClaimTemplates
允許您定義一個 PVC 的模板,StatefulSet 控制器會根據這個模板為每個副本 Pod 自動創建一個 PVC。 - 特性:
- 穩定性:每個 Pod 都有其專屬的 PVC,即使 Pod 被重新排程或刪除,其對應的 PVC 和底層的 PersistentVolume (PV) 仍然存在,確保資料的持久性(can change)。
- 命名約定:創建的 PVC 會遵循特定的命名約定(例如
$(claimName)-$(podName)
),這使得管理和識別每個 Pod 的儲存變得容易。 - 自動創建與刪除:當 StatefulSet 擴展時,新的 PVC 會自動創建;當 Pod 被縮減時,對應的 PVC 不會自動刪除,這需要手動清理以防止資料意外丟失。
volumeMounts
是容器規格中的一個欄位,用於將 Pod 中定義的 Volume
掛載到容器的指定路徑。
- 目的:它定義了容器內部檔案系統中,Volume 應該被掛載的位置。這使得容器內的應用程式可以讀取或寫入該 Volume 中的資料。
- 與 volumeClaimTemplates 的關係:當使用
volumeClaimTemplates
時,每個 Pod 會自動獲得一個 PVC。這個 PVC 會綁定到一個 PV,而這個 PV 最終會作為一個 Volume 被掛載到 Pod 中。volumeMounts
則指定了這個 Volume 在容器內部可訪問的路徑。 - 重要屬性:
name
:必須與 Pod 中定義的 Volume 名稱匹配。mountPath
:Volume 在容器內部被掛載的路徑。
定外 statefulset 不會建立 ReplicaSet
pod replica 是由 statefulset 直接管理
Deployment and Scaling Guarantees
create pod 時 pod id 一定是按造順序 {0..N-1}
rolling restart 時 一定是按造順序 {0..N-1}
scale-in 時 pod id 一定是按造順序 {N-1..0}
如有需要可以設定
.spec.ordinals.start
來改變起始 id
再做任何 scaling operation 時, 必須先等全部為 Running and Ready 才能開始動作
剩下大部分設定都與 deployment 相同
因此兩者使用上只要根據需求選擇
學習上應該不太困難