{#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 need to upgrade from an old Kubernetes version, please go to the version selector on top of the navigation and select your current version.
{:else if minor === stack.latest.minor}
## You are on the latest Kubernetes version! 🎉
Right now you are on the latest Kubernetes version available in the Cluster Stacks.
If you need to upgrade from an old Kubernetes version, please go to the version selector on top of the navigation and select your current version.
If you want to upgrade the Cluster Stack version instead, go to the [Updating the cluster with same Kubernetes version](/docs/hetzner/apalla/clusters/upgrades/update-within-a-version) guide.
{:else if upgrade.toNextMinor[0] !== upgrade.nextMinorEntry}
Before upgrading to the next Kubernetes minor version, you need to catch up with the Cluster Stack upgrades for the minor version you are currently in. Please follow the steps in the [Updating the cluster with same Kubernetes version](/docs/hetzner/apalla/clusters/upgrades/update-within-a-version) guide first.
{:else}
## Step 1: Adding a new ClusterStack
Add a new `ClusterStack` and `HetznerClusterStackReleaseTemplate` for the newer Kubernetes minor version:
{#if upgrade.nextMinorEntry === nextMinor?.latest}
> [!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 title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: {nextMinor?.clusterStack}
spec:
provider: hetzner
name: apalla
kubernetesVersion: "{nextMinor?.version}"
channel: stable
autoSubscribe: true
providerRef:
name: {nextMinor?.clusterStack}
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
---
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
kind: HetznerClusterStackReleaseTemplate
metadata:
name: {nextMinor?.clusterStack}
spec:
template:
spec:
nodeImages: []
```
{:else}
```yaml vars title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: {nextMinor?.clusterStack}
spec:
provider: hetzner
name: apalla
kubernetesVersion: "{nextMinor?.version}"
channel: stable
autoSubscribe: true
versions: []
providerRef:
name: {nextMinor?.clusterStack}
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
---
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
kind: HetznerClusterStackReleaseTemplate
metadata:
name: {nextMinor?.clusterStack}
spec:
template:
spec:
nodeImages: []
```
{/if}
```yaml vars title="clusterstack.yaml"
apiVersion: clusterstack.x-k8s.io/v1alpha1
kind: ClusterStack
metadata:
name: {nextMinor?.clusterStack}
spec:
provider: hetzner
name: apalla
kubernetesVersion: "{nextMinor?.version}"
channel: stable
autoSubscribe: false
versions: []
providerRef:
name: {nextMinor?.clusterStack}
kind: HetznerClusterStackReleaseTemplate
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
---
apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1
kind: HetznerClusterStackReleaseTemplate
metadata:
name: {nextMinor?.clusterStack}
spec:
template:
spec:
nodeImages: []
```
Apply it to the cluster with your tool of choice.
> [!TIP]
> For versions before hetzner-apalla-1-35-v1, node images for the new version will start to build. The build process takes around 5 minutes. You can check the status of the newly created ClusterStack object if something seems wrong.
## Step 2: Checking the available ClusterStackReleases
The next step is to is to check the available `ClusterStackReleases`:
{#if upgrade.nextMinorEntry === nextMinor?.latest}
```console vars
$ kubectl get clusterstackrelease
NAME K8S VERSION READY AGE REASON MESSAGE
hetzner-apalla-1-35-v4 v1.35.7 true 2d
{nextMinor?.latest.name} {nextMinor?.latest.kubernetes} 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
{nextMinor?.latest.name} {nextMinor?.latest.kubernetes} true 1m
```
{/if}
Note down the values of the `NAME` and `K8S VERSION` columns from the release you want to upgrade to.
Now we edit our cluster and change the `spec.topology.class` and `spec.topology.version` to match the `NAME` and `K8S VERSION` of our cluster stack release:
{#if upgrade.nextMinorEntry === nextMinor?.latest}
```yaml vars persistBlur title="cluster.yaml"
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
name: mycluster
spec:
topology:
classRef:
name: {upgrade.nextMinorEntry?.name}
version: {upgrade.nextMinorEntry?.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}
This can be achieved either by editing the resource inside the management cluster, or by updating it in your GitOps repository.
Now your cluster will be updated (with no downtime!) to the new Kubernetes minor version.
If you are no longer using the old `ClusterStack` and `HetznerClusterStackReleaseTemplate` anymore, you can remove them now.
{/if}
> [!NOTE]
> Starting from hetzner-apalla-1-35-v1, Hetzner node image builds are no longer required. Because of that, we require a common SSH key for both bare metal and cloud servers. If you did not use the same SSH key when doing the [Hetzner account preparation](/docs/hetzner/apalla/getting-started/prepare-your-hetzner-account), please change the secrets to ensure you have a single SSH key.