StatefulSet 项目
发布: (2026年1月19日 GMT+8 05:05)
2 min read
原文: Dev.to
Source: Dev.to
前置条件
StatefulSet 需要以下组件:
- Headless Service – 为每个 Pod 提供稳定的 DNS。
- StatefulSet 清单 – 定义 Pod 及其身份。
- PersistentVolume / StorageClass – 通常已在集群中存在。
缺少这些,StatefulSet 将无法正常工作。
Headless Service
apiVersion: v1
kind: Service
metadata:
name: mysql-headless
spec:
clusterIP: None # <- makes the service headless
selector:
app: mysql
ports:
- port: 3306
应用该 Service:
kubectl apply -f service.yaml
为什么重要
- 没有负载均衡;每个 Pod 都拥有自己的 DNS 条目。
- 数据库和集群场景必需。
StatefulSet 清单
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-headless # MUST match the headless service name
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
应用该 StatefulSet:
kubectl apply -f statefulset.yaml
验证部署
列出 Pod:
kubectl get pods
你应该看到:
mysql-0
mysql-1
mysql-2
列出 PersistentVolumeClaims:
kubectl get pvc
你应该看到:
data-mysql-0
data-mysql-1
data-mysql-2
访问 Pod
kubectl exec -it mysql-0 -- bash
在 Pod 内可以测试 DNS 解析:
ping mysql-1.mysql-headless
ping mysql-2.mysql-headless
每个 Pod 都拥有自己的稳定主机名。
扩容 StatefulSet
kubectl scale statefulset mysql --replicas=4
会发生什么
- 在
mysql-2之后创建新的 Podmysql-3。 - 为其创建新的 PVC
data-mysql-3。 - 数据不会丢失;Pod 保持其稳定的名称、DNS 和存储。
- Pod 按顺序启动和停止,这对许多有状态应用至关重要。
使用场景
StatefulSet 适用于需要稳定身份和持久存储的工作负载,例如:
- MySQL / PostgreSQL
- MongoDB
- Kafka
- ZooKeeper
- Elasticsearch
StatefulSet 会创建具有稳定身份、DNS 和持久存储的 Pod,这些都是数据库等有状态工作负载所必需的。