-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RFC: Staging component changes in Knative #2639
Comments
cc @vaikas-google @evankanderson |
cc @dprotaso Perhaps this influencing your thinking around how we'd rollout CRD sub-resources? |
cc @tcnghia Can you think through how we rework the ingress gateway change so that it's safe? |
Can we change the upgrade tool to be |
If we add a With this approach, it seems like we may need different yamls for fresh install vs upgrade vs downgrade. |
@evankanderson Yeah, I had this in one of the examples:
@jonjohnsonjr Ack. Rollback safety in general requires us to introduce a component the release before we enable it by default, which is why I included this caveat:
Looking at the duality of upgrade / downgrade, this makes sense: You want everyone off of the new component before you remove it. If an upgrade adds it, then its downgrade would remove it. If the same upgrade moves folks onto it, then the downgrade will race to move things off before it is deleted. This is the same reason we must stage component removals. |
Note that for us to start using
|
|
So the process of this is touched on here, and will be further codified in a template that @eallred-google is working on. I think beyond that the serving operator will help rollout changes with non-trivial update mechanics without the multi-cycle staging, so we will evolve this over time. |
We've had multiple instances now where we've wanted to make some sort of change to Knative where we cannot simply "rip the bandaid off" because it would make upgrades disruptive, which we need to become more disciplined about how we handle.
The goal of this proposal is to try and keep the install/upgrade process as close to
kubectl apply -f foo.yaml
as possible, by requiring that we stage the rollout of changes in a manner that doesn't break deployed services during the upgrade.The general proposal in the abstract is:
0.a
, add a new component or feature0.b
, enable that feature by default[1]0.c
, require that feature to be enabled, deprecating things replaced0.d
, remove deprecated old things (maybe just code).Where:
a <= b <= c < d
You might be thinking: "That's a lot of releases!", but I expect that for most rollouts
a = b = c = d - 1
.[1] - If we want rollback safety then in some cases we may want this to be
a < b
.Some real examples
Milestones here are purely illustrative
Example: kbuffer
Route
controller rewriteClusterIngress
resources from the activator service to the kbuffer service.--prune
should cleanup, or aJob
should)Example: Reversing the flow of metrics
Revision
controller rewriteDeployment
resources to use the new sidecar.Revision
s have metrics endpoints.Example: CRD versioning
v1beta1
format (not storage, for rollback safety)v1beta1
the storage format (needs a forced update)v1alpha1
.The
knative-ingressgateway
is another example of where we should employ this staged migration.The text was updated successfully, but these errors were encountered: