Kubernetes StatefulSet 扩容/缩容与滚动更新
一、StatefulSet 扩容与缩容
1. 扩容(Scale Out)
-
命令:
kubectl scale sts <statefulset-name> --replicas=<desired-number>
- 或直接修改 YAML 的
replicas
字段并apply
。
- 或直接修改 YAML 的
-
特点:
- Pod 按顺序创建(从
0
到N-1
),每个 Pod 必须达到Running & Ready
状态才会创建下一个。 - 扩容时会自动分配唯一的网络标识(如
<sts-name>-<ordinal>
)、稳定的存储卷(根据volumeClaimTemplates
)。
- Pod 按顺序创建(从
2. 缩容(Scale In)
-
命令:
kubectl scale sts <statefulset-name> --replicas=<reduced-number>
-
特点:
- Pod 按逆序终止(从
N-1
到0
)。 - 缩容时默认不会自动删除 PV(需手动清理,除非配置了
persistentVolumeClaim
的删除策略)。
- Pod 按逆序终止(从
3. 注意事项
- 数据安全:缩容前需确保业务已正确处理数据,避免有状态服务数据丢失。
- 服务依赖:确保应用能正确处理 Pod 离开集群(如注册中心的优雅注销)。
二、StatefulSet 滚动更新
1. 更新策略
在 spec.updateStrategy
中定义:
updateStrategy:
type: RollingUpdate # 默认值(另一种是 OnDelete)
rollingUpdate:
partition: <number> # 可选,用于分阶段更新(金丝雀发布)
RollingUpdate
:- 按 Pod 顺序(逆序)逐个更新,从最高序号的 Pod 开始。
- 每个 Pod 更新前需确保其副本已
Running & Ready
。
OnDelete
:- 仅当手动删除 Pod 时才会触发新版本的创建。
2. 分区更新(金丝雀发布)
- 通过
partition
字段控制更新的范围:- 只有序号 ≥ partition 的 Pod 会被更新,其余保留旧版本。
- 逐步调整
partition
值直至为0
,完成全量更新。
3. 触发更新方式
- 修改 StatefulSet 的
spec.template
(如镜像版本、环境变量等)。 - 直接更新 YAML 并
apply
,或通过kubectl patch
命令。
4. 注意事项
- 存储卷不变性:更新不会影响已绑定的 PV/PVC(除非手动修改存储配置)。
- 有序性保证:滚动更新时需确保应用能处理新旧版本共存的情况(如数据库 schema 兼容性)。
三、关键区别(StatefulSet vs Deployment)
特性 | StatefulSet | Deployment |
---|---|---|
Pod 名称 | 稳定(带序号) | 随机哈希 |
扩缩容顺序 | 顺序创建/逆序删除 | 并行 |
存储卷 | 每个 Pod 独立 PVC(稳定绑定) | 共享或无状态存储 |
滚动更新策略 | 支持分区更新(金丝雀) | 多种策略(如蓝绿) |
四、常用命令
# 查看 StatefulSet 状态
kubectl get sts -o wide
# 查看关联的 Pod 和 PVC
kubectl get pods,pvc -l app=<statefulset-name>
# 强制回滚(通过修改镜像版本)
kubectl rollout undo sts/<name> --to-revision=<revision-number>
[!TIP]
- 扩缩容:注重顺序性和数据持久化,需谨慎处理有状态服务的生命周期。
- 滚动更新:支持精细化控制(如分区更新),适合需要保证服务稳定的场景。
- 设计建议:确保应用能适应 Pod 名称、存储和网络标识的稳定性需求。
评论需开启科学上网!