You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Question] What production cases motivated the conservative rolling-update strategy and the Pending pod special handling?
#10887
This is a question/discussion rather than a feature request.
As a user running KubeBlocks in production, I'd like to understand the design rationale behind two related behaviours in the rolling-update reconciler (pkg/controller/instanceset/reconciler_update.go).
Is your feature request related to a problem? Please describe.
Observation 1 – Conservative "block on unavailable" strategy
When KubeBlocks detects that a pod being upgraded is unavailable (not ready / not available), it halts the upgrade of that pod and all subsequent pods. This is more conservative than some community approaches (e.g., plain cloneset rolling update which keeps going as long as maxUnavailable allows).
Observation 2 – Pending pod special handling (added ~April 2025)
A Pending pod that needs updating is now deleted immediately and the reconciler returns early, bypassing the normal PodUpdatePolicy:
// treat old and Pending pod as a special case, as they can be updated without a consequence// PodUpdatePolicy is ignored here since in-place update for a pending pod doesn't make much sense.fori, pod:=rangeoldPodList {
ifi>=rollingUpdateQuota {
break
}
updatePolicy, _, _, err:=getPodUpdatePolicy(its, pod)
iferr!=nil {
returnkubebuilderx.Continue, err
}
ifisPodPending(pod) &&updatePolicy!=noOpsPolicy {
err=tree.Delete(pod)
// wait another reconciliation, so that the following update process won't be confusedreturnkubebuilderx.Continue, err
}
}
Stop a rollout when an instance fails to recover.maxUnavailable limits concurrency, while the readiness/availability checks prevent a failed update from spreading to subsequent instances. For example, when rolling out to 10 instances with concurrency 2, if the first two fail to become available, the remaining eight should wait instead of continuing the rollout. This was an explicit gradual-rollout requirement in #7913.
Allow recovery from a Pending pod that needs a spec change. For example, a vertical scaling operation may request more resources than the cluster can schedule. The pod stays Pending, and waiting for it to become Ready before applying a rollback would leave the operation stuck. Recreating it with the corrected spec lets recovery proceed; preserving the pod for an in-place update is not the priority in this case. This scenario is described in #9070. #9312 separated this recovery path from normal rolling updates while keeping Pending pods counted as unavailable. Returning after deletion lets the next reconciliation observe the result before proceeding.
Regarding Issue 1, the current behavior blocks the upgrade even when instances of the old version are unavailable—not just when instances of the new version are unavailable. However, upgrades are most commonly performed precisely because there are issues with the old-version instances; why doesn't the system support this scenario?
This discussion was converted from issue #10880 on September 10, 2026 08:34.
Heading
Bold
Italic
Quote
Code
Link
Numbered list
Unordered list
Task list
Attach files
Mention
Reference
Menu
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
What is the user interaction of your feature
This is a question/discussion rather than a feature request.
As a user running KubeBlocks in production, I'd like to understand the design rationale behind two related behaviours in the rolling-update reconciler (
pkg/controller/instanceset/reconciler_update.go).Is your feature request related to a problem? Please describe.
Observation 1 – Conservative "block on unavailable" strategy
When KubeBlocks detects that a pod being upgraded is unavailable (not ready / not available), it halts the upgrade of that pod and all subsequent pods. This is more conservative than some community approaches (e.g., plain cloneset rolling update which keeps going as long as
maxUnavailableallows).Observation 2 – Pending pod special handling (added ~April 2025)
A Pending pod that needs updating is now deleted immediately and the reconciler returns early, bypassing the normal
PodUpdatePolicy:All reactions