@@ -86,6 +86,7 @@ tags, and then generate with `hack/update-toc.sh`.
86
86
- [ Component Flags] ( #component-flags )
87
87
- [ --emulation-version] ( #--emulation-version )
88
88
- [ --min-compatibility-version] ( #--min-compatibility-version )
89
+ - [ Skew] ( #skew )
89
90
- [ Changes to Feature Gates] ( #changes-to-feature-gates )
90
91
- [ Feature Gate Lifecycles] ( #feature-gate-lifecycles )
91
92
- [ Feature gating changes] ( #feature-gating-changes )
@@ -175,18 +176,24 @@ Items marked with (R) are required *prior to targeting to a milestone / release*
175
176
176
177
We intend to introduce version compatibility and emulation options to
177
178
Kubernetes control plane components to make upgrades safer by increasing the
178
- granularity of steps available to cluster administrators. We will introduce
179
- ` --emulation-version ` flag to emulate the behavior (APIs, features, ...) of a
180
- prior Kubernetes release version. We will also introduce a
181
- ` --min-compatibility-version ` flag to control which prior versions of Kubernetes
182
- a control plane component is compatible with (in terms of APIs, features, ...)
183
- and can be rolled back to.
184
-
185
- When a emulation version is provided, the [ Version skew policy] ( https://kubernetes.io/releases/version-skew-policy/ )
186
- will apply to the emulation version instead of the binary version, allowing binary
187
- versions to be skipped when performing skip version upgrades, so long the
188
- upgrade transitions incrementally through emulation versions according to the
189
- supported version skew constraints.
179
+ granularity of steps available to cluster administrators.
180
+
181
+ We will introduce a ` --emulation-version ` flag to emulate the capabiliites
182
+ (APIs, features, ...) of a prior Kubernetes release version. When used, the
183
+ capabilities available will match the emulated version. Any capabilities present
184
+ in the binary version that were introduced after the emulation version will be
185
+ unavailable and any capabilities removed after the emulation version will be
186
+ available. This enables a binary version to emulate the behavior of a previous
187
+ version with sufficient fidelity that interoperability with other system
188
+ components can be defined in terms of the emulated version.
189
+
190
+ We will also introduce a ` --min-compatibility-version ` flag to control the
191
+ minimum version a control plane component is compatible with (in terms of
192
+ storage versions, validation rules, ...). When used, the component tolerates
193
+ workloads that expect the behavior of the specified minimum compatibility
194
+ version, component skew ranges extend based on the minimum compatibility
195
+ version, and rollbacks can be performed back to the specified minimum
196
+ compatibility version.
190
197
191
198
## Motivation
192
199
@@ -208,7 +215,7 @@ achieved failure) and (2) failures are more easily auto-reverted by upgrade
208
215
orchestration as we are taking smaller and more incremental steps forward,
209
216
which means there is less to “undo” on a failure condition.
210
217
211
- that it would be possible to skip binary versions while still performing a
218
+ It also becomes possible to skip binary versions while still performing a
212
219
stepwise upgrade of Kubernetes control-plane. For example:
213
220
214
221
- (starting point) binary-version 1.28 (compat-version 1.28)
@@ -239,7 +246,7 @@ Benefits to upgrading binary version independent of emulation version:
239
246
addressed before proceeding to subsequent steps. These failures can be
240
247
addressed without the disruption and "noise" from failures in subsequent
241
248
steps.
242
- - A emulation version rollback can be performed without changing binary version.
249
+ - An emulation version rollback can be performed without changing binary version.
243
250
244
251
A dedicated ` --min-compatibility-version ` flag provides direct control of when
245
252
deprecated features are removed from the API. If the ` --min-compatibility-version `
@@ -277,7 +284,7 @@ release for features to settle in as is typically needed for rollback support.
277
284
- Support ` --emulation-version ` for Alpha features. Alpha feature are not
278
285
designed to be upgradable, so we will not allow alpha features to be enabled when
279
286
` --emulation-version ` is set.
280
- - ` --min-compatibility-version ` will only applies to Beta and GA features. Only
287
+ - ` --min-compatibility-version ` will only apply to Beta and GA features. Only
281
288
Alpha features available in the current binary version will be available for enablement
282
289
and are allowed to change in behavior across releases in ways that are incompatible
283
290
with previous versions.
@@ -316,6 +323,23 @@ version be <= the kube-apiserver binary version, it must also be <= the
316
323
exit and report an invalid flag value error telling the user what versions are
317
324
allowed.
318
325
326
+ ### Skew
327
+
328
+ The [ Version skew policy] ( https://kubernetes.io/releases/version-skew-policy/ )
329
+ rules be defined in terms of compatibility and emulation versions:
330
+
331
+ - kube-controller-manager, kube-scheduler, and cloud-controller-manager:
332
+ - Previously: ` 1.{binaryMinorVersion-1} ` ..` {binaryVersion} `
333
+ - With this enhancement: ` {minCompatibilityVersion}..{emulationVersion} `
334
+
335
+ - kube-proxy, kubelet:
336
+ - Previously: ` 1.{binaryMinorVersion-3} ` ..` {binaryVersion} `
337
+ - With this enhancement: ` {minCompatibilityVersion-2}..{emulationVersion} `
338
+
339
+ - kubectl:
340
+ - Previously: ` 1.{binaryMinorVersion-1} ` ..` {binaryVersion+1} `
341
+ - With this enhancement: ` {minCompatibilityVersion-1}..{emulationVersion+1} `
342
+
319
343
### Changes to Feature Gates
320
344
321
345
Features will track version information, i.e.:
@@ -366,12 +390,12 @@ the emulation and compatibility version to determine which features to enable.
366
390
367
391
#### Feature Gate Lifecycles
368
392
369
- ` --feature-gates ` must behave the same as it did for the Kubernetes version the
370
- emulation and compatibility versions are set to. For example, it must be
371
- possible to use ` --feature-gates ` to disable features that were beta at the
372
- emulation version. One important implication of this requirement is that feature
373
- gating must be kept in the Kubenetes codebase after a feature has reached GA (or
374
- been removed) to support the emulation and compatibility version ranges.
393
+ ` --feature-gates ` must behave the same as it did for the emulation version. For
394
+ example, it must be possible to use ` --feature-gates ` to disable features that
395
+ were beta at the emulation version. One important implication of this
396
+ requirement is that feature gating must be kept in the Kubenetes codebase after
397
+ a feature has reached GA (or been removed) to support the emulation and
398
+ compatibility version ranges.
375
399
376
400
A feature that is promoted once per release would look something like:
377
401
@@ -997,13 +1021,14 @@ No other default behavior is changed.
997
1021
998
1022
###### Can the feature be disabled once it has been enabled (i.e. can we roll back the enablement)?
999
1023
1000
- Yes. Note that when ` --emulation-version ` flags is defined, the feature flag
1001
- must be turned on (when feature is in Alpha). So to disable the feature, the
1002
- flag must also be removed.
1024
+ Yes. Note that when the ` --emulation-version ` or ` --min-compatibility-version ` flags is
1025
+ set, the feature flag must be turned on (when feature is in Alpha). So to
1026
+ disable the feature, the flag must also be removed.
1003
1027
1004
1028
###### What happens if we reenable the feature if it was previously rolled back?
1005
1029
1006
- Behavior is as expected, ` --emulation-version ` may be set again.
1030
+ Behavior is as expected, ` --emulation-version ` or ` --min-compatibility-version `
1031
+ may be set again.
1007
1032
1008
1033
###### Are there any tests for feature enablement/disablement?
1009
1034
0 commit comments