Documentation is tailored to each Cluster Stack release. Pick the one your cluster runs. {#if release.hasArmImages && minor !== stack.latest.minor} ## Check for ARM-based nodes If your cluster isn't running ARM-based nodes, skip this step. ARM is temporarily not supported on this release. If your cluster has any, the upgrade will fail unless you migrate them to x86 nodes first — see [Migrate ARM servers to x86 in your cluster](/docs/hetzner/apalla/servers-and-nodes/provision/migrate-arm-to-x86) for instructions. {/if} {#if minor === stack.latest.minor} ## You are here You are seeing the documentation for Kubernetes 1.34 — the newest Kubernetes minor Syself Autopilot supports right now. If your cluster is already on this version, there's nothing to do. Not on this version? Pick your cluster's actual version in the picker above to jump straight to the guide that applies to it. ## Not sure which Kubernetes version your cluster is on? If you're not sure which Kubernetes version your cluster is currently on, check it directly: Check in your cluster Run these commands against the Syself Autopilot management cluster, not the workload cluster. To check one cluster: ```console $ kubectl get cluster -n \ -o jsonpath='{.spec.topology.classRef.name}{"\n"}' ``` The command returns the Cluster Stack release name: ```console vars hetzner-apalla-1-34-v10 ``` The name includes the provider, stack, Kubernetes minor version, and Cluster Stack release. The final `vN` segment identifies the Cluster Stack release. To check every cluster: ```console $ kubectl get clusters -A \ -o custom-columns='NAMESPACE:.metadata.namespace,CLUSTER:.metadata.name,CLUSTERSTACK:.spec.topology.classRef.name,KUBERNETES:.spec.topology.version' ``` **If the management cluster serves `cluster.x-k8s.io/v1beta1`**: If the Syself Autopilot management cluster serves `cluster.x-k8s.io/v1beta1` instead of `v1beta2`, use `spec.topology.class` instead of `spec.topology.classRef.name`. To check one cluster with `cluster.x-k8s.io/v1beta1`: ```console $ kubectl get cluster -n \ -o jsonpath='{.spec.topology.class}{"\n"}' ``` To check every cluster with `cluster.x-k8s.io/v1beta1`: ```console $ kubectl get clusters -A \ -o custom-columns='NAMESPACE:.metadata.namespace,CLUSTER:.metadata.name,CLUSTERSTACK:.spec.topology.class,KUBERNETES:.spec.topology.version' ``` If it doesn't match, change your version in the version picker If it doesn't show 1.34, switch the docs to your cluster's actual version using the picker below: An upgrade guide scoped to that version will walk you through the upgrade path to get here. ## Explore further Exactly which components and versions hetzner-apalla-1-36-v2 ships. Every maintained Kubernetes minor and Cluster Stack release, including 1.36's full history, with support windows and what changed between them. ## Already on this Kubernetes version but want the latest Cluster Stack release for it? See [Updating the cluster with same Kubernetes version](/docs/hetzner/apalla/clusters/upgrades/update-within-a-version) to get the latest Cluster Stack release for Kubernetes 1.34. {:else if upgrade.toNextMinor.length === 0 || upgrade.toNextMinor[0] !== upgrade.nextMinorEntry} You are viewing documentation for Kubernetes 1.34, Cluster Stack release hetzner-apalla-1-34-v10. To upgrade to Kubernetes 1.35, first update your cluster to Cluster Stack release hetzner-apalla-1-34-v10 by following this guide: [Updating the cluster with same Kubernetes version](/docs/hetzner/apalla/clusters/upgrades/update-within-a-version). Once that update is complete, return to this guide to upgrade your Kubernetes version. Not sure which Kubernetes minor and Cluster Stack release your cluster uses? [Check the Kubernetes version and Cluster Stack](/docs/hetzner/apalla/clusters/configure/how-to-check-the-kubernetes-version-and-stack) of your cluster. {:else} This guide will detail the process of upgrading your cluster from Kubernetes 1.34 to 1.35. Not sure which Kubernetes minor and Cluster Stack release your cluster uses? [Check the Kubernetes version and Cluster Stack](/docs/hetzner/apalla/clusters/configure/how-to-check-the-kubernetes-version-and-stack) of your cluster. ## Upgrading the cluster Adding a new Cluster Stack 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: hetzner-apalla-1-35 spec: provider: hetzner name: apalla kubernetesVersion: "1.35" channel: stable autoSubscribe: true providerRef: name: hetzner-apalla-1-35 kind: HetznerClusterStackReleaseTemplate apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1 --- apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1 kind: HetznerClusterStackReleaseTemplate metadata: name: hetzner-apalla-1-35 spec: template: spec: nodeImages: [] ``` {:else} ```yaml vars 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 --- apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1 kind: HetznerClusterStackReleaseTemplate metadata: name: hetzner-apalla-1-35 spec: template: spec: nodeImages: [] ``` {/if} ```yaml vars 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 --- apiVersion: infrastructure.clusterstack.x-k8s.io/v1alpha1 kind: HetznerClusterStackReleaseTemplate metadata: name: hetzner-apalla-1-35 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 Cluster Stack object if something seems wrong. 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-34-v10 v1.34.10 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-34-v10 v1.34.10 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. 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: hetzner-apalla-1-35-v4 version: v1.35.7 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. Syself now rolls the cluster to the new Kubernetes minor version, one node at a time. The control plane and the API server stay available throughout. Bare-metal control-plane and worker pools run one fewer node during each step, so size them with headroom; the [prechecks](/docs/hetzner/apalla/clusters/upgrades/plan-maintenance-and-prechecks) cover this. When the roll finishes, confirm every node reports the new version and `Ready`, the control plane and etcd are healthy, and your workloads still serve traffic. If a rollout stalls, see [Stuck or failed upgrade](/docs/hetzner/apalla/clusters/troubleshooting/stuck-or-failed-upgrade). 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.