Rancher on Small RKE2 Cluster
On this page
This guide deploys Rancher on a small, highly available RKE2 cluster built from three servers that you provision yourself (bare metal or VMs). It follows the layout Rancher supports for the management (local) cluster.
Overview
Small RKE2 Cluster for Rancher
The design is three RKE2 server nodes, each running etcd, the control plane, and workloads. A fixed registration address (a layer 4 load balancer or DNS name) sits in front of the three nodes. Rancher is installed with Helm and exposed through the ingress controller that RKE2 ships by default. On RKE2 v1.36 and later, that controller is Traefik.
Why three nodes and not two: etcd needs a majority (quorum) of members to accept writes. With 2 members the majority is 2, so losing either node stops the cluster. With 3 members the majority is 2, so the cluster survives one node failure. Rancher’s recommended cluster architecture publishes the fault tolerance table:
| etcd members | Majority | Failures tolerated |
|---|---|---|
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 2 | 1 |
| 5 | 3 | 2 |
The RKE2 HA documentation gives the same rule: use an odd number of server nodes, and three is the recommended count.
Rancher’s architecture guide normally says not to run workloads on etcd or control plane nodes. It makes one exception: a three-node cluster with all roles is valid for the Rancher management cluster, as long as nothing other than Rancher runs on it. If you plan to run other workloads, use three etcd/control plane servers plus two or more agent (worker) nodes instead.
Sizing
The Rancher installation requirements size each node of an RKE2 management cluster by how much it will manage:
| Managed infrastructure | Max clusters | Max nodes | vCPUs per node | RAM per node |
|---|---|---|---|---|
| Small | 150 | 1500 | 4 | 16 GB |
| Medium | 300 | 3000 | 8 | 32 GB |
| Large | 500 | 5000 | 16 | 64 GB |
Use SSDs. Rancher performance depends on etcd, and both the Rancher and RKE2 requirements pages recommend SSD storage for it. A highly available setup with at least three nodes is required for production.
Supported Operating Systems
Pick an OS from the SUSE support matrix rather than from memory. As of Rancher v2.15.2 and RKE2 v1.36, the certified operating systems for RKE2 are:
- SLES 16.0, SLES 15 SP7, and SLE Micro 6.2 and 6.1 (the RKE2 v1.36 matrix also lists SLES 15 SP6 and SLE Micro 6.0)
- openSUSE Leap 16.0 and 15 SP7
- RHEL 10.2, 10.0, 9.8, 9.6, and 8.10 on the Rancher matrix (RHEL 10.1 and 9.7 also appear on the RKE2 matrix). Rocky Linux, Oracle Linux, and Amazon Linux 2023 count as validated through RHEL testing.
- Ubuntu 26.04, 24.04, and 22.04
The safest choice is a release that appears in both matrices, for example SLES 16.0 or 15 SP7, SLE Micro 6.2 or 6.1, RHEL 10.2, 10.0, or 9.8, or Ubuntu 26.04, 24.04, or 22.04.
Sources: Rancher v2.15.2 support matrix and RKE2 v1.36 support matrix. CentOS Linux 8 reached end of life and does not appear in either matrix, so do not use it. The same matrix certifies RKE2 v1.34 through v1.36 for the Rancher v2.15.2 management cluster.
If firewalld is running, the Rancher requirements say to disable it or to configure a dedicated zone that allows the pod CIDR and internal node traffic.
Load Balancer and DNS
Create a layer 4 (TCP) load balancer or a stable DNS name in front of the three nodes. Per the RKE2 for Rancher guide and the RKE2 HA guide, it needs these listeners:
| Port | Purpose |
|---|---|
| 9345/TCP | RKE2 supervisor, used by joining nodes |
| 6443/TCP | Kubernetes API |
| 80/TCP, 443/TCP | Rancher UI and API through the ingress controller |
Point a DNS record such as rancher.example.com at the load balancer. For on-prem networks without a hardware load balancer, kube-vip can provide the virtual IP.
RKE2 Cluster Installation
Step 1: Install the First Server
Create /etc/rancher/rke2/config.yaml before starting RKE2:
token: <shared-secret>
tls-san:
- rancher.example.com
- <load-balancer-ip>Install and start RKE2. Pin a v1.36 patch release that the Rancher support matrix certifies; v1.36.5+rke2r1 is the current patch at the time of writing:
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION="v1.36.5+rke2r1" sh -
systemctl enable --now rke2-server.serviceIf you omit token, RKE2 generates one in /var/lib/rancher/rke2/server/node-token.
Step 2: Join the Second and Third Servers
On each of the other two servers, create /etc/rancher/rke2/config.yaml with the same token and point it at the fixed registration address on port 9345:
server: https://rancher.example.com:9345
token: <shared-secret>
tls-san:
- rancher.example.com
- <load-balancer-ip>Then install and start RKE2 the same way as the first server. Join servers one at a time, and wait for each node to be Ready before adding the next one. Critical settings such as cluster-cidr must be identical on every server.
Step 3: Configure kubectl
Copy /etc/rancher/rke2/rke2.yaml from the first server to your workstation and change the server field from https://127.0.0.1:6443 to https://rancher.example.com:6443. Then confirm all three nodes are Ready:
kubectl get nodesOptional: Dedicated Worker Nodes
If you run anything besides Rancher on this cluster, add two or more agents. Agents join with the same server and token values:
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION="v1.36.5+rke2r1" sh -
systemctl enable --now rke2-agent.serviceIngress
You do not install an ingress controller yourself. RKE2 deploys one on server start, and Rancher’s documentation says the same for RKE2 clusters.
- RKE2 v1.36 and later (new clusters): Traefik is the default. RKE2 runs it as a DaemonSet that binds ports 80 and 443 on every node, and creates an IngressClass named
traefik. The RKE2 for Rancher guide states that Rancher is served through the Traefik ingress on ports 80 and 443. - ingress-nginx: The Kubernetes project retired Ingress NGINX in March 2026, with no further releases or security fixes (announcement, Steering and Security Response Committee statement). RKE2 v1.36 still ships it as deprecated behind
ingress-controller: ingress-nginx, and the RKE2 networking docs say v1.37 removes it for new clusters. Existing clusters should follow the RKE2 ingress migration guide.
The ingress controller is chosen with the ingress-controller key in each server’s config.yaml (traefik, ingress-nginx, or none). Traefik settings are changed through a HelmChartConfig named rke2-traefik in kube-system.
cert-manager
Rancher-generated certificates and Let’s Encrypt certificates both require cert-manager. Skip this step only if you bring your own certificate (ingress.tls.source=secret). Install a supported release; v1.21.2 is current, and the cert-manager releases page lists 1.21 and 1.20 as supported:
helm install cert-manager oci://quay.io/jetstack/charts/cert-manager \
--version v1.21.2 \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=trueSee the cert-manager known good design for details.
Rancher Deployment
Add the stable chart repository (recommended for production) and install Rancher. v2.15.2 is the current stable chart at the time of writing.
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
kubectl create namespace cattle-system
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--version 2.15.2 \
--set hostname=rancher.example.com \
--set bootstrapPassword=<unique-password> \
--set ingress.ingressClassName=traefik \
--set ingress.tls.source=letsEncrypt \
--set letsEncrypt.email=admin@example.com \
--set letsEncrypt.ingress.class=traefikNotes on these values:
- The Rancher Helm install guide says the chart does not set an
ingressClassNameby default, so the Ingress falls back to the cluster default class. Settingingress.ingressClassName=traefikremoves that ambiguity. The Rancher on EKS guide uses the same flag. letsEncrypt.ingress.classmust match your ingress controller. The Rancher docs listtraefikandnginxas options. Older examples that passnginxwill not solve HTTP-01 challenges on a Traefik cluster.- Let’s Encrypt HTTP-01 needs the hostname to be reachable from the internet on port 80. For internal-only installs, drop the three
letsEncryptlines to use Rancher-generated certificates, or useingress.tls.source=secretwith your own certificate.
Gateway API Exposure
The Rancher v2.15.2 chart also has a networkExposure.type value (ingress, gateway, or none). With gateway, Rancher creates Gateway API resources against the gateway.gatewayClass.name class (default traefik) instead of an Ingress. This option is in the chart’s values.yaml but not yet on the documented Helm chart options page, so treat it as newer than the default path. On RKE2, Gateway API requires Traefik with providers.kubernetesGateway.enabled: true in the rke2-traefik HelmChartConfig. The default ingress exposure shown above is the conservative choice.
Testing and Validation
- Check that Rancher and its Ingress are up:bash
kubectl -n cattle-system rollout status deploy/rancher kubectl -n cattle-system get ingress - Check that the certificate was issued (Let’s Encrypt or Rancher-generated):bash
kubectl -n cattle-system get certificate - Browse to
https://rancher.example.comand log in with the bootstrap password. - Test failure tolerance before going live: power off one node and confirm
kubectl get nodesstill answers and the Rancher UI still loads.
Backups
Schedule RKE2 etcd snapshots and copy them off the nodes (RKE2 supports S3 targets). Rancher’s production checklist also recommends recurring snapshots stored off-node. Install the Rancher Backups operator to back up Rancher’s own resources.
References
- Rancher: Setting up an RKE2 cluster for Rancher
- Rancher installation requirements
- Rancher Helm install guide
- Rancher recommended cluster architecture
- RKE2 high availability
- RKE2 requirements
- RKE2 networking services (Traefik, ingress-nginx, Gateway API)
- SUSE Rancher v2.15.2 support matrix
- SUSE RKE2 v1.36 support matrix
- Kubernetes: Ingress NGINX retirement