StatefulSets:在 Kubernetes 上執行有狀態應用程式
Deployment 是無狀態應用程式的預設工作負載控制器 - 您可以自由地向上/向下擴展,因為每個 Pod 都是相同且可互換的。但對於資料庫、訊息代理和分散式系統,每個實例都需要自己的 identity、自己的 storage 以及有意義的啟動/關閉順序。這就是 StatefulSet 存在的原因。
StatefulSet 與部署__HTMLTAG_74___
何時使用部署?
- 無狀態應用程式:Web 伺服器、API 服務、微服務
- 所有 Pod 都可以處理任何請求__HTMLTAG_81___
- 不需要為每個 Pod 單獨的持久儲存
- Pod 可以隨機更換,不影響操作
何時使用 StatefulSet?
- 應用程式需要穩定的網路身分(Pod名稱不變)
- 每個 Pod 都需要自己的持久性儲存(主、副本 1、副本 2)
- 部署、擴充和刪除的重要順序__HTMLTAG_95___
- 基於可預測 DNS 名稱的對等發現
- 用例:PostgreSQL、MySQL 叢集、Redis 叢集、Kafka、Zookeeper、Elasticsearch
視覺比較
程式碼區塊_0
StatefulSet 保證
穩定 Pod 標識
StatefulSet 中的每個 Pod 均根據模式 {statefulset-name}-{ordinal} 命名。序數從 0 開始並逐漸增加。即使 Pod 被删除并重新创建,它仍然会收到相同的标识(postgres-1 始终为 postgres-1).
透過無頭服務實現穩定的網路身分
StatefulSet 需要 Headless Service(ClusterIP:無)為每個 Pod 建立 DNS 項目。使用 Headless Service,DNS 不會指向叢集 IP,而是直接指向 Pod IP。
程式碼區塊_1
使用無頭服務,DNS 記錄依照下列模式建立:
-
___HTMLTAG_122__HTMLTAG_123___postgres-0.postgres.product.svc.cluster.local___HTMLTAG_124__HTMLTAG_125___
___HTMLTAG_126__HTMLTAG_127___postgres-1.postgres.product.svc.cluster.local___HTMLTAG_128__HTMLTAG_129___
___HTMLTAG_130__HTMLTAG_131___postgres-2.postgres.product.svc.cluster.local___HTMLTAG_132__HTMLTAG_133___
這允許 Pod 確定性地找到彼此 — 無需複雜的服務發現。
StatefulSet:PostgreSQL 範例
程式碼區塊_2
程式碼區塊_3
StatefulSet:Redis 叢集範例
程式碼區塊_4
程式碼區塊_5
StatefulSet:帶有 Strimzi 運算子的 Kafka
Strimzi 簡介
使用 StatefulSet 運行純 Kafka 很複雜,因為 Kafka 依賴 Zookeeper(最高版本 3.x)並且具有許多複雜的配置。 Strimzi Operator 是一個專業的 Operator,可協助在 Kubernetes 上部署和管理 Kafka 集群,抽象化複雜性。
程式碼區塊_6
程式碼區塊_7
程式碼區塊_8
更新策略
滾動更新(預設)
程式碼區塊_9
程式碼區塊_10
刪除策略
程式碼區塊_11
程式碼區塊_12
CloudNativePG:PostgreSQL 新標準
為什麼選擇 CloudNativePG?
StatefulSet pure for PostgreSQL 仍然需要大量手動工作:流複製設定、故障轉移、備份管理、監控。 CloudNativePG (CNPG) 是專為 Kubernetes 上的 PostgreSQL 設計的 CNCF 專案(沙盒 2022,孵化 2024)。
程式碼區塊_13
程式碼區塊_14
程式碼區塊_15
何時使用運算子而不是普通 StatefulSet?
StatefulSet 純粹符合時間:
- 應用簡單,不需要像大型資料庫那樣複雜__HTMLTAG_169___
- 您是否有足夠的專業知識來自行管理複製和故障轉移__HTMLTAG_171___
- 需要對部署的各個面向進行最大程度的控制
- 應用程式沒有成熟的運營商__HTMLTAG_175___
運算子適用時間:
- 資料庫/狀態系統複合體:PostgreSQL、MySQL、Kafka、Elasticsearch
- 需要自動故障轉移、備份、復原
- 團隊對特定係統沒有深厚的專業知識
- 希望第 2 天操作自動化(升級、擴充、憑證)
推薦運算子 (2026)
-
___HTMLTAG_192__HTMLTAG_193___PostgreSQL:CloudNativePG(CNCF 孵化)— 生產就緒,積極開發
___HTMLTAG_196__HTMLTAG_197___MySQL:Oracle 或 Percona Operator for MySQL 的 MySQL Operator
___HTMLTAG_200__HTMLTAG_201___Kafka:Strimzi(CNCF 孵化)-成熟、功能豐富
___HTMLTAG_204__HTMLTAG_205___Redis:OpsTree 或 Spotahome Redis Operator 的 Redis 運算子
___HTMLTAG_208__HTMLTAG_209___Elasticsearch/OpenSearch:ECK(Kubernetes 上的彈性雲)或 OpenSearch Operator
___HTMLTAG_212__HTMLTAG_213___MongoDB:MongoDB 社群運營商
摘要__HTMLTAG_218___
StatefulSet 是 Kubernetes 中有狀態工作負載的重要工具,但了解何時使用純 StatefulSet 以及何時使用 Operator 非常重要:
-
___HTMLTAG_222__HTMLTAG_223___StatefulSet 確保每個 Pod 的穩定身分、有序操作和持久性儲存 — 有狀態應用程式需要什麼__HTMLTAG_225___
___HTMLTAG_226__HTMLTAG_227___無頭服務需要建立 DNS 記錄以進行對等發現
___HTMLTAG_230__HTMLTAG_231___volumeClaimTemplates 自動為每個 Pod 建立私人 PVC — 無共享儲存
___HTMLTAG_234__HTMLTAG_235___有序部署/刪除:部署時0→N,縮減時N→0-確保分散式系統的安全__HTMLTAG_237___
___HTMLTAG_238__HTMLTAG_239___分區滾動更新允許使用StatefulSet進行金絲雀部署
___HTMLTAG_242__HTMLTAG_243___CloudNativePG是2026年K8s上PostgreSQL生產的最佳標準
- 使用複雜的資料庫,操作員顯著節省時間並降低操作風險__HTMLTAG_249___