一、StatefulSet 基础概念
1. 与 Deployment 的关键区别
特性 | StatefulSet | Deployment |
---|---|---|
网络标识 | 稳定的 DNS 名称 | 随机生成 |
存储 | 每个 Pod 独立 PVC,数据持久化 | 共享存储或无状态 |
启停顺序 | 严格按序号顺序(0→N-1 启动,N-1→0 停止) | 并行 |
适用场景 | 数据库、消息队列(如 MySQL, Kafka) | Web 服务等无状态应用 |
2. 核心组件
- Headless Service:提供稳定的 DNS 域名解析(无 ClusterIP),格式:
svc.cluster.local
- volumeClaimTemplates:动态为每个 Pod 创建 PVC,确保存储与 Pod 绑定。
- Pod 标识规则:名称固定为
<StatefulSet 名称>-<序号>
(如web-0
,web-1
)。
二、StatefulSet 核心特性解析
1. 有序部署与扩缩容
- 扩容:从序号 0 开始顺序创建,前一个 Pod 进入
Running
状态后才创建下一个 。 -
缩容:逆序终止(从最高序号开始),确保前置 Pod 完全终止后再处理下一个。
kubectl scale statefulset web-nginx --replicas=5 # 扩容至 5 个副本
kubectl scale statefulset web-nginx --replicas=3 # 缩容至 3 个副本
2. 持久化存储机制
- 每个 Pod 通过
volumeClaimTemplates
自动创建独立 PVC,会为每个Pod分配并创建唯一的pvc编号,每个pvc绑定对应pv,从而保证每个Pod都有独立的存储。
# 定义卷申请模板
volumeClaimTemplates:
- metadata:name: data-volumespec:accessModes: - ReadWriteManystorageClassName: managed-nfs-storageresources:requests:storage: 2Gi
三、 StatefulSet 完整示例
1.编写配置文件
#部署nginx服务
[root@master-1 yaml]# cat sts-nginx.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-headless
spec:clusterIP: None # Headless Service 配置无头服务selector:app: nginxports:- port: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx-headless"replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.22.1imagePullPolicy: IfNotPresentvolumeMounts:- name: data-volumemountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: data-volumespec:accessModes:- ReadWriteManystorageClassName: managed-nfs-storage #采用动态存储类resources:requests:storage: 1Gi#查看动态存储类
[root@master-1 yaml]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 6m59s
2.部署验证
#部署
[root@master-1 yaml]# kubectl apply -f sts-nginx.yaml
#验证
[root@master-1 yaml]# kubectl get pods -w -o wide | grep web#查看存储
[root@master-1 yaml]# kubectl get pvc,pv#进入容器查看网络
[root@master-1 yaml]# kubectl exec -it web-0 -- sh
根据以下图片发现每个pod都有独立的存储,唯一的网络标识。
掌握 StatefulSet 的核心在于理解有序性、稳定存储与网络标识的协同设计。StatefulSet一般用于有状态服务,常用于MySQL, Kafka等场景,kafka可参考链接使用StatefulSet部署kafka服务