Kubernetes StatefulSet 级联删除与非级联删除
一、基本概念
1. 级联删除(Cascading Delete)
- 定义:删除 StatefulSet 时,自动删除其管理的所有 Pod 及关联的存储卷(PVC)。
- 行为:默认策略,确保资源完全清理。
- 适用场景:需要彻底清理 StatefulSet 及其所有依赖资源的场景。
2. 非级联删除(Non-Cascading Delete / Orphan)
- 定义:仅删除 StatefulSet 对象,保留其管理的 Pod 和存储卷(PVC)。
- 行为:Pod 和 PVC 变为“孤儿资源”,需手动管理。
- 适用场景:保留 Pod 数据或临时保留服务运行状态。
二、操作方式
1. 级联删除(默认)
# 直接删除 StatefulSet(自动删除 Pod 和 PVC)
kubectl delete sts <statefulset-name>
# 明确指定级联删除(--cascade=true,默认行为)
kubectl delete sts <statefulset-name> --cascade=true
2. 非级联删除
# 仅删除 StatefulSet,保留 Pod 和 PVC
kubectl delete sts <statefulset-name> --cascade=orphan
# 等价于(Kubernetes 1.20+)
kubectl delete sts <statefulset-name> --cascade=background
3. 验证删除结果
# 查看 Pod 是否保留
kubectl get pods -l app=<statefulset-label>
# 查看 PVC 是否保留
kubectl get pvc -l app=<statefulset-label>
三、关键差异与影响
特性 | 级联删除 | 非级联删除 |
---|---|---|
删除范围 | StatefulSet + Pod + PVC | 仅 StatefulSet |
数据保留 | PVC 默认删除(需配置保留策略) | PVC 始终保留 |
Pod 状态 | 立即终止 | 继续运行,变为独立 Pod |
恢复能力 | 需重新创建 StatefulSet 和 PVC | 可重新关联 StatefulSet 或手动管理 |
四、PVC 保留策略
StatefulSet 支持通过 persistentVolumeClaimRetentionPolicy
控制 PVC 的删除行为:
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain # 删除 StatefulSet 时保留 PVC(默认 Delete)
whenScaled: Retain # 缩容时保留被移除 Pod 的 PVC
whenDeleted
:Delete
(级联删除 PVC)或Retain
(保留 PVC)。whenScaled
:缩容时是否保留 PVC(适用于动态调整副本数)。
五、使用场景与注意事项
1. 级联删除适用场景
- 环境清理:测试环境快速回收资源。
- 无状态化部署:确认数据可丢弃时(如临时缓存服务)。
2. 非级联删除适用场景
- 数据保护:保留数据库 PVC 避免误删。
- 故障排查:保留 Pod 日志和状态用于分析。
3. 注意事项
- 存储成本:非级联删除后需手动清理 PVC,避免存储泄漏。
- Pod 管理:孤儿 Pod 不再受 StatefulSet 控制,需自行监控生命周期。
- 版本兼容性:
persistentVolumeClaimRetentionPolicy
需 Kubernetes 1.23+。
六、操作示例
1. 非级联删除后重新关联
# 1. 非级联删除 StatefulSet
kubectl delete sts web --cascade=orphan
# 2. 重新创建同名 StatefulSet(复用原有 PVC)
kubectl apply -f statefulset.yaml
# 注意:需确保 StatefulSet 配置中的 PVC 模板与原有 PVC 匹配
2. 强制清理孤儿 Pod
# 手动删除非级联删除后保留的 Pod
kubectl delete pod <pod-name> --grace-period=0 --force
[!NOTE]
- 级联删除:一键清理所有资源,适合自动化运维场景。
- 非级联删除:精细控制资源生命周期,适合数据敏感型服务。
- 关键配置:通过
persistentVolumeClaimRetentionPolicy
管理 PVC 保留策略。- PV/PVC 的删除优先级高于 StatefulSet 的级联删除
- 如果 PV/PVC 是手动创建并绑定的(如云硬盘静态供给),默认不会随 Pod 或 StatefulSet 删除而自动删除,即使 StatefulSet 使用级联删除(
--cascade=true
)。- 最终以 PV/PVC 的保留策略为准,与 StatefulSet 的删除行为无关。
- StatefulSet 级联删除的范围
- 默认仅删除 StatefulSet 对象及其管理的 Pod,不会删除手动创建的 PV/PVC。
- 若 PVC 是通过 StatefulSet 的
volumeClaimTemplates
动态生成的,则根据persistentVolumeClaimRetentionPolicy
决定是否删除(默认删除)。
评论需开启科学上网!