Create a simple Kubernetes cluster on RHEL8

This is a short tutorial on how to install, configure and start your own Kubernetes cluster.

Set Hostname and update hosts file

Use hostnamectl command to set the hostname on control node and workers node.

Run beneath command on control node

sudo hostnamectl set-hostname "k8master"
exec bash

Execute following command on worker node1

sudo hostnamectl set-hostname "k8worker1"
exec bash

Execute following command on worker node2

sudo hostnamectl set-hostname "k8worker2"
exec bash

Add the following entries in /etc/hosts file on control and worker nodes respectively.

192.168.202.80 k8master
192.168.202.81 k8worker1
192.168.202.82 k8worker2

Disable Swap and Set SELinux in permissive mode

Disable swap, so that kubelet can work properly. Run below commands on all the nodes to disable it

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Run beneath sed command on all the nodes to set SELinux in permissive mode

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Configure Firewall Rules on Master and Worker Nodes

On control plane, following ports must be allowed in firewall.

Control-Plane-Firewall-Ports

To allow above ports in control plane, run

sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --reload
sudo modprobe br_netfilter
sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables"
sudo sh -c "echo '1' > /proc/sys/net/ipv4/ip_forward"

On worker Nodes, following ports must be allowed in firewall

Worker-Nodes-firewall-Ports

sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp                                                  
sudo firewall-cmd --reload
sudo modprobe br_netfilter
sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables"
sudo sh -c "echo '1' > /proc/sys/net/ipv4/ip_forward"

First, create a modules configuration file for Kubernetes.

Add these lines and save the changes

sudo cat << EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

Then load both modules using the modprobe command.

sudo modprobe overlay
sudo modprobe br_netfilter

Next, configure the required sysctl parameters as follows

sudo cat << EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

Install CRI-O

To install CRI-O, set the $VERSION environment variable to match your CRI-O version. For instance, to install CRI-O version 1.21 set the $VERSION as shown:

export VERSION=1.21
sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/devel:kubic:libcontainers:stable.repo
sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo
sudo dnf install cri-o -y
sudo systemctl enable cri-o
sudo systemctl start cri-o

Install Kubernetes

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

Init the cluster

sudo kubeadm init

OPTIONAL: install Calico

Join worker nodes

sudo kubeadm join 192.168.202.80:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

Prepare the user environment

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config