认识
一、认识
StatefulSet
是 Kubernetes
中专门用于管理有状态应用的控制器。它为每个 Pod
提供稳定的网络标识和独立的存储卷,同时支持有序部署、扩展和缩减。适用于需要数据一致性和稳定性的场景,例如数据库、分布式存储系统和消息队列等。与 Deployment
相比,StatefulSet
主要用于那些需要稳定网络标识、持久存储以及有序部署和扩展的场景,例如数据库、分布式文件系统或队列服务。
1.1 功能
StatefulSet
每个 Pod
有固定的名称(如 myapp-0
, myapp-1
)。Pod
的重启或迁移不会改变其名称和身份。每个 Pod
都有一个与之绑定的持久存储卷(PersistentVolume
),即使 Pod
被删除或重建,其存储仍然保持不变。Pod
按顺序创建(0 -> 1 -> 2
)或删除(2 -> 1 -> 0
)。更新时也会按顺序进行,确保服务不中断。每个 Pod
都有一个固定的 DNS
名称(如 myapp-0.myservice.default.svc.cluster.local
)。
1.2 场景
-
数据库: 如
MySQL
、PostgreSQL
等需要保证每个实例有独立存储的应用。 -
分布式系统: 如
Kafka
、Zookeeper
、Cassandra
等分布式应用,需要稳定的网络标识和数据存储。 -
队列服务: 如
RabbitMQ
,需要稳定的消息队列实例。
1.4 StatefulSet Vs Deployment
Deployment
是无状态应用(Web 服务、批处理任务),Deployment
Pod
没有固定标识,随时可以删除、重建。没有持久存储,每次重建会清空数据。Pod
名称动态分配,每次重建可能会改变。容易快速增加或减少 Pod
数量。自动更新 Pod
,确保服务不中断。无法直接访问某个 Pod
,所有 Pod
共享一个服务入口, 通过标准 Service
对所有 Pod
实现负载均衡随机分配流量。
StatefulSet
是有状态应用(数据库、分布式系统),StatefulSet
每个 Pod
有固定的名称(如 myapp-0
, myapp-1
)。Pod
的重启或迁移不会改变其名称和身份。每个 Pod
都有一个与之绑定的持久存储卷(PersistentVolume
),即使 Pod
被删除或重建,其存储仍然保持不变。Pod
按顺序创建(0 -> 1 -> 2
)或删除(2 -> 1 -> 0
)。更新时也会按顺序进行,确保服务不中断。每个 Pod
都有一个固定的 DNS
名称(如 myapp-0.myservice.default.svc.cluster.local
)。
二、语法
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: test-stateful-set
spec:
serviceName: "test-headless-service"
replicas: 3
selector:
matchLabels:
app: test-stateful-set-nginx
template:
metadata:
labels:
app: test-stateful-set-nginx
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:1.27.1-perl-linux-arm64
ports:
- containerPort: 80
volumeMounts:
- name: test-volume
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: test-volume
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi