--- reviewers: - bgrant0607 - lavalamp - thockin title: Kubernetes Deprecation Policy weight: 40 --- Kubernetes is a large system with many components and many contributors. As with any such software, the feature set naturally evolves over time, and sometimes a feature may need to be removed. This could include an API, a flag, or even an entire feature. To avoid breaking existing users, Kubernetes follows a deprecation policy for aspects of the system that are slated to be removed. This document details the deprecation policy for various facets of the system. ## Deprecating parts of the API Since Kubernetes is an API-driven system, the API has evolved over time to reflect the evolving understanding of the problem space. The Kubernetes API is actually a set of APIs, called "API groups", and each API group is independently versioned. [API versions](/docs/reference/using-api/api-overview/#api-versioning) fall into 3 main tracks, each of which has different policies for deprecation: | Example | Track | |----------|----------------------------------| | v1 | GA (generally available, stable) | | v1beta1 | Beta (pre-release) | | v1alpha1 | Alpha (experimental) | A given release of Kubernetes can support any number of API groups and any number of versions of each. The following rules govern the deprecation of elements of the API. This includes: * REST resources (aka API objects) * Fields of REST resources * Annotations on REST resources, including "beta" annotations but not including "alpha" annotations. * Enumerated or constant values * Component config structures These rules are enforced between official releases, not between arbitrary commits to master or release branches. **Rule #1: API elements may only be removed by incrementing the version of the API group.** Once an API element has been added to an API group at a particular version, it can not be removed from that version or have its behavior significantly changed, regardless of track. Note: For historical reasons, there are 2 "monolithic" API groups - "core" (no group name) and "extensions". Resources will incrementally be moved from these legacy API groups into more domain-specific API groups. **Rule #2: API objects must be able to round-trip between API versions in a given release without information loss, with the exception of whole REST resources that do not exist in some versions.** For example, an object can be written as v1 and then read back as v2 and converted to v1, and the resulting v1 resource will be identical to the original. The representation in v2 might be different from v1, but the system knows how to convert between them in both directions. Additionally, any new field added in v2 must be able to round-trip to v1 and back, which means v1 might have to add an equivalent field or represent it as an annotation. **Rule #3: An API version in a given track may not be deprecated until a new API version at least as stable is released.** GA API versions can replace GA API versions as well as beta and alpha API versions. Beta API versions *may not* replace GA API versions. **Rule #4a: Other than the most recent API versions in each track, older API versions must be supported after their announced deprecation for a duration of no less than:** * **GA: 12 months or 3 releases (whichever is longer)** * **Beta: 9 months or 3 releases (whichever is longer)** * **Alpha: 0 releases** This covers the maximum supported version skew of 2 releases. NOTE: Until [#52185](https://github.com/kubernetes/kubernetes/issues/52185) is resolved, no API versions that have been persisted to storage may be removed. Serving REST endpoints for those versions may be disabled (subject to the deprecation timelines in this document), but the API server must remain capable of decoding/converting previously persisted data from storage. **Rule #4b: The "preferred" API version and the "storage version" for a given group may not advance until after a release has been made that supports both the new version and the previous version** Users must be able to upgrade to a new release of Kubernetes and then roll back to a previous release, without converting anything to the new API version or suffering breakages (unless they explicitly used features only available in the newer version). This is particularly evident in the stored representation of objects. All of this is best illustrated by examples. Imagine a Kubernetes release, version X, which introduces a new API group. A new Kubernetes release is made every approximately 3 months (4 per year). The following table describes which API versions are supported in a series of subsequent releases.
Release | API Versions | Preferred/Storage Version | Notes |
---|---|---|---|
X | v1alpha1 | v1alpha1 | |
X+1 | v1alpha2 | v1alpha2 |
|
X+2 | v1beta1 | v1beta1 |
|
X+3 | v1beta2, v1beta1 (deprecated) | v1beta1 |
|
X+4 | v1beta2, v1beta1 (deprecated) | v1beta2 | |
X+5 | v1, v1beta1 (deprecated), v1beta2 (deprecated) | v1beta2 |
|
X+6 | v1, v1beta2 (deprecated) | v1 |
|
X+7 | v1, v1beta2 (deprecated) | v1 | |
X+8 | v2alpha1, v1 | v1 |
|
X+9 | v2alpha2, v1 | v1 |
|
X+10 | v2beta1, v1 | v1 |
|
X+11 | v2beta2, v2beta1 (deprecated), v1 | v1 |
|
X+12 | v2, v2beta2 (deprecated), v2beta1 (deprecated), v1 (deprecated) | v1 |
|
X+13 | v2, v2beta1 (deprecated), v2beta2 (deprecated), v1 (deprecated) | v2 | |
X+14 | v2, v2beta2 (deprecated), v1 (deprecated) | v2 |
|
X+15 | v2, v1 (deprecated) | v2 |
|
X+16 | v2, v1 (deprecated) | v2 | |
X+17 | v2 | v2 |
|