Shoot K8S Version Management
Downgrading
Downgrading is currently not supported.
What to do if lower version is needed?
Deploy new Shoot with one of lower versions which are supported by us.
What to do, if upgrade is needed and we want to test it?
- Deploy another
test shoot, with same version of K8S as you have on the Shoot cluster you want to upgrade. - Deploy applications you want/need to test on newer version
to Shoot cluster from step
1. - Upgrade Shoot cluster from step
1.to desired K8S version. - Delete Shoot cluster from step
1. - Upgrade your existing cluster.
Upgrading
Before upgrading
Check if Sconified services, especially CAS is running in your cluster. If so, follow the steps described in Upgrade K8s on Shoot Cluster with running CAS.
Check supported K8S versions via kubectl directly on Garden cluster
or in the OSC Dashboard (described later).
How to check directly on Garden cluster via kubectl
Execute following command:
example output of previous command:
Use grep to search for specific version, as on example below:
To upgrade K8S version, you can safely do it through OSC Dashboard
or by updating shoot yaml in the project namespace on garden cluster.
Through OSC Dashboard
-
Open the OSC Dashboard. In the list of Shoot cluster find the cluster you want to upgrade. Then as you can see on picture below follow these steps:
-
Open the Actions menu for the Shoot you want to update.
-
Select
Update Cluster.
-
From the drop-down menu
Upgrade to versionchoose accordingly from available upgrade options based on your desired K8S version.There is possibility, that you will need to upgrade more times, for example if shoot K8S version is 1.23.x and we want to upgrade to 1.26.x we would see in drop-down menu something like this, and we would need to upgrade first to 1.24.x, then 1.25.x and then 1.26.x:
- 1.23.x → 1.24.x
- 1.24.x → 1.25.x
- 1.25.x → 1.26.x
-
Then write or copy/paste shoot name for confirmation in the bottom-left field.
-
Click
UPDATEbutton to trigger the update which should be completed within some minutes.
Through Shoot Manifest
This can be done in OSC Dashboard
and via kubectl directly on the Garden cluster.
In OSC Dashboard
-
Click on the Shoot name in the list as shown on picture below.

-
Click on YAML

-
Search for the version and re-write it to your desired version as shown in picture below:

On Garden Cluster using Kubectl
-
List Shoot clusters by using
kubectl get shoots.core.gardener.cloud -Aas in Example.Example:
-
Edit the same field
version:in the Shoot manifest. To do it we can use following command: -
Save by
:wq!and wait for reconciliation to finish.We could do it locally by getting yaml from the cluster executing:
then edit and save the manifest and apply it on the cluster using:
Upgrade K8s on Shoot Cluster with running CAS
Upgrading a Shoot cluster with running CAS (Configuration and Attestation Service) instances require special attention because the CAS is tightly coupled to the physical nodes it runs on. This coupling is due to the CAS database key being encrypted with a CPU-specific seal key - meaning the key material needed to access the CAS database is only available on the original host's CPU. As a result, if a CAS instance is moved or restarted on a different node (as often happens during upgrades or node replacements in cloud-native environments), it cannot decrypt its own data, leading to potential data inaccessibility or service disruption. This tight binding to hardware complicates cloud-native management, where practices like automated scaling, rolling upgrades, and node replacements are common.
To ensure a smooth upgrade process, we recommend migrating the CAS instances to a new worker pool before upgrading the Shoot cluster.

The steps to follow are:
- Create a backup of the CAS database.
- Downscale nodes in the origin worker pool.
- Create new temporary worker pool.
- Migrate CAS pod to a node in the newly created worker pool.
- Upgrade the origin worker pool to target version.
- Migrate CAS back to origin worker pool.
- Delete temporary worker pool.
- Upscale nodes in origin worker pool.
Steps
Create a backup of the CAS database
Before starting the upgrade process, it is crucial to create a backup of the CAS database. This ensures that you have a restore point in case anything goes wrong during the upgrade process. Please consult to the Scone User Guide on how to create a backup of the CAS database.
Downscale nodes in origin worker pool
If the limit of workers is reached in the Shoot cluster, we need to downscale so that at least 3 nodes can be added to the new temporary worker pool.
-
Check if we can at least create 3 nodes in the Shoot Cluster
According to Determining Available IP Addresses in a Shoot Cluster verify at least 3 IP Addresses are available in the Shoot Cluster.
-
Scaling down the workergroup
If there are not at least 3 IP Addresses available, you need to decrease the number of nodes in the Shoot cluster by scaling down first.
Create a new temporary worker pool
Create a new worker pool with 3 nodes (1 node in each availability zone). This new worker pool will be used to migrate the CAS instances.
-
Create additional worker pool with 3 nodes (one node in each Availability Zone)
Please duplicate the specification of the current worker pool and adjust the fields below. This can be done with yaml-view of the worker group within the OSC Dashboard.
spec.provider.workers[].kubernetes.version:1.XX.xxThis version of the kubernetes nodes needs to be pinned to current version. This is crucial - add this field if it is not present.spec.provider.workers[].name:pool-tmpspec.provider.workers[].minimum:3spec.provider.workers[].maximum:3
The yaml should look like this:
This snippet can be added through OSC Dashboard or directly on Garden Cluster into Shoot Cluster YAML manifest, please see the section on worker pool management.
-
Save the Shoot configuration and wait for reconciliation to finish.
It should have created 3 new worker nodes in temporary worker pool. Check if worker nodes from temporary worker pool were created and joined into the cluster.
The additional worker pool should be in
Readystate. -
Check if CAS is healthy and additional worker nodes are registered to host the CAS
If you are running multiple CAS instances, verify that all instances are healthy and registered to the new worker pool.
Migrate CAS pod to a node in the newly created worker pool
Since CAS 5.9.0 pods tolerate nodes which are tainted
node.kubernetes.io/unschedulable:NoSchedule we cannot only cordon/uncordon
the nodes in the origin worker pool. We would better taint the nodes in the origin
worker pool and delete the CAS pod to force it to reschedule on a node in the
new temporary worker pool.
-
Migrate CAS pod to a node of the new temporary worker pool.
Upgrade the origin worker pool to target version
Perform the upgrade on the original worker pool to the desired Kubernetes version or configuration. Ensure that the upgrade process does not disrupt the running CAS instances by keeping them on the temporary pool during this phase.
-
Proceed with update of Shoot Cluster by following the steps k8s-version-management.
Wait for the all the nodes in worker pool in
pool-workerto be upgraded and healthy. -
Check if the worker nodes are healthy and running the desired version of Kubernetes
-
Check if CAS is healthy and all replaced worker nodes are registered to host the CAS
If you are running multiple CAS instances, verify that all instances are healthy and all replaced nodes are registered to host a CAS in the origin worker pool.
Migrate CAS back to origin worker pool
Since CAS pods tolerate nodes which are tainted
node.kubernetes.io/unschedulable:NoSchedule we cannot only cordon/uncordon
the nodes in the temporary worker pool. We would better taint the nodes in the
temporary worker pool and delete the cas pod to force it to reschedule on a
node in the upgraded origin worker pool.
-
Migrate CAS pod to a node of the origin upgraded worker pool.
Delete temporary worker pool
Once the upgrade is complete and the original pool is stable, decommission the temporary worker pool to optimize resource usage and costs.
- Delete the temporary worker pool
This can be done from within the OSC Dashboard. Or remove the worker
pool pool-tmp from the Shoot manifest and save it. Wait for reconciliation to
finish.
Upscale nodes in worker pool
Scale up the nodes in the original worker pool to the desired number of nodes as if was before. This ensures that you have enough resources to handle your workloads after the upgrade again.
- If there was a need to downscale the nodes in the original worker pool in order to create a new temporary worker pool, then scale up the nodes in the original worker pool to the desired number of nodes as it was before.