application-stacks / runtime-component-operator

A generic Operator capable of deploying any runtime component image with enterprise QoS and bind it to other services
Apache License 2.0
49 stars 23 forks source link

Adding volumes to StatefulSet after the initial creation #367

Open leochr opened 2 years ago

leochr commented 2 years ago

Kubernetes StatefulSet itself doesn't allow volumes to be added to StatefulSets after their initial creation.

Trying to add a volume, results in this error: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden

The same limitation is encountered via operator.

Tasks:

kabicin commented 2 years ago

The reason for StatefulSet not supporting modification of other fields (in general):

For this specific use case outlined above, PVs and PVCs are not an issue but ensuring deletion of all pods is necessary to ensure recreation with the correct volume from StatefulSetSpec.

Edit: I am reconsidering to not ensure deletion of all pods since this specific use case will never cause a forced rollback state and so we can depend on StatefulSet controller to gracefully delete a pods with statefulSet: {}

kabicin commented 2 years ago

The PR above only implements adding volumes to instances without storage specified, i.e. statefulSet: {}. Given the above findings, do we want to support modifying volumes to RCO instances which already have StatefulSet + volume provisioned? For example, changing the mountPath PV size (which currently updates RC spec but does not actually update the StatefulSet spec until it is manually restarted).

halim-lee commented 2 years ago

I would recommend adding support only for adding volumes for now. Since making changes to StatefulSet volumes also requires deletion of pods, I am not sure if it is safe to make that too available. If we decide to support modifying the existing volumes, we can implement it later.