Skip to content

Commit

Permalink
update kubernetes version table and tweak wording a bit
Browse files Browse the repository at this point in the history
Signed-off-by: clux <[email protected]>
  • Loading branch information
clux committed Sep 9, 2023
1 parent 5d06d78 commit 6e75bc6
Showing 1 changed file with 27 additions and 24 deletions.
51 changes: 27 additions & 24 deletions docs/kubernetes-version.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ Our Kubernetes version compatibility is similar to the strategy employed by [cli

| kube version | MK8SV | Latest | Generated Source |
| -------------- | ------- | ------- | ----------------- |
| `0.86.0` | `1.23` | [`1.28`](https://kubernetes.io/blog/2023/08/15/kubernetes-v1-28-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0200-2023-09-07) |
| `0.85.0` | `1.22` | [`1.27`](https://kubernetes.io/blog/2023/04/11/kubernetes-v1-27-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0190-2023-08-05) |
| `0.78.0` | `1.21` | [`1.26`](https://kubernetes.io/blog/2022/12/09/kubernetes-v1-26-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0170-2023-01-04) |
| `0.75.0` | `1.20` | [`1.25`](https://kubernetes.io/blog/2022/08/23/kubernetes-v1-25-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0160-2022-09-15) |
| `0.73.0` | `1.19` | [`1.24`](https://kubernetes.io/blog/2022/05/03/kubernetes-1-24-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0150-2022-05-22) |
| `0.67.0` | `1.18` | [`1.23`](https://kubernetes.io/blog/2021/12/07/kubernetes-1-23-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0140-2022-01-23) |
| `0.66.0` | `1.17` | [`1.22`](https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0131-2021-10-08) |
| `0.57.0` | `1.16` | [`1.21`](https://kubernetes.io/blog/2021/04/08/kubernetes-1-21-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0120-2021-06-15) |
| `0.48.0` | `1.15` | [`1.20`](https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/blob/master/CHANGELOG.md#v0110-2021-01-23) |
| [0.86.0](https://github.com/kube-rs/kube/releases/tag/0.86.0) | `1.23` | [`1.28`](https://kubernetes.io/blog/2023/08/15/kubernetes-v1-28-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.20.0) |
| [0.85.0](https://github.com/kube-rs/kube/releases/tag/0.85.0) | `1.22` | [`1.27`](https://kubernetes.io/blog/2023/04/11/kubernetes-v1-27-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.19.0) |
| [0.78.0](https://github.com/kube-rs/kube/releases/tag/0.78.0) | `1.21` | [`1.26`](https://kubernetes.io/blog/2022/12/09/kubernetes-v1-26-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.17.0) |
| [0.75.0](https://github.com/kube-rs/kube/releases/tag/0.75.0) | `1.20` | [`1.25`](https://kubernetes.io/blog/2022/08/23/kubernetes-v1-25-release/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.16.0) |
| [0.73.0](https://github.com/kube-rs/kube/releases/tag/0.73.0) | `1.19` | [`1.24`](https://kubernetes.io/blog/2022/05/03/kubernetes-1-24-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.15.0) |
| [0.67.0](https://github.com/kube-rs/kube/releases/tag/0.67.0) | `1.18` | [`1.23`](https://kubernetes.io/blog/2021/12/07/kubernetes-1-23-release-announcement/) | [[email protected]](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.14.0) |

<!-- NB: k8s-openapi 0.18 did not introduce a new Kubernetes version: https://github.com/Arnavion/k8s-openapi/releases/tag/v0.18.0 so its bump is not listed -->

The MK8SV is listed in our README as a badge:

Expand All @@ -25,21 +24,25 @@ The **minimum** indicates the lower bound of our testing range, and the **latest
The Minimum Supported Kubernetes Version (MK8SV) is set as **5 releases below** the **latest** Kubernetes version.

This policy is intended to match **stable channel support** within **major cloud providers**.
Compare with: [EKS](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html), [AKS](https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#aks-kubernetes-release-calendar), [GKE](https://cloud.google.com/kubernetes-engine/docs/release-notes-stable), [upstream Kubernetes](https://endoflife.date/google-kubernetes-engine).
Compare with: [EKS](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html), [AKS](https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#aks-kubernetes-release-calendar), [GKE](https://cloud.google.com/kubernetes-engine/docs/release-schedule), [upstream Kubernetes](https://endoflife.date/google-kubernetes-engine).

## Picking Versions

Given a `kube` versions, you must pick a **target Kubernetes version** from the available ones in the generated source that is used by that kube version.
Given a `kube` version, you may choose a **target Kubernetes version** from the [available features in the generated source](https://docs.rs/crate/k8s-openapi/latest/features) that is used by that kube version.

E.g. if using [`[email protected]`](https://docs.rs/kube/0.73.0/kube/), we see its generated source is [`[email protected]`](https://docs.rs/k8s-openapi/0.15.0/k8s_openapi/), which exports the [following version features](https://docs.rs/crate/k8s-openapi/0.15.0/features).
### Example

You can find the latest supported from this feature list and pick this as your target. In this case the latest supported version feature is `v1_24`.
When using [`[email protected]`](https://github.com/kube-rs/kube/releases/tag/0.86.0), the generated source is [`[email protected]`](https://github.com/Arnavion/k8s-openapi/releases/tag/v0.20.0), which exports the [following version features](https://docs.rs/crate/k8s-openapi/0.20.0/features). I.e. the `latest` supported version feature is _here_ aliased to `v1_28`, and the `earliest` is aliased to `v1_22`.

By default; you **SHOULD** pick the latest as your target version even when running against older clusters. The **exception** is if you are programming explicitly against apis that have been removed in newer versions.
### Guideline

With [k8s-pb], we plan on [doing this automatically](https://github.com/kube-rs/k8s-pb/issues/10).
What Kubernetes version you pick is up to you, but the consequences are often insignificant (see [details below](#version-skew)). Thus, we recommend:

See below for details on a skew between your cluster and your target version.
> Pick `latest` as your target version (even when running against older clusters). Consider **pinning** to a version matching your cluster **if** you are programming explicitly against deprecated or alpha apis.
<!--
With [k8s-pb], we plan on [doing this automatically](https://github.com/kube-rs/k8s-pb/issues/10).
-->

## Version Skew

Expand All @@ -59,13 +62,13 @@ Consider the following outcomes when picking **target versions** based on your *
* recent Kubernetes resources might not have Rust struct counterparts
* deprecated/alpha apis might have been removed from the cluster ⚡

[Kubernetes takes a long time to remove deprecated apis](https://kubernetes.io/docs/reference/using-api/deprecation-policy/) (unless they alpha or beta apis), so the **acceptable distance** from your **cluster** version actually **depends** on what **apis you target**.
[Kubernetes takes a long time to remove deprecated apis](https://kubernetes.io/docs/reference/using-api/deprecation-policy/) (unless they alpha or beta apis), so the **acceptable distance** from your **cluster** version **depends** on what **apis you target**.

In particular, when using your own **custom** or **stable official** api resources - where exceeding the range will have **little impact**.
In particular, when using **stable** (or your own **custom**) api resources, exceeding the range will have little impact.

**If** you are **targeting deprecated/alpha** apis on the other hand, then you should **pick** a target version **in sync with your cluster**. Note that alpha apis may vanish or change significantly in a single release, and is not covered by any guarantees.
**If** you are **targeting deprecated/alpha** apis on the other hand, then you should **pick** a target version **in sync with your cluster**, as alpha apis may vanish or change significantly in a single release, and is not covered by any guarantees.

As a result; relying on alpha apis will make the amount of **upgrades required** to an application **more frequent**. To alleviate this; consider using api [discovery] to **match on available api versions** rather than writing code against each Kubernetes version.
Relying on alpha apis will make the amount of **upgrades required** to an application **more frequent**. To alleviate this; consider using api [discovery] to **match on available api versions** rather than writing code against each Kubernetes version.

## Outside The Range

Expand All @@ -75,13 +78,13 @@ We recommend developers stay within the supported version range for the best exp

While exceeding the supported version range is likely to work for most api resources: **we do not test** kube's functionality **outside this version range**.

In minor skews, kube and Kubernetes will share a large functioning API surface, while relying on deprecated apis to fill the gap. However, the **further you stray** from the range you are **increasingly likely** to encounter Rust structs that doesn't work against your cluster, or miss support for resources entirely.
In minor skews, kube and Kubernetes will share a large functioning API surface, while relying on deprecated apis to fill the gap. However, the **further you stray** from the range you are more likely to encounter Rust structs that doesn't work against your cluster, or miss support for resources entirely.

## Special Abstractions
## Abstractions

For a small number of api resources, kube provides abstractions that are not managed along with the generated sources. For these cases we currently __track the source__ and remove when Kubernetes removes them.
For a small number of api resources, kube provides abstractions that are not managed along with the generated sources. For these cases we __track the source__ and remove when Kubernetes removes them (to avoid double dipping on deprecation time).

This only affects a small number of special resources such as `CustomResourceDefinition`, `Event`, `Lease`, `AdmissionReview`.
This affects a small number of special resources such as `CustomResourceDefinition`, `Event`, `Lease`, `AdmissionReview`.

### Example

Expand Down

0 comments on commit 6e75bc6

Please sign in to comment.