跳到主要内容

认识

2024年08月30日
柏拉文
越努力,越幸运

一、认识


StatefulSetKubernetes 中专门用于管理有状态应用的控制器。它为每个 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 场景

  1. 数据库: 如 MySQLPostgreSQL 等需要保证每个实例有独立存储的应用。

  2. 分布式系统: 如 KafkaZookeeperCassandra 等分布式应用,需要稳定的网络标识和数据存储。

  3. 队列服务: 如 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