In this tutorial, you’ll learn how to install Kubernetes on RHEL 10 using CRI-O container runtime with one control plane node and one worker node.
This step-by-step guide is beginner friendly, production-aligned, and perfect for:
Learning Kubernetes fundamentals
RHEL-based Kubernetes labs
DevOps & Cloud practice environments
📌 Setup Overview
OS: RHEL 10
Kubernetes Version: v1.34
Container Runtime: CRI-O
Cluster Type: 1 Control Plane + 1 Worker Node
🔧 Prerequisites
Two RHEL 10 systems (VM or Physical)
Root or sudo access
Active Red Hat subscription
Minimum: 2 vCPU, 2 GB RAM
Internet connectivity between nodes
Step 1: Update System & Set Hostnames
sudo dnf update -y
sudo reboot
Set hostnames
sudo hostnamectl set-hostname k8s-control
sudo hostnamectl set-hostname k8s-worker
Update /etc/hosts
sudo vi /etc/hosts
192.168.1.96 k8s-control
192.168.1.4 k8s-worker
Step 2: Disable Swap (Mandatory) and SELinux
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
Set SElinux to Permissive Mode
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
⚙ Step 3: Load Kernel Modules & Sysctl Settings
sudo vi /etc/modules-load.d/k8s.conf
overlay
br_netfilter
Save & close the file
sudo modprobe overlay
sudo modprobe br_netfilter
Apply sysctl parameters
sudo vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
save and exit the file
sudo sysctl --system
🔥 Step 4: Configure Firewall
Control Plane Node
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250-10252/tcp
sudo firewall-cmd --reload
Worker Node
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --reload
🧱 Step 5: Install CRI-O Container Runtime
CRIO_VERSION=v1.34
sudo vi /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://download.opensuse.org/reposit...
enabled=1
gpgcheck=0
gpgkey=https://download.opensuse.org/reposit...
sudo dnf install -y cri-o
sudo systemctl enable --now crio
sudo systemctl status crio
📦 Step 6: Install Kubernetes Components
KUBERNETES_VERSION=v1.34
sudo vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/$KU...
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/$KU...
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
Install kubeadm, kubelet & kubectl
sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
🚀 Step 7: Initialize Control Plane
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/crio/crio.sock
Configure kubectl access
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
🌐 Step 8: Install Flannel CNI
kubectl apply -f https://github.com/flannel-io/flannel...
Verify:
kubectl get pods -n kube-flannel
🤝 Step 9: Join Worker Node
sudo kubeadm join {control-ip:6443} --token {token} \
--discovery-token-ca-cert-hash sha256:{hash}
Verify from control plane:
kubectl get nodes
🧪 Step 10: Test Kubernetes Cluster
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --type=NodePort --port=80
kubectl get svc
Access app:
http://[node-ip]:[node-port]
You have successfully installed Kubernetes on RHEL 10 using CRI-O with a 1 Control + 1 Worker Node setup.
👍 Like | 🔔 Subscribe | 📢 Share
for more Linux, Kubernetes, DevOps & Cloud tutorials.