一、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服務