Chuyển đến nội dung chính

第 12 課:狀態集

用於有狀態應用程式的 StatefulSet:資料庫、訊息代理程式、分散式系統。穩定的網路身分、有序的部署/擴展、每個 Pod 的持久儲存。 PostgreSQL、Kafka、Redis 叢集的用例。

🔒 DevSecOps — 第 12 課 第 12 課:狀態集

KUBERNETES:從基礎到進階

模組 3:設定與儲存

xdev.asia

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___