Docker KubernetesNotes

第 22 章:StatefulSet

zjc 于 2026-01-22 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 StatefulSet 提供稳定网络标识、稳定存储和有序部署语义,适合数据库、消息队列和主从系统。

22.1 稳定性

能力 含义
稳定 Pod 名 postgres-0、postgres-1
稳定 DNS pod-name.service-name.namespace
稳定存储 Pod 重建后绑定同一 PVC
有序部署 按序号创建和更新

22.2 示例

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:16
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 200Gi

22.3 Headless Service

apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  clusterIP: None
  selector:
    app: postgres
  ports:
    - port: 5432

每个 Pod 可以有稳定 DNS,用于主从发现。

22.4 有序性

默认按 0 -> n 创建,逆序更新。可用并行策略调整:

spec:
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate

业务是否能并行取决于复制协议和选举逻辑。

22.5 扩缩容与更新

扩容:

kubectl scale statefulset/postgres --replicas=4

缩容会删除最高序号 Pod,且 PVC 可能保留。数据类系统缩容前必须先确认副本迁出和一致性。

22.6 StatefulSet 不是数据库高可用

StatefulSet 只提供运行语义,不自动处理:

  1. 主从复制;
  2. 故障切换;
  3. 数据备份;
  4. 版本升级策略;
  5. 磁盘扩容;
  6. 主从发现。

这些通常由 Operator 或专门运维平台实现。

本章小结

StatefulSet 为有状态应用提供稳定身份和存储,但业务高可用仍需复制、选举、备份和恢复逻辑。能自动重拉容器不等于数据服务已具备自愈能力。

思考题

  1. StatefulSet 的三个稳定性是什么?
  2. Headless Service 有什么作用?
  3. 缩容为什么危险?
  4. podManagementPolicy 何时用 Parallel?
  5. 为什么数据库常配合 Operator?