我有一个带有持久卷的有状态集。
如果我这样做,kubectl rollout restart statefulset
将按预期方式重新创建pod并回收持久卷。
但是,我需要创建一个cron作业,该作业应该不时一次重新启动Pod,并清理持久卷(或重新创建它们)。因此,我要实现的任务是一次停止一个吊舱,清洗/删除其持久卷,然后用空的pvc创建一个新的吊舱(或重复使用同一吊舱),只有在该吊舱启动后,它才能继续到下一个吊舱。一个。
删除状态集并再次创建它不是一个选择,因为我需要停机0次(假设副本集中有1个以上的pod)。
我考虑的一个选项是将cron hob配置为首先修补现有配置,以便在首次重新启动期间删除持久卷,进行实际首次重新启动,然后使用还原更改再次对其进行修补。但是,不确定是否应该为此更改属性,并且还想确保没有更简单的方法来实现类似的行为。
答案 0 :(得分:0)
如果您有动态配置,请添加
reclaimPolicy: Delete
您的StorageClass定义或您拥有的每个PVC。删除是默认的ReclaimPolicy,但请确保在此标志下没有其他值。
您可以使用kubectl patch
command。
Statefulset
有4个update strategies。
Partition
策略的定义:
如果指定了分区,则在更新StatefulSet的
.spec.template
时,所有序号大于或等于该分区的Pod都会被更新。序号小于分区的所有Pod都不会更新,即使删除了它们,它们也会在以前的版本中重新创建。如果StatefulSet的.spec.updateStrategy.rollingUpdate.partition
大于其.spec.replicas
,则对其.spec.template
的更新将不会传播到其Pod。在大多数情况下,您不需要使用分区,但是如果您要进行更新,推出金丝雀或分阶段推出,则它们很有用。
例如,如果您在StatefulSet
中的某个位置设置了updateStrategy.rollingUpdate.partition: 2
,它将重新启动索引为2或更高的所有Pod。