This is related to the following issue i opened sometime back https://github.com/kubernetes/kubernetes/issues/68397 . I would like to add maxUnavailable to StatefulSet and i am seeking feedback and use cases from the community.
Many times we want stable network identity(StatefulSet) but would like to be able to do a rolling update on it without going one pod at a time . This helps in faster rollout of changes. Examples of such scenarios are:-
1: My containers publish metrics to time series system. If I am using a Deployment , each rolling update creates a new pod name and hence the metrics published by these new pod names , starts a new time series which makes tracking metrics for the application difficult. While this could be mitigated, it requires some tricks on the time series collection side. It would be so much nicer if i could use a StatefulSet object so my object names doesnt change and hence all metrics goes to a single time series, but still get all the other benefits of a Deployment like maxUnavailable
2: My Container do some initial startup tasks like loading up cache or something that takes a lot of time. If we used StatefulSet, we can only go one pod at a time which would result in a slow rolling update. If we did maxUnavailable for StatefulSet with a greater than 1 number, it would allow for a faster rollout. THe bursting using parallel pod management does allow some improvement, but it doesnt control how many to burst, so it can literally bring down the entire application.
3: Even for a truly stateful clustered application, with a cluster of n nodes having the same role(follower, readers , etc), if my application can tolerate it i want to be able to faster rollouts by bringing down 2 or more at a time.
4: Sometimes i just want easier tracking of revisions of a rolling update. Deployment does it through ReplicaSets and has its own nuances. Understanding that requires diving into the complicacy of hashing and how replicasets are named. Over and above that, there are some issues with hash collisions which further complicate the situation(I know they were solved). StatefulSet introduced ControllerRevisions in 1.7 which I believe are easier to think and reason about. They are used by DaemonSet and StatefulSet for tracking revisions. It would be so much nicer if all the use cases of Deployments can be meant and we could track the revisions by ControllerRevisions.
Are there other uses cases for this , people are looking for ?
Basically i feel like the lines have completely blurred between StatefulSet and Deployment and if there were things available in StatefulSet that are already available in Deployment, like maxUnavailable, I don’t see many strong reasons to use a Deployment (other than obviously it being more battle tested and stable then StatefulSet)
Thoughts from the community ?
Do you support adding maxUnavailable to StatefulSet ?