{#if release.hasArmImages}
ARM-based servers are temporarily not supported. Due to significant declines in the availability and reliability of this server architecture, we can no longer recommend it. This is a temporary measure, and we will restore support once the situation improves.
If your cluster uses ARM-based nodes, you must migrate them to x86 nodes before updating:
- **Updates are blocked.** Without available ARM server capacity, nodes cannot be reliably provisioned, which prevents updates from completing.
- **No automatic replacement on failure.** If an ARM server fails, there is currently no way to obtain an automatic replacement.
See [Migrate ARM servers to x86 in your cluster](/docs/hetzner/apalla/servers-and-nodes/provision/migrate-arm-to-x86) for instructions.
{/if}
{#if release === stack.latest}
## You are up to date! 🎉
If you wish to upgrade from an old ClusterStack version, please go to the version selector on top of the navigation and select your current version.
{:else if release === minor.latest}
## You are on the latest ClusterStackRelease! 🎉
Right now you are on the latest ClusterStackRelease available for Kubernetes 1.35.
If you wish to upgrade from an old ClusterStackRelease version, please go to the version selector on top of the navigation and select your version.
If you want to upgrade the Kubernetes version instead, visit the [Updating the cluster to a new Kubernetes version](/docs/hetzner/apalla/clusters/upgrades/upgrade-to-a-new-kubernetes-version) guide.
{:else}
## Introduction to ClusterStack Releases
Syself is releasing a new version of the ClusterStacks every two to three weeks. These releases may contain minor updates, such as a Kubernetes patch version, or the version of some cluster components or node images.
This guide will detail the process of updating from to v4.
## Preparing the clusterstack object
Check if `autoSubscribe` is set to `true` or `false` in your clusterstack object and follow the steps for your case:
> [!NOTE]
> The `autoSubscribe` key in the clusterstack object indicates that Syself Autopilot will automatically fetch the latest ClusterStackRelease version and make it available for use.
{#if upgrade.toMinorLatest.length === 1}
The latest version is automatically available for you. You don't need to do anything. Keep reading the next steps.
{:else}
The latest version is automatically available for you, but you still need to specify the versions in between.
For that, add [] to the `spec.versions` array in your ClusterStack:
```yaml vars persistBlur title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: hetzner-apalla-1-35
spec:
provider: hetzner
name: apalla
kubernetesVersion: "1.35"
channel: stable
autoSubscribe: true
versions: []
providerRef:
name: hetzner-apalla-1-35
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
```
{/if}
{#if upgrade.toMinorLatest.length === 1}
You can go to the latest version directly. To make it available, add v4 to the versions array in your ClusterStack object:
```yaml vars persistBlur title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: hetzner-apalla-1-35
spec:
provider: hetzner
name: apalla
kubernetesVersion: "1.35"
channel: stable
autoSubscribe: false
versions: ["v4"]
providerRef:
name: hetzner-apalla-1-35
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
```
{:else}
You need to specify the ClusterStackRelease versions in between using the `spec.versions` array in your ClusterStack object.
The following is the complete (and shortest) tested upgrade path to go from your current version to hetzner-apalla-1-35-v4:
```yaml vars persistBlur title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: hetzner-apalla-1-35
spec:
provider: hetzner
name: apalla
kubernetesVersion: "1.35"
channel: stable
autoSubscribe: false
versions: []
providerRef:
name: hetzner-apalla-1-35
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
```
{/if}
## Checking the available ClusterStackReleases
Check if the `ClusterStackReleases` you need are available with:
{#if upgrade.toMinorLatest.length === 1}
```console vars
$ kubectl get clusterstackrelease
NAME K8S VERSION READY AGE REASON MESSAGE
hetzner-apalla-1-35-v4 v1.35.7 true 2d
hetzner-apalla-1-35-v4 v1.35.7 true 1m
```
{:else}
```console vars
$ kubectl get clusterstackrelease
NAME K8S VERSION READY AGE REASON MESSAGE
hetzner-apalla-1-35-v4 v1.35.7 true 2d
... ... true 1m
hetzner-apalla-1-35-v4 v1.35.7 true 1m
```
{/if}
Note down the values of the `NAME` and `K8S VERSION` columns from the release you want to upgrade to. In this case, hetzner-apalla-1-35-v4 and v1.35.7.
## Upgrading the cluster object
Edit your cluster and change the `spec.topology.class` and `spec.topology.version` to match the `NAME` and `K8S VERSION` of the ClusterStackRelease, respectively.
This can be achieved either by editing the resource inside the management cluster, or by updating it in your GitOps repository.
{#if upgrade.toMinorLatest[0]?.kubernetes === minor.latest.kubernetes}
In this case, you only need to update one version.
> [!NOTE]
> The cluster manifest below uses `cluster.x-k8s.io/v1beta2`, the current default API version for CAPI core resources. See [Cluster API v1beta2](/docs/hetzner/apalla/clusters/upgrades/migrate-a-manifest-to-v1beta2) for more information.
```yaml vars persistBlur title="cluster.yaml"
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
name: mycluster
spec:
topology:
classRef:
name: {upgrade.toMinorLatest[0]?.name}
version: {upgrade.toMinorLatest[0]?.kubernetes}
controlPlane:
replicas: 3
workers:
machineDeployments:
- class: workeramd64hcloud
name: md-0
replicas: 1
failureDomain: nbg1
variables:
overrides:
- name: workerMachineTypeHcloud
value: cpx42
variables:
- name: region
value: nbg1
- name: controlPlaneMachineTypeHcloud
value: cpx42
```
{:else}
{/if}
Now, your cluster will be updated (with no downtime!) to the cluster stack version you specified.
If you need to update to another version, wait for the current update process to finish. You can check if it's done by checking the nodes in your cluster:
```console
$ kubectl get nodes
```
If you still have old nodes, this means the update is in progress. In this case, wait until the output shows only new nodes.
{/if}