Software:Kubernetes

From HandWiki
Short description: Software to manage containers on a server-cluster
Kubernetes
Kubernetes logo without workmark.svg
Original author(s)Google
Developer(s)Cloud Native Computing Foundation
Initial release0.2[1] / 9 September 2014; 9 years ago (2014-09-09)
Written inGo
TypeCluster management software
LicenseApache License 2.0
Websitekubernetes.io

Kubernetes (/ˌk(j)bərˈnɛtɪs, -ˈntɪs, -ˈntz, -ˈnɛtz/, commonly abbreviated K8s[2]) is an open-source container orchestration system for automating software deployment, scaling, and management.[3][4] Originally designed by Google, the project is now maintained by the Cloud Native Computing Foundation.

The name Kubernetes originates from Ancient Greek, meaning 'helmsman' or 'pilot'. Kubernetes is often abbreviated as K8s, counting the eight letters between the K and the s (a numeronym).[5]

Kubernetes works with various container runtimes, such as containerd and CRI-O.[6] Its suitability for running and managing large cloud-native workloads has led to its widespread adoption in the data center. There are multiple distributions of this platform – from independent software vendors (ISVs) as well as hosted-on-cloud offerings from all the major public cloud vendors.[7]

History

Google Kubernetes Engine talk at Google Cloud Summit

Kubernetes (Ancient Greek:, 'steersman, navigator' or 'guide', and the etymological root of cybernetics)[4] was announced by Google in mid-2014.[8] The project was created by Joe Beda, Brendan Burns, and Craig McLuckie,[9][10] who were soon joined by other Google engineers, including Brian Grant and Tim Hockin.[8]

The design and development of Kubernetes was influenced by Google's Borg cluster manager and based on Promise Theory.[11][12] Many of its top contributors had previously worked on Borg;[13][14] they codenamed Kubernetes "Project 7" after the Star Trek ex-Borg character Seven of Nine[15] and gave its logo a seven-spoked wheel. Unlike Borg, which was written in C++,[13] Kubernetes source code is in the Go language.

Kubernetes 1.0 was released on July 21, 2015.[16] Google worked with the Linux Foundation to form the Cloud Native Computing Foundation (CNCF)[17] and offered Kubernetes as a seed technology. In February 2016,[18] the Helm[19][20] package manager for Kubernetes was released.

Google was already offering managed Kubernetes services, while Red Hat was supporting Kubernetes as part of OpenShift since the inception of the Kubernetes project in 2014.[21] In 2017, the principal competitors rallied around Kubernetes and announced adding native support for it:

On March 6, 2018, Kubernetes Project reached ninth place in the list of GitHub projects by the number of commits, and second place in authors and issues, after the Linux kernel.[27]

Until version 1.18, Kubernetes followed an N-2 support policy, meaning that the three most recent minor versions receive security updates and bug fixes.[28] Starting with version 1.19, Kubernetes follows an N-3 support policy.[29]

Concepts

Kubernetes architecture diagram

Kubernetes defines a set of building blocks ("primitives") that collectively provide mechanisms that deploy, maintain, and scale applications based on CPU, memory[30] or custom metrics.[31] Kubernetes is loosely coupled and extensible to meet the needs of different workloads. The internal components as well as extensions and containers that run on Kubernetes rely on the Kubernetes API.[32] The platform exerts its control over compute and storage resources by defining resources as objects, which can then be managed as such.

Kubernetes follows the primary/replica architecture. The components of Kubernetes can be divided into those that manage an individual node and those that are part of the control plane.[32][33]

Control plane

The Kubernetes master node handles the Kubernetes control plane of the cluster, managing its workload and directing communication across the system. The Kubernetes control plane consists of various components such as TLS encryption, RBAC, and a strong authentication method, network separation, each its own process, that can run both on a single master node or on multiple masters supporting high-availability clusters.[33] The various components of the Kubernetes control plane are as follows.[34]

etcd

etcd[35] is a persistent, lightweight, distributed, key-value data store (originally developed for Container Linux). It reliably stores the configuration data of the cluster, representing the overall state of the cluster at any given point of time. etcd favors consistency over availability in the event of a network partition (see CAP theorem). The consistency is crucial for correctly scheduling and operating services.

API server

The API server serves the Kubernetes API using JSON over HTTP, which provides both the internal and external interface to Kubernetes.[32][36] The API server processes, validates REST requests, and updates the state of the API objects in etcd, thereby allowing clients to configure workloads and containers across worker nodes.[37] The API server uses etcd's watch API to monitor the cluster, roll out critical configuration changes, or restore any divergences of the state of the cluster back to the desired state as declared in etcd.

As an example, a human operator may specify that three instances of a particular "pod" (see below) need to be running, and etcd stores this fact. If the Deployment controller finds that only two instances are running (conflicting with the etcd declaration),[38] it schedules the creation of an additional instance of that pod.[33]

Scheduler

The scheduler is an extensible component that selects the node that an unscheduled pod (the basic unit of workloads to be scheduled) runs, based on resource availability and other constraints. The scheduler tracks resource allocation on each node to ensure that workload is not scheduled in excess of available resources. For this purpose, the scheduler must know the resource requirements, resource availability, and other user-provided constraints or policy directives such as quality-of-service, affinity/anti-affinity requirements, and data locality. The scheduler's role is to match resource "supply" to workload "demand".[39]

Kubernetes allows running multiple schedulers within a single cluster. As such, scheduler plug-ins may be developed and installed as in-process extensions to the native vanilla scheduler by running it as a separate scheduler, as long as they conform to the Kubernetes scheduling framework.[40] This allows cluster administrators to extend or modify the behavior of the default Kubernetes scheduler according to their needs.

Controllers

A controller is a reconciliation loop that drives the actual cluster state toward the desired state, communicating with the API server to create, update, and delete the resources it manages (e.g., pods or service endpoints).[41][36]

An example controller is a ReplicaSet controller, which handles replication and scaling by running a specified number of copies of a pod across the cluster. The controller also handles creating replacement pods if the underlying node fails.[41] Other controllers that are part of the core Kubernetes system include a DaemonSet controller for running exactly one pod on every machine (or some subset of machines), and a Job controller for running pods that run to completion (e.g. as part of a batch job).[42] Labels selectors often form part of the controller's definition that specify the set of pods that a controller manages.[43]

The controller manager is a single process that manages several core Kubernetes controllers (including the examples described above), is distributed as part of the standard Kubernetes installation and responding to the loss of nodes.[34]

Custom controllers may also be installed in the cluster, further allowing the behavior and API of Kubernetes to be extended when used in conjunction with custom resources (see custom resources, controllers and operators below).

Nodes

A node, also known as a worker or a minion, is a machine where containers (workloads) are deployed. Every node in the cluster must run a container runtime, as well as the below-mentioned components, for communication with the primary network configuration of these containers.

kubelet

kubelet is responsible for the running state of each node, ensuring that all containers on the node are healthy. It takes care of starting, stopping, and maintaining application containers organized into pods as directed by the control plane.[32][44] kubelet monitors the state of a pod, and if not in the desired state, the pod re-deploys to the same node. Node status is relayed every few seconds via heartbeat messages to the API server. Once the control plane detects a node failure, a higher-level controller is expected to observe this state change and launch pods on another healthy node.[45]

Container runtime

A container runtime is responsible for the lifecycle of containers, including launching, reconciling and killing of containers. kubelet interacts with container runtimes via the Container Runtime Interface (CRI),[46][47] which decouples the maintenance of core Kubernetes from the actual CRI implementation.

Originally, kubelet interfaced exclusively with the Docker runtime[48] through a "dockershim". However, from November 2020[49] up to April 2022, Kubernetes has deprecated the shim in favor of directly interfacing with the container through containerd, or replacing Docker with a runtime that is compliant with the Container Runtime Interface (CRI).[50][46][51] With the release of v1.24 in May 2022, the "dockershim" has been removed entirely.[52]

Examples of popular container runtimes that are compatible with kubelet include containerd (initially supported via Docker), rkt[53] and CRI-O.

kube-proxy

kube-proxy is an implementation of a network proxy and a load balancer, and it supports the service abstraction along with the other networking operations.[32] It is responsible for routing traffic to the appropriate container based on IP and port number of the incoming request.

Namespaces

In Kubernetes, namespaces are utilized to segregate the resources it handles into distinct and non-intersecting collections.[54] They are intended for use in environments with many users spread across multiple teams, or projects, or even separating environments like development, test, and production.

Pods

The basic scheduling unit in Kubernetes is a pod,[55] which consists of one or more containers that are guaranteed to be co-located on the same node.[32] Each pod in Kubernetes is assigned a unique IP address within the cluster, allowing applications to use ports without the risk of conflict.[56] Within the pod, all containers can reference each other.

A container resides inside a pod. The container is the lowest level of a micro-service, which holds the running application, libraries, and their dependencies.

Workloads

Kubernetes supports several abstractions of workloads that are at a higher level over simple pods. This allows users to declaratively define and manage these high-level abstractions, instead of having to manage individual pods by themselves. Several of these abstractions, supported by a standard installation of Kubernetes, are described below.

ReplicaSets, ReplicationControllers and Deployments

A ReplicaSet's purpose is to maintain a stable set of replica pods running at any given time. As such, it is often used to guarantee the availability of a specified number of identical Pods.[57] The ReplicaSet can also be said to be a grouping mechanism that lets Kubernetes maintain the number of instances that have been declared for a given pod. The definition of a ReplicaSet uses a selector, whose evaluation will result in identifying all pods that are associated with it.

A ReplicationController, similar to a ReplicaSet, serves the same purpose and behaves similarly to a ReplicaSet, which is to ensure that there will always be a specified number of pod replicas as desired. The ReplicationController workload was the predecessor of a ReplicaSet, but was eventually deprecated in favor of ReplicaSet to make use of set-based label selectors.[57]

Deployments are a higher-level management mechanism for ReplicaSets. While the ReplicaSet controller manages the scale of the ReplicaSet, the Deployment controller manages what happens to the ReplicaSet – whether an update has to be rolled out, or rolled back, etc. When Deployments are scaled up or down, this results in the declaration of the ReplicaSet changing, and this change in the declared state is managed by the ReplicaSet controller.[38]

StatefulSets

StatefulSets are controllers that enforce the properties of uniqueness and ordering amongst instances of a pod, and can be used to run stateful applications.[58] While scaling stateless applications is only a matter of adding more running pods, doing so for stateful workloads is harder, because the state needs to be preserved if a pod is restarted. If the application is scaled up or down, the state may need to be redistributed.

Databases are an example of stateful workloads. When run in high-availability mode, many databases come with the notion of a primary instance and secondary instances. In this case, the notion of ordering of instances is important. Other applications like Apache Kafka distribute the data amongst their brokers; hence, one broker is not the same as another. In this case, the notion of instance uniqueness is important.

DaemonSets

DaemonSets are responsible for ensuring that a pod is created on every single node in the cluster.[59] Generally, most workloads scale in response to a desired replica count, depending on the availability and performance requirements as needed by the application. However, in other scenarios it may be necessary to deploy a pod to every single node in the cluster, scaling up the number of total pods as nodes are added and garbage collecting them as they are removed. This is particularly helpful for use cases where the workload has some dependency on the actual node or host machine, such as log collection, ingress controllers, and storage services.

Services

Simplified view showing how Services interact with Pod networking in a Kubernetes cluster

A Kubernetes service is a set of pods that work together, such as one tier of a multi-tier application. The set of pods that constitute a service are defined by a label selector.[32] Kubernetes provides two modes of service discovery, using environment variables or using Kubernetes DNS.[60] Service discovery assigns a stable IP address and DNS name to the service, and load balances traffic in a round-robin manner to network connections of that IP address among the pods matching the selector (even as failures cause the pods to move from machine to machine).[56] By default a service is exposed inside a cluster (e.g., back end pods might be grouped into a service, with requests from the front-end pods load-balanced among them), but a service can also be exposed outside a cluster (e.g., for clients to reach front-end pods).[61]

Volumes

Filesystems in the Kubernetes container provide ephemeral storage, by default. This means that a restart of the pod will wipe out any data on such containers, and therefore, this form of storage is quite limiting in anything but trivial applications. A Kubernetes volume[62] provides persistent storage that exists for the lifetime of the pod itself. This storage can also be used as shared disk space for containers within the pod. Volumes are mounted at specific mount points within the container, which are defined by the pod configuration, and cannot mount onto other volumes or link to other volumes. The same volume can be mounted at different points in the file system tree by different containers.

ConfigMaps and Secrets

A common application challenge is deciding where to store and manage configuration information, some of which may contain sensitive data. Configuration data can be anything as fine-grained as individual properties, or coarse-grained information like entire configuration files such as JSON or XML documents. Kubernetes provides two closely related mechanisms to deal with this need, known as ConfigMaps and Secrets, both of which allow for configuration changes to be made without requiring an application rebuild.

The data from ConfigMaps and Secrets will be made available to every single instance of the application to which these objects have been bound via the Deployment. A Secret and/or a ConfigMap is sent to a node only if a pod on that node requires it, which will only be stored in memory on the node. Once the pod that depends on the Secret or ConfigMap is deleted, the in-memory copy of all bound Secrets and ConfigMaps are deleted as well.

The data from a ConfigMap or Secret is accessible to the pod through one of the following ways:[63]

  1. As environment variables, which will be consumed by kubelet from the ConfigMap when the container is launched;
  2. Mounted within a volume accessible within the container's filesystem, which supports automatic reloading without restarting the container.

The biggest difference between a Secret and a ConfigMap is that Secrets are specifically designed for containing secure and confidential data, although they are not encrypted at rest by default, and requires additional setup in order to fully secure the use of Secrets within the cluster.[64] Secrets are often used to store confidential or sensitive data like certificates, credentials to work with image registries, passwords, and ssh keys.

Labels and selectors

Kubernetes enables clients (users or internal components) to attach keys called labels to any API object in the system, such as pods and nodes. Correspondingly, label selectors are queries against labels that resolve to matching objects.[32] When a service is defined, one can define the label selectors that will be used by the service router/load balancer to select the pod instances that the traffic will be routed to. Thus, simply changing the labels of the pods or changing the label selectors on the service can be used to control which pods get traffic and which don't, which can be used to support various deployment patterns like blue–green deployments or A/B testing. This capability to dynamically control how services utilize implementing resources provides a loose coupling within the infrastructure.

For example, if an application's pods have labels for a system tier (with values such as frontend, backend, for example) and a release_track (with values such as canary, production, for example), then an operation on all of backend and canary nodes can use a label selector, such as:[43]

tier=backend AND release_track=canary

Just like labels, field selectors also let one select Kubernetes resources. Unlike labels, the selection is based on the attribute values inherent to the resource being selected, rather than user-defined categorization. metadata.name and metadata.namespace are field selectors that will be present on all Kubernetes objects. Other selectors that can be used depend on the object/resource type.

Add-ons

Add-ons are additional features of the Kubernetes cluster implemented as applications running within it. The pods may be managed by Deployments, ReplicationControllers, and so on. There are many add-ons. Some of the more important are:

DNS
Cluster DNS is a DNS server, in addition to the other DNS server(s) in the environment, which serves DNS records for Kubernetes services. Containers started by Kubernetes automatically include this DNS server in their DNS searches.
Web UI
This is a general purpose, web-based UI for Kubernetes clusters. It allows administrators to manage and troubleshoot applications running in the cluster, as well as the cluster itself.
Resource monitoring
Container Resource Monitoring records metrics about containers in a central database, and provides a UI for browsing that data.
Cost monitoring
Kubernetes cost monitoring applications allow breakdown of costs by pods, nodes, namespaces, and labels.
Cluster-level logging
To prevent the loss of event data in the event of node or pod failures, container logs can be saved to a central log store with a search/browsing interface. Kubernetes provides no native storage for log data, but one can integrate many existing logging solutions into the Kubernetes cluster.

Storage

Containers emerged as a way to make software portable. The container contains all the packages needed to run a service. The provided file system makes containers extremely portable and easy to use in development. A container can be moved from development to test or production with no or relatively few configuration changes.

Historically Kubernetes was suitable only for stateless services. However, many applications have a database, which requires persistence, which leads to the creation of persistent storage for Kubernetes. Implementing persistent storage for containers is one of the top challenges of Kubernetes administrators, DevOps and cloud engineers. Containers may be ephemeral, but more and more of their data is not, so one needs to ensure the data's survival in case of container termination or hardware failure. When deploying containers with Kubernetes or containerized applications, companies often realize that they need persistent storage. They need to provide fast and reliable storage for databases, root images and other data used by the containers.

In addition to the landscape, the Cloud Native Computing Foundation (CNCF), has published other information about Kubernetes Persistent Storage including a blog helping to define the container attached storage pattern. This pattern can be thought of as one that uses Kubernetes itself as a component of the storage system or service.[65]

More information about the relative popularity of these and other approaches can be found on the CNCF's landscape survey as well, which showed that OpenEBS – a Stateful Persistent Storage platform from Datacore Software,[66] and Rook – a storage orchestration project – were the two projects most likely to be in evaluation as of the Fall of 2019.[67]

Container Attached Storage is a type of data storage that emerged as Kubernetes gained prominence. The Container Attached Storage approach or pattern relies on Kubernetes itself for certain capabilities while delivering primarily block, file, object and interfaces to workloads running on Kubernetes.[68]

Common attributes of Container Attached Storage include the use of extensions to Kubernetes, such as custom resource definitions, and the use of Kubernetes itself for functions that otherwise would be separately developed and deployed for storage or data management. Examples of functionality delivered by custom resource definitions or by Kubernetes itself include retry logic, delivered by Kubernetes itself, and the creation and maintenance of an inventory of available storage media and volumes, typically delivered via a custom resource definition.[69][70]

Container Storage Interface (CSI)

In Kubernetes version 1.9, the initial Alpha release of Container Storage Interface (CSI) was introduced.[71] Previously, storage volume plug-ins were included in the Kubernetes distribution. By creating a standardized CSI, the code required to interface with external storage systems was separated from the core Kubernetes code base. Just one year later, the CSI feature was made Generally Available (GA) in Kubernetes.[72]

API

A key component of the Kubernetes control plane is the API Server, which exposes an HTTP API that can be invoked by other parts of the cluster as well as end users and external components. This API is a REST API and is declarative in nature, and is the same API exposed to the control plane.[73] The API server is backed by etcd to store all records persistently.[74]

API objects

In Kubernetes, all objects serve as the "record of intent" of the cluster's state, and are able to define the desired state that the writer of the object wishes for the cluster to be in.[75] As such, most Kubernetes objects have the same set of nested fields, as follows:

  • spec: Describes the desired state of the resource, which can be controlled by end users, or other higher-level controllers;
  • status: Describes the current state of the resource, which is actively updated by the controller of the resource.

All objects in Kubernetes are subject to the same API conventions. Some of these include:

  • Must have the following metadata under the nested object field metadata:[76]
    • namespace: a label that objects are subdivided into;
    • name: a string that uniquely identifies the object within the defined namespace;
    • uid: a unique string that is able to distinguish between objects with the same name across space and time (even across deletions and recreations with the same name).
  • May be managed by another controller, which is defined in the metadata.ownerReferences field:[77]
    • At most one other object shall be the managing controller of the controllee object, which is defined by the controller field.
  • May be garbage collected if the owner is deleted:[78]
    • When an object is deleted, all dependent objects may also be deleted in a cascading fashion.

Custom resources, controllers and operators

The Kubernetes API can be extended using Custom Resources, which represent objects that are not part of the standard Kubernetes installation. These custom resources are declared using Custom Resource Definitions (CRDs), which is a kind of resource that can be dynamically registered and unregistered without shutting down or restarting a cluster that is currently running.[79]

Custom controllers are another extension mechanism that interact with the Kubernetes API, similar to the default controllers in the standard pre-installed Kubernetes controller manager. These controllers may interact with custom resources to allow for a declarative API: users may declare the desired state of the world via the custom resources, and it is the responsibility of the custom controller to observe the change and reconcile it.

The combination of custom resources and custom controllers are often referred to as a Kubernetes Operator. The key use case for operators are to capture the aim of a human operator who is managing a service or set of services and to implement them using automation, and with a declarative API supporting this automation. Human operators who look after specific applications and services have deep knowledge of how the system ought to behave, how to deploy it, and how to react if there are problems.

Examples of problems solved by operators include taking and restoring backups of that application's state, and handling upgrades of the application code alongside related changes such as database schemas or extra configuration settings. Several notable projects under the Cloud Native Computing Foundation's incubation program follow the operator pattern to extend Kubernetes, including Argo, Open Policy Agent and Istio.[80]

API security

Kubernetes defines the following strategies for controlling access to its API.[81]

Transport security

The Kubernetes API server listens on a TCP port that serves HTTPS traffic, in order to enforce transport layer security (TLS) using CA certificates.[34]

In older versions of Kubernetes, the API server supported listening on both HTTP and HTTPS ports (with the HTTP port number having no transport security whatsoever). This was deprecated in v1.10 and eventually dropped support in v1.20 of Kubernetes.[82]

Authentication

All requests made to the Kubernetes API server are expected to be authenticated, and supports several authentication strategies, some of which are listed below:[83]

  1. X.509 client certificates
  2. Bearer tokens
  3. Service account tokens, intended for programmatic API access

Users are typically expected to indicate and define cluster URL details along with the necessary credentials in a kubeconfig file, which are natively supported by other Kubernetes tools like kubectl and the official Kubernetes client libraries.[84]

Authorization

The Kubernetes API supports the following authorization modes:[85]

  1. Node authorization mode: Grants a fixed list of operations of API requests that kubelets are allowed to perform, in order to function properly.
  2. Attribute-based access control (ABAC) mode: Grants access rights to users through the use of defined access control policies which combine attributes together.
  3. Role-based access control (RBAC) mode: Grants access rights to users based on roles that are granted to the user, where each role defines a list of actions that are allowed.
  4. Webhook mode: Queries a REST API service to determine if a user is authorized to perform a given action.[34]

API clients

Kubernetes supports several official API clients:

Cluster API

The same API design principles have been used to define an API to programmatically create, configure, and manage Kubernetes clusters. This is called the Cluster API.[88] A key concept embodied in the API is using Infrastructure as Software, or the notion that the Kubernetes cluster infrastructure is itself a resource / object that can be managed just like any other Kubernetes resources. Similarly, machines that make up the cluster are also treated as a Kubernetes resource. The API has two pieces – the core API, and a provider implementation. The provider implementation consists of cloud-provider specific functions that let Kubernetes provide the cluster API in a fashion that is well-integrated with the cloud-provider's services and resources.[34]

Uses

Kubernetes is commonly used as a way to host a microservice-based implementation, because it and its associated ecosystem of tools provide all the capabilities needed to address key concerns of any microservice architecture.

Distributions

Various vendors offer Kubernetes-based platforms or infrastructure as a service (IaaS) that deploy Kubernetes.[89][90]

These are typically categorized according to open-source, commercial or managed distributions. Several notable distributions are listed below:[91]

Open-source distributions

  • Amazon EKS-D
  • K3s
  • SUSE Rancher Kubernetes Engine (RKE)

Commercial distributions

Managed distributions

  • Alibaba Cloud ACK (Alibaba Cloud Container Service for Kubernetes)
  • Huawei CCE (Huawei Cloud Container Engine)
  • Amazon EKS (Elastic Kubernetes Service)
  • Canonical MicroK8s and Charmed Kubernetes
  • DigitalOcean managed Kubernetes Service
  • Google GKE (Google Kubernetes Engine)
  • IBM Cloud Kubernetes Services
  • Microsoft AKS (Azure Kubernetes Services)
  • Oracle Container Engine for Kubernetes
  • Platform9 Managed Kubernetes
  • Wind River Systems Wind River Studio

Release timeline

Release timeline
Version Release date End of Life date[92] Notes
1.0 10 July 2015 Original Release
1.1 9 November 2015 [93]
1.2 16 March 2016 23 October 2016 [94]
1.3 1 July 2016 1 November 2016 [95]
1.4 26 September 2016 21 April 2017 [96]
1.5 12 December 2016 1 October 2017 [97]
1.6 28 March 2017 23 November 2017 [98]
1.7 30 June 2017 4 April 2018 [99]
1.8 28 August 2017 12 July 2018 [100]
1.9 15 December 2017 29 September 2018 [101]
1.10 28 March 2018 13 February 2019 [102]
1.11 3 July 2018 1 May 2019 [103]
1.12 27 September 2018 8 July 2019 [104]
1.13 3 December 2018 15 October 2019 [105]
1.14 25 March 2019 11 December 2019 [106]
1.15 20 June 2019 6 May 2020 [107]
1.16 22 October 2019 2 September 2020 [108]
1.17 9 December 2019 13 January 2021 [109]
1.18 25 March 2020 18 June 2021 [110]
1.19 26 August 2020[111] 28 October 2021 From Kubernetes version 1.19 on, the support window has been extended to one year of full support plus two months of maintenance mode period.[29]
[112]
1.20 8 December 2020 28 February 2022 [113]
1.21 8 April 2021 28 June 2022 [114]
1.22 4 August 2021 28 October 2022 [115]
1.23 7 December 2021 28 February 2023 [116]
1.24 3 May 2022 28 July 2023 [117]
1.25 23 August 2022 27 October 2023 [118]
1.26 9 December 2022 24 February 2024 [119]
1.27 11 April 2023 28 June 2024 [120]
1.28 15 August 2023 28 October 2024 [121]
1.29 13 December 2023 28 February 2025 [122]
{{{2}}}

Support windows

The chart below visualizes the period for which each release is/was supported[92] <timeline> ImageSize = width:1000 height:auto barincrement:35 PlotArea = left:100 right:50 bottom:30 top:10

DateFormat = dd/mm/yyyy Period = from:01/12/2018 till:28/02/2025 TimeAxis = orientation:horizontal ScaleMajor = unit:year increment:1 start:2019 ScaleMinor = unit:month increment:1 start:01/01/2019

Define $dx = 25 # shift text to right side of bar

Colors =

 id:out_of_support value:rgb(0.992,0.702,0.671) legend:Out_of_support
 id:in-support     value:rgb(0.996,0.973,0.776) legend:In_support
 id:latest         value:rgb(0.831,0.957,0.706) legend:Latest_stable_version
 id:prerelease     value:rgb(0.996,0.82,0.627)  legend:Preview_version

PlotData=

 mark:(line,black)
 fontsize:S
 bar:1.29.x from:13/12/2023 till:28/02/2025 text:1.29.x color:latest
 bar:1.28.x from:15/08/2023 till:28/10/2024 text:1.28.x color:in-support
 bar:1.27.x from:11/04/2023 till:30/05/2024 text:1.27.x color:in-support
 bar:1.26.x from:09/12/2022 till:24/02/2024 text:1.26.x color:in-support
 bar:1.25.x from:23/08/2022 till:27/10/2023 text:1.25.x color:out_of_support
 bar:1.24.x from:03/05/2022 till:28/07/2023 text:1.24.x color:out_of_support
 bar:1.23.x from:07/12/2021 till:28/02/2023 text:1.23.x color:out_of_support
 bar:1.22.x from:04/08/2021 till:28/10/2022 text:1.22.x color:out_of_support
 bar:1.21.x from:08/04/2021 till:28/06/2022 text:1.21.x color:out_of_support
 bar:1.20.x from:08/12/2020 till:28/02/2022 text:1.20.x color:out_of_support
 bar:1.19.x from:26/08/2020 till:28/10/2021 text:1.19.x color:out_of_support
 bar:1.18.x from:25/03/2020 till:30/04/2021 text:1.18.x color:out_of_support
 bar:1.17.x from:09/12/2019 till:30/01/2021 text:1.17.x color:out_of_support
 bar:1.16.x from:18/09/2019 till:25/08/2020 text:1.16.x color:out_of_support
 bar:1.15.x from:19/06/2019 till:23/03/2020 text:1.15.x color:out_of_support
 bar:1.14.x from:25/03/2019 till:09/12/2019 text:1.14.x color:out_of_support
 bar:1.13.x from:03/12/2018 till:18/09/2019 text:1.13.x color:out_of_support

</timeline>

See also

References

  1. "v0.2". github.com. 2014-09-09. https://github.com/kubernetes/kubernetes/commit/a0abb3815755d6a77eed2d07bb0aa7d255e4e769. 
  2. "Kubernetes GitHub Repository". January 22, 2021. https://github.com/kubernetes/kubernetes. 
  3. "kubernetes/kubernetes" (in en-US). http://github.com/kubernetes/kubernetes/. 
  4. 4.0 4.1 "What is Kubernetes?". https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/. 
  5. "Overview Kubernetes" (in en). https://kubernetes.io/docs/concepts/overview/. 
  6. "Container runtimes" (in en). https://kubernetes.io/docs/setup/production-environment/container-runtimes/. 
  7. "Turnkey Cloud Solutions". https://kubernetes.io/docs/setup/production-environment/turnkey-solutions/. 
  8. 8.0 8.1 Metz, Cade. "Google Open Sources Its Secret Weapon in Cloud Computing". Wired. https://www.wired.com/2014/06/google-kubernetes/. Retrieved 24 September 2015. 
  9. Metz, Cade. "Google Made Its Secret Blueprint Public to Boost Its Cloud" (in en-US). Wired. https://www.wired.com/2015/06/google-kubernetes-says-future-cloud-computing/. Retrieved 2016-06-27. 
  10. Burns, Brendan (July 20, 2018), The History of Kubernetes & the Community Behind It, https://kubernetes.io/blog/2018/07/20/the-history-of-kubernetes-the-community-behind-it/ 
  11. (in en) Kubernetes: The Documentary [PART 1], https://www.youtube.com/watch?v=BE77h7dmoQU, retrieved 2023-12-14 
  12. "https://twitter.com/kelseyhightower/status/1527333243845873664" (in en). https://twitter.com/kelseyhightower/status/1527333243845873664. 
  13. 13.0 13.1 Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes (April 21–24, 2015). "Large-scale cluster management at Google with Borg". Proceedings of the European Conference on Computer Systems (EuroSys). https://research.google.com/pubs/pub43438.html. 
  14. "Borg, Omega, and Kubernetes - ACM Queue". http://queue.acm.org/detail.cfm?id=2898444. 
  15. "Early Stage Startup Heptio Aims to Make Kubernetes Friendly". https://www.eweek.com/cloud/early-stage-startup-heptio-aims-to-make-kubernetes-friendly. 
  16. "As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation". 21 July 2015. https://techcrunch.com/2015/07/21/as-kubernetes-hits-1-0-google-donates-technology-to-newly-formed-cloud-native-computing-foundation-with-ibm-intel-twitter-and-others/. 
  17. "Cloud Native Computing Foundation". https://cncf.io/. 
  18. "Release v1.0: Merge pull request #277 from jackgr/master · helm/helm" (in en). https://github.com/helm/helm/releases/tag/v1.0. 
  19. "Helm (package manager) - wikieduonline". https://www.wikieduonline.com/wiki/Helm_(package_manager). 
  20. "Helm" (in en-us). https://helm.sh/. 
  21. "Red Hat and Google collaborate on Kubernetes to manage Docker containers at scale". 2014-07-10. https://www.redhat.com/en/blog/red-hat-and-google-collaborate-kubernetes-manage-docker-containers-scale. 
  22. "VMware and Pivotal Launch Pivotal Container Service (PKS) and Collaborate with Google Cloud to Bring Kubernetes to Enterprise Customers". 2017-08-29. https://news.vmware.com/releases/vmware-and-pivotal-launch-pivotal-container-service-pks-and-collaborate-with-google-cloud-to-bring-kubernetes-to-enterprise-customers. 
  23. Lardinois, Frederic (2017-09-06). "Mesosphere adds Kubernetes support to its data center operating system". https://techcrunch.com/2017/09/06/mesosphere-says-its-not-bowing-to-kubernetes. 
  24. "Docker Announces Enhancements to the Docker Platform to Simplify and Advance the Management of Kubernetes for Enterprise IT". 2017-10-17. https://www.docker.com/docker-news-and-press/docker-announces-enhancements-docker-platform-simplify-and-advance-management. 
  25. Monroy, Gabe (2017-10-24). "Introducing AKS (managed Kubernetes) and Azure Container Registry improvements". https://azure.microsoft.com/fr-fr/blog/introducing-azure-container-service-aks-managed-kubernetes-and-azure-container-registry-geo-replication/. 
  26. "Introducing Amazon Elastic Container Service for Kubernetes (Preview)". 2017-11-29. https://aws.amazon.com/about-aws/whats-new/2017/11/introducing-amazon-elastic-container-service-for-kubernetes/. 
  27. Conway, Sarah (6 March 2018). "Kubernetes Is First CNCF Project To Graduate" (in en). https://www.cncf.io/blog/2018/03/06/kubernetes-first-cncf-project-graduate/. "Compared to the 1.5 million projects on GitHub, Kubernetes is No. 9 for commits and No. 2 for authors/issues, second only to Linux." 
  28. "Kubernetes version and version skew support policy". https://kubernetes.io/docs/setup/release/version-skew-policy/. 
  29. 29.0 29.1 "Kubernetes 1.19 Release Announcement > Increase Kubernetes support window to one year". 26 August 2020. https://kubernetes.io/blog/2020/08/26/kubernetes-release-1.19-accentuate-the-paw-sitive/#increase-kubernetes-support-window-to-one-year. 
  30. Sharma, Priyanka (13 April 2017). "Autoscaling based on CPU/Memory in Kubernetes—Part II". Medium. https://blog.powerupcloud.com/autoscaling-based-on-cpu-memory-in-kubernetes-part-ii-fe2e495bddd4. 
  31. "Configure Kubernetes Autoscaling With Custom Metrics". BitRock. 15 November 2018. https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/. 
  32. 32.0 32.1 32.2 32.3 32.4 32.5 32.6 32.7 "An Introduction to Kubernetes". https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes. 
  33. 33.0 33.1 33.2 "Kubernetes Infrastructure". OpenShift. https://docs.openshift.org/latest/architecture/infrastructure_components/kubernetes_infrastructure.html. 
  34. 34.0 34.1 34.2 34.3 34.4 "Kubernetes Hardening Guide". https://media.defense.gov/2022/Aug/29/2003066362/-1/-1/0/CTR_KUBERNETES_HARDENING_GUIDANCE_1.2_20220829.PDF. 
  35. Container Linux by CoreOS: Cluster infrastructure
  36. 36.0 36.1 Marhubi, Kamal (2015-09-26). "Kubernetes from the ground up: API server". kamalmarhubi.com. http://kamalmarhubi.com/blog/2015/09/06/kubernetes-from-the-ground-up-the-api-server/. 
  37. Ellingwood, Justin (2 May 2018). "An Introduction to Kubernetes" (in en). https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes. "One of the most important primary services is an API server. This is the main management point of the entire cluster as it allows a user to configure Kubernetes' workloads and organizational units. It is also responsible for making sure that the etcd store and the service details of deployed containers are in agreement. It acts as the bridge between various components to maintain cluster health and disseminate information and commands." 
  38. 38.0 38.1 "Deployments" (in en). https://kubernetes.io/docs/concepts/workloads/controllers/deployment/. 
  39. "The Three Pillars of Kubernetes Container Orchestration - Rancher Labs". 18 May 2017. http://rancher.com/three-pillars-kubernetes-container-orchestration/. 
  40. "Scheduling Framework". https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/. 
  41. 41.0 41.1 "Overview of a Replication Controller". Documentation. CoreOS. https://coreos.com/kubernetes/docs/latest/replication-controller.html. 
  42. Sanders, Jake (2015-10-02). "Kubernetes: Exciting Experimental Features". Livewyer. http://www.livewyer.com/blog/2015/10/02/kubernetes-exciting-experimental-features. 
  43. 43.0 43.1 "Intro: Docker and Kubernetes training - Day 2". Red Hat. 2015-10-20. http://christianposta.com/slides/docker/generated/day2.html#/label-examples. 
  44. Marhubi, Kamal (2015-08-27). "What [.. is a Kubelet?"]. kamalmarhubi.com. http://kamalmarhubi.com/blog/2015/08/27/what-even-is-a-kubelet/. 
  45. "Kubernetes Security | Issues and Best Practices | Snyk" (in en-US). 26 July 2020. https://snyk.io/learn/kubernetes-security/. 
  46. 46.0 46.1 "Introducing Container Runtime Interface (CRI) in Kubernetes" (in en). 2016-12-19. https://kubernetes.io/blog/2016/12/Container-Runtime-Interface-Cri-In-Kubernetes/. 
  47. "Container Runtime Interface (CRI)". https://kubernetes.io/docs/concepts/architecture/cri/. 
  48. "Kubernetes v1.12: Introducing RuntimeClass". 10 October 2018. https://kubernetes.io/blog/2018/10/10/kubernetes-v1.12-introducing-runtimeclass/. 
  49. "Deprecate Dockershim - Kubernetes Github repository - PR 94624". https://github.com/kubernetes/kubernetes/pull/94624. 
  50. "Don't Panic: Kubernetes and Docker" (in en). 2 December 2020. https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/. 
  51. "kubernetes/community" (in en). https://github.com/kubernetes/community. 
  52. "Updated: Dockershim Removal FAQ". 17 February 2022. https://kubernetes.io/blog/2022/02/17/dockershim-faq/. 
  53. "rktnetes brings rkt container engine to Kubernetes". 11 July 2016. https://kubernetes.io/blog/2016/07/rktnetes-brings-rkt-container-engine-to-kubernetes/. 
  54. "Namespaces". https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/. 
  55. "Pods". https://kubernetes.io/docs/concepts/workloads/pods/pod/. 
  56. 56.0 56.1 Langemak, Jon (2015-02-11). "Kubernetes 101 – Networking". Das Blinken Lichten. http://www.dasblinkenlichten.com/kubernetes-101-networking/. 
  57. 57.0 57.1 "ReplicaSet" (in en). https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/. 
  58. "StatefulSets". https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/. 
  59. "DaemonSet". https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/. 
  60. "Service". https://kubernetes.io/docs/concepts/services-networking/service/. 
  61. Langemak, Jon (2015-02-15). "Kubernetes 101 – External Access Into The Cluster". Das Blinken Lichten. http://www.dasblinkenlichten.com/kubernetes-101-external-access-into-the-cluster/. 
  62. "Volumes". https://kubernetes.io/docs/concepts/storage/volumes/. 
  63. "ConfigMaps". https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically. 
  64. "Secrets" (in en). https://kubernetes.io/docs/concepts/configuration/secret/. 
  65. "Container Attached Storage: A primer" (in en-US). 2018-04-19. https://www.cncf.io/blog/2018/04/19/container-attached-storage-a-primer/. 
  66. "Dataore Acquired MayaData original developer of OpenEBS". 18 November 2021. https://www.datacore.com/news-post/datacore-acquires-mayadata. 
  67. "CNCF SURVEY 2019". https://www.cncf.io/wp-content/uploads/2020/08/CNCF_Survey_Report.pdf. 
  68. "Container Attached Storage: A primer" (in en-US). 2018-04-19. https://www.cncf.io/blog/2018/04/19/container-attached-storage-a-primer/. 
  69. "Container Attached Storage | SNIA". https://www.snia.org/educational-library/container-attached-storage-2018. 
  70. "Cloud Native Application Checklist: Cloud Native Storage" (in en). https://www.replex.io/blog/cloud-native-application-checklist-cloud-native-storage. 
  71. "Introducing Container Storage Interface (CSI) Alpha for Kubernetes". 10 January 2018. https://kubernetes.io/blog/2018/01/introducing-container-storage-interface/. 
  72. "Container Storage Interface (CSI) for Kubernetes GA". 15 January 2019. https://kubernetes.io/blog/2019/01/15/container-storage-interface-ga/. 
  73. Marinescu, Dan C. (2018-01-01), Marinescu, Dan C., ed., "Chapter 8 - Cloud Hardware and Software", Cloud Computing (Second Edition) (Morgan Kaufmann): pp. 281–319, doi:10.1016/b978-0-12-812810-7.00011-x, ISBN 978-0-12-812810-7, https://www.sciencedirect.com/science/article/pii/B978012812810700011X, retrieved 2023-11-08 
  74. "Operating etcd clusters for Kubernetes". https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/. 
  75. "Objects In Kubernetes". https://kubernetes.io/docs/concepts/overview/working-with-objects/. 
  76. "API Conventions". Kubernetes. https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata. 
  77. "Owners and Dependents". https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/. 
  78. "Garbage Collection". https://kubernetes.io/docs/concepts/architecture/garbage-collection/. 
  79. "Custom Resources". https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/. 
  80. "Cloud Native Landscape". https://landscape.cncf.io/. 
  81. "Controlling Access to the Kubernetes API". https://kubernetes.io/docs/concepts/security/controlling-access/. 
  82. "Remove the apiserver insecure port · Issue #91506 · kubernetes/kubernetes". https://github.com/kubernetes/kubernetes/issues/91506. 
  83. "Authorization". https://kubernetes.io/docs/reference/access-authn-authz/authorization/. 
  84. "Organizing Cluster Access Using kubeconfig Files". https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/. 
  85. "Authorization Overview". https://kubernetes.io/docs/reference/access-authn-authz/authorization/. 
  86. "Command line tool (kubectl)". https://kubernetes.io/docs/reference/kubectl/. 
  87. "Client Libraries". https://kubernetes.io/docs/reference/using-api/client-libraries/. 
  88. "Introduction - The Cluster API Book". https://cluster-api.sigs.k8s.io/. 
  89. "The 7 Most Popular Kubernetes Distributions" (in en). https://www.containiq.com/post/popular-kubernetes-distributions/. 
  90. MSV, Janakiram. "Why Kubernetes Developer Ecosystem Needs A PaaS" (in en). https://www.forbes.com/sites/janakirammsv/2021/04/12/why-kubernetes-developer-ecosystem-needs-a-paas/. 
  91. "5 Cloud Native Trends to Watch out for in 2022" (in en-US). 2022-01-03. https://thenewstack.io/5-cloud-native-trends-to-watch-out-for-in-2022/. 
  92. 92.0 92.1 "Kubernetes Patch Releases". 4 May 2022. https://git.k8s.io/website/content/en/releases/patch-releases.md. 
  93. "Kubernetes 1.1 Performance upgrades, improved tooling and a growing community". November 9, 2015. https://kubernetes.io/blog/2015/11/Kubernetes-1-1-Performance-Upgrades-Improved-Tooling-And-A-Growing-Community/. 
  94. "Kubernetes 1.2: Even more performance upgrades, plus easier application deployment and management". March 17, 2016. https://kubernetes.io/blog/2016/03/Kubernetes-1-2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management/. 
  95. "Kubernetes 1.3: Bridging Cloud Native and Enterprise Workloads". July 6, 2016. https://kubernetes.io/blog/2016/07/Kubernetes-1-3-Bridging-Cloud-Native-And-Enterprise-Workloads/. 
  96. "Kubernetes 1.4: Making it easy to run on Kubernetes anywhere". September 26, 2016. https://kubernetes.io/blog/2016/09/Kubernetes-1-4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere/. 
  97. "Kubernetes 1.5: Supporting Production Workloads". December 13, 2016. https://kubernetes.io/blog/2016/12/Kubernetes-1-5-Supporting-Production-Workloads/. 
  98. "Kubernetes 1.6: Multi-user, Multi-workloads at Scale". March 28, 2017. https://kubernetes.io/blog/2017/03/Kubernetes-1-6-Multi-User-Multi-Workloads-At-Scale/. 
  99. "Kubernetes 1.7: Security Hardening, Stateful Application Updates and Extensibility". June 30, 2017. https://kubernetes.io/blog/2017/06/Kubernetes-1-7-Security-Hardening-Stateful-Application-Extensibility-Updates/. 
  100. "Kubernetes 1.8: Security, Workloads and Feature Depth". September 29, 2017. https://kubernetes.io/blog/2017/09/Kubernetes-18-Security-Workloads-And/. 
  101. "Kubernetes 1.9: Apps Workloads GA and Expanded Ecosystem". December 15, 2017. https://kubernetes.io/blog/2017/12/Kubernetes-19-Workloads-Expanded-Ecosystem/. 
  102. "Kubernetes 1.10: Stabilizing Storage, Security, and Networking". March 26, 2018. https://kubernetes.io/blog/2018/03/26/kubernetes-1.10-stabilizing-storage-security-networking/. 
  103. "Kubernetes 1.11: In-Cluster Load Balancing and CoreDNS Plugin Graduate to General Availability". June 27, 2018. https://kubernetes.io/blog/2018/06/27/kubernetes-1.11-release-announcement/. 
  104. "Kubernetes 1.12: Kubelet TLS Bootstrap and Azure Virtual Machine Scale Sets (VMSS) Move to General Availability". September 27, 2018. https://kubernetes.io/blog/2018/09/27/kubernetes-1.12-kubelet-tls-bootstrap-and-azure-virtual-machine-scale-sets-vmss-move-to-general-availability/. 
  105. "Kubernetes 1.13: Simplified Cluster Management with Kubeadm, Container Storage Interface (CSI), and CoreDNS as Default DNS are Now Generally Available". December 3, 2018. https://kubernetes.io/blog/2018/12/03/kubernetes-1-13-release-announcement/. 
  106. "Kubernetes 1.14: Production-level support for Windows Nodes, Kubectl Updates, Persistent Local Volumes GA". March 25, 2019. https://kubernetes.io/blog/2019/03/25/kubernetes-1-14-release-announcement/. 
  107. "Kubernetes 1.15: Extensibility and Continuous Improvement". June 19, 2019. https://kubernetes.io/blog/2019/06/19/kubernetes-1-15-release-announcement/. 
  108. "Kubernetes 1.16: Custom Resources, Overhauled Metrics, and Volume Extensions". September 18, 2019. https://kubernetes.io/blog/2019/09/18/kubernetes-1-16-release-announcement/. 
  109. "Kubernetes 1.17: Stability". December 9, 2019. https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-release-announcement/. 
  110. "Kubernetes 1.18: Fit & Finish". March 25, 2020. https://kubernetes.io/blog/2020/03/25/kubernetes-1-18-release-announcement/. 
  111. "Kubernetes 1.19 Release Announcement". 26 August 2020. https://kubernetes.io/blog/2020/08/26/kubernetes-release-1.19-accentuate-the-paw-sitive/. 
  112. "Kubernetes 1.19: Accentuate the Paw-sitive". 2020-08-26. https://kubernetes.io/blog/2020/08/26/kubernetes-release-1.19-accentuate-the-paw-sitive/. 
  113. "Kubernetes 1.20: The Raddest Release". December 8, 2020. https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/. 
  114. "Kubernetes 1.21: Power to the Community". April 8, 2021. https://kubernetes.io/blog/2021/04/08/kubernetes-1-21-release-announcement/. 
  115. "Kubernetes 1.22: Reaching New Peaks". August 4, 2021. https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/. 
  116. "Kubernetes 1.23: The Next Frontier". December 7, 2021. https://kubernetes.io/blog/2021/12/07/kubernetes-1-23-release-announcement/. 
  117. "Kubernetes 1.24: Stargazer". May 3, 2022. https://kubernetes.io/blog/2022/05/03/kubernetes-1-24-release-announcement/. 
  118. "Kubernetes v1.25: Combiner". August 23, 2022. https://kubernetes.io/blog/2022/08/23/kubernetes-v1-25-release/. 
  119. "Kubernetes v1.26: Electrifying". December 9, 2022. https://kubernetes.io/blog/2022/12/09/kubernetes-v1-26-release/. 
  120. "Kubernetes v1.27: Chill Vibes". April 11, 2023. https://kubernetes.io/blog/2023/04/11/kubernetes-v1-27-release/. 
  121. "Kubernetes v1.28: Planternetes". August 15, 2023. https://kubernetes.io/blog/2023/08/15/kubernetes-v1-28-release/. 
  122. "Kubernetes v1.29: Mandala". December 13, 2023. https://kubernetes.io/blog/2023/12/13/kubernetes-v1-29-release/. 

External links