> 本文作者:丁辉 # StatefulSet的使用 [官方文档](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/) ## 示例 ```yaml cat <=2 的 Pod 会被更新 ``` **工作原理**: - `partition: 2` → 更新 pod-2, pod-3, ... - `partition: 1` → 更新 pod-1, pod-2, ... - `partition: 0` → 更新所有 Pod(默认值) ## PersistentVolumeClaim 保留 在 StatefulSet 的生命周期中,可选字段 `.spec.persistentVolumeClaimRetentionPolicy` 控制是否删除以及如何删除 PVC。 使用该字段,你必须在 API 服务器和控制器管理器启用 `StatefulSetAutoDeletePVC` [特性门控](https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)。 启用后,你可以为每个 StatefulSet 配置两个策略: - `whenDeleted` 配置删除 StatefulSet 时应用的卷保留行为。 - `whenScaled` 配置当 StatefulSet 的副本数减少时应用的卷保留行为;例如,缩小集合时。 对于你可以配置的每个策略,你可以将值设置为 `Delete` 或 `Retain`。 - `Delete` 对于受策略影响的每个 Pod,基于 StatefulSet 的 `volumeClaimTemplate` 字段创建的 PVC 都会被删除。 使用 `whenDeleted` 策略,所有来自 `volumeClaimTemplate` 的 PVC 在其 Pod 被删除后都会被删除。 使用 `whenScaled` 策略,只有与被缩减的 Pod 副本对应的 PVC 在其 Pod 被删除后才会被删除。 - `Retain`(默认) 来自 `volumeClaimTemplate` 的 PVC 在 Pod 被删除时不受影响。这是此新功能之前的行为。 请记住,这些策略仅适用于由于 StatefulSet 被删除或被缩小而被删除的 Pod。 例如,如果与 StatefulSet 关联的 Pod 由于节点故障而失败, 并且控制平面创建了替换 Pod,则 StatefulSet 保留现有的 PVC。 现有卷不受影响,集群会将其附加到新 Pod 即将启动的节点上。 ### 示例 1. whenDeleted - StatefulSet 被删除时 - 保留 PVC (默认) ```yaml apiVersion: apps/v1 kind: StatefulSet ... spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Retain ``` - 删除 PVC ```yaml apiVersion: apps/v1 kind: StatefulSet ... spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Delete ``` 2. whenScaled - 缩减副本数时 - 保留被删除 Pod 的 PVC ```yaml apiVersion: apps/v1 kind: StatefulSet ... spec: persistentVolumeClaimRetentionPolicy: whenScaled: Retain ``` - 删除被删除 Pod 的 PVC ```yaml apiVersion: apps/v1 kind: StatefulSet ... spec: persistentVolumeClaimRetentionPolicy: whenScaled: Delete ```