Concepts - Workload Management - statefulsets

Concepts - Workload Management - statefulsets

alt

doc link

如果在前面的 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  minReadySeconds: 10 # by default is 0
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.24
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

以下是這些新參數的解釋:

minReadySeconds
是一個 Pod 規格中的欄位,定義了 Pod 在被標記為「可用 (available)」之前,必須保持「就緒 (ready)」狀態的最小秒數。

  • 目的:這對於確保新啟動的 Pod 在接收流量之前,有足夠的時間進行初始化和預熱非常有用。例如,一個應用程式可能需要幾秒鐘來載入配置、建立資料庫連線或執行初始設定,即使其容器已經啟動並通過了就緒探針 (readiness probe)。

terminationGracePeriodSeconds
定義了 Pod 在被強制終止之前,給予 graceful shutdown的時間

  • 目的:當 Pod 被刪除或需要重新排程時(例如,由於節點故障或資源重新分配),Kubernetes 會先向 Pod 中的容器發送 SIGTERM 訊號。這個訊號通知應用程式它即將被終止,應用程式應該開始清理工作,例如關閉現有連線、保存狀態或完成正在進行的請求。
  • 流程
    1. Kubernetes 向 Pod 發送 SIGTERM
    2. Pod 中的應用程式有 terminationGracePeriodSeconds 所定義的時間來執行清理。
    3. 如果在寬限期結束時應用程式仍未終止,Kubernetes 會發送 SIGKILL 訊號,強制終止所有剩餘的程序。
  • 重要性:對於有狀態應用程式尤其重要,因為它確保應用程式在關閉前能妥善處理資料和狀態,避免資料損壞或遺失。

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 相同
因此兩者使用上只要根據需求選擇
學習上應該不太困難

Last updated on