Skip to content

Kubernetes StatefulSet

StatefulSet 为一组 Pod 提供稳定序号、网络身份和每副本持久卷,适合应用已经能利用这些身份管理复制、成员关系或分片的场景。它不会自动把普通应用变成高可用数据库,也不负责数据一致性、备份和主从切换。

稳定身份

名为 orders-db、副本数为 3 的 StatefulSet 会创建 orders-db-0orders-db-1orders-db-2。配合 Headless Service,每个 Pod 可以获得稳定 DNS,例如:

text
orders-db-0.orders-db.orders.svc.cluster.local

Pod 被重建时名称保持,IP 可以变化。应用成员关系应使用稳定 DNS 或领域内成员 ID,不持久化 Pod IP。

最小结构

yaml
apiVersion: v1
kind: Service
metadata:
  name: orders-db
  namespace: orders
spec:
  clusterIP: None
  selector: { app: orders-db }
  ports:
    - name: db
      port: 5432
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: orders-db
  namespace: orders
spec:
  serviceName: orders-db
  replicas: 3
  selector:
    matchLabels: { app: orders-db }
  template:
    metadata:
      labels: { app: orders-db }
    spec:
      containers:
        - name: database
          image: registry.example.com/database@sha256:replace-with-digest
          ports:
            - name: db
              containerPort: 5432
          volumeMounts:
            - name: data
              mountPath: /var/lib/database
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: fast-rwo
        resources:
          requests: { storage: 100Gi }

每个副本会得到独立 PVC,例如 data-orders-db-0。默认缩容或删除 StatefulSet 不会自动删除这些 PVC,以降低误删数据风险;回收流程必须显式设计。

顺序、发布和分区

默认 OrderedReady 按序创建、更新和删除,前一个 Pod 未 Ready 会阻塞后续。只有应用不依赖顺序时才使用 Parallel podManagementPolicy。

RollingUpdate 可以通过 partition 保留低序号副本在旧版本,用于分阶段验证。即使 Pod 逐个更新,数据库 schema、协议和成员变更仍必须支持新旧版本混跑。

存储和拓扑

多可用区集群优先使用 WaitForFirstConsumer 的 StorageClass,让卷拓扑和 Pod 调度一起决定。还要定义:

  • 副本是否跨节点/可用区分散。
  • 卷故障后的重挂载和恢复时间。
  • 单副本卷与应用复制之间的职责。
  • 备份的一致性点、恢复顺序和演练频率。
  • 缩容后遗留 PVC 的审批与清理方式。

PVC 独立于 Pod 不等于跨区容灾。

排障

bash
kubectl get statefulset,pod,pvc -n orders -o wide
kubectl describe statefulset orders-db -n orders
kubectl describe pod orders-db-0 -n orders
kubectl describe pvc data-orders-db-0 -n orders
kubectl get events -n orders --sort-by=.metadata.creationTimestamp
现象优先检查
后续序号不创建前一 Pod Ready、OrderedReady、init/探针
Pod PendingPVC、StorageClass、拓扑、节点资源
新 Pod 找不到成员Headless Service、DNS、应用成员配置
更新卡在某序号Pod 日志、探针、版本兼容、partition
缩容后 PVC 仍在这是默认保护行为,按数据保留策略处理
Pod 重建后数据异常卷挂载、应用复制/恢复逻辑,不只看 PVC Bound
别急,先让缓存热一下。