这是《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 只提供运行语义,不自动处理:
- 主从复制;
- 故障切换;
- 数据备份;
- 版本升级策略;
- 磁盘扩容;
- 主从发现。
这些通常由 Operator 或专门运维平台实现。
本章小结
StatefulSet 为有状态应用提供稳定身份和存储,但业务高可用仍需复制、选举、备份和恢复逻辑。能自动重拉容器不等于数据服务已具备自愈能力。
思考题
- StatefulSet 的三个稳定性是什么?
- Headless Service 有什么作用?
- 缩容为什么危险?
- podManagementPolicy 何时用 Parallel?
- 为什么数据库常配合 Operator?