StatefulSet
约 676 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › K8s › 工作负载(在新窗口打开) › StatefulSet
为什么需要 StatefulSet
Deployment 适用于无状态应用(所有副本等价),而有状态应用(数据库、消息队列)需要:
- 稳定的网络标识:每次重建 Pod 名称不变。
- 有序的部署/伸缩:按顺序启动和停止。
- 稳定的持久化存储:每个 Pod 绑定独立的存储卷。
StatefulSet 示例
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" # 管理网络标识的 Headless Service
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # 自动为每个 Pod 创建 PVC
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi# 创建
kubectl apply -f statefulset.yaml
# 查看 Pod(名称有固定序号)
kubectl get pods
# NAME READY STATUS
# web-0 1/1 Running
# web-1 1/1 Running
# web-2 1/1 Running稳定的网络标识
# StatefulSet 中的 Pod 名称固定为 <name>-<ordinal>
kubectl exec web-0 -- hostname
# web-0
# 通过 DNS 可直达指定 Pod
kubectl run dns-test --image=busybox --rm -it --restart=Never -- nslookup web-0.nginx.default.svc.cluster.local网络标识格式:<pod-name>.<service-name>.<namespace>.svc.cluster.local
有序部署与伸缩
spec:
podManagementPolicy: OrderedReady # 默认:顺序部署/删除
# podManagementPolicy: Parallel # 并行部署(类似 Deployment)有序删除(kubectl delete pod):逆序删除(web-2 → web-1 → web-0)。
独立的持久化存储
# 查看每个 Pod 对应的 PVC
kubectl get pvc
# NAME STATUS VOLUME
# www-web-0 Bound pvc-xxx
# www-web-1 Bound pvc-yyy
# www-web-2 Bound pvc-zzz
# 删除 Pod 后重建,PVC 保留,数据不丢失场景对比
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀 | 固定序号(web-0, web-1) |
| 存储 | 共享 PVC(或 none) | 独立 PVC 每个 Pod |
| 启动顺序 | 并行 | 顺序 |
| 删除顺序 | 任意 | 逆序 |
| 网络标识 | 不稳定 | 稳定 DNS |
| 适用 | Web 服务、API | 数据库、消息队列、ZooKeeper |
常用配置
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.4
env:
- name: MYSQL_ROOT_PASSWORD
value: secret
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: standard
resources:
requests:
storage: 10Gi小结
- StatefulSet 用于管理有状态应用,提供稳定的网络标识、有序部署、独立持久化存储。
- Pod 命名格式
<name>-<序号>,通过 Headless Service 提供稳定 DNS。 volumeClaimTemplates为每个 Pod 自动创建独立的 PVC。- 默认顺序部署(
OrderedReady),可选并行模式(Parallel)。 - 适用场景:MySQL、Redis、Kafka、Elasticsearch 等有状态服务。
