Logo

dev-resources.site

for different kinds of informations.

Setting Up a Simple Two-Node Kubernetes Cluster in No Time

Published at
1/15/2025
Categories
kubernetes
linux
cka
Author
krjakbrjak
Categories
3 categories in total
kubernetes
open
linux
open
cka
open
Author
10 person written this
krjakbrjak
open
Setting Up a Simple Two-Node Kubernetes Cluster in No Time

Kubernetes is now a crucial tool for developers. Regardless of the field of software development, Kubernetes will likely be involved. Even if you're not directly working on a service that must run in a Kubernetes environment, at some point you'll likely need to add a CI pipeline to a project, and that CI tool (e.g., Jenkins) will likely be deployed in Kubernetes. Therefore, it's important to quickly install Kubernetes for your needs. Of course, Kubernetes is a large tool with many details, which must be explored case by case. Additionally, the official Kubernetes documentation is the best source of information and helps immensely in resolving any questions. In this post, I will describe the necessary steps to install a basic two-node (control plane and worker) Kubernetes cluster.

Prerequisites

Before beginning the installation and configuration of the Kubernetes cluster, you must install the necessary tools on the system.

Container runtime

Since Kubernetes is a containerized environment, the first thing that needs to be installed is a container runtime. A container runtime is essential for a Kubernetes cluster because it manages the containers that Kubernetes orchestrates. Without it, Kubernetes cannot execute workloads or manage containerized applications. In this example, I'll be using containerd.

To ensure containerized workloads function correctly, the overlay and br_netfilter kernel modules must be loaded:

  • overlay: Enables the overlay filesystem, which container runtimes use to manage container layers efficiently.
  • br_netfilter: Allows bridge networks to integrate with the Netfilter framework, enabling Kubernetes to manage inter-pod and external communications via iptables.

Run the following to load these modules:

sudo modprobe overlay
sudo modprobe br_netfilter
Enter fullscreen mode Exit fullscreen mode

To ensure proper Kubernetes networking, configure specific sysctl parameters:

  • Packet Forwarding (net.ipv4.ip_forward): Enables routing of traffic between pods and external networks.
  • Bridge Netfilter Rules (net.bridge.bridge-nf-call-iptables and net.bridge.bridge-nf-call-ip6tables): Ensures iptables processes bridged traffic, which is essential for pod-to-pod and pod-to-external communication.

Configure and apply these parameters:

sudo tee /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
Enter fullscreen mode Exit fullscreen mode

Next, download, install, and configure containerd with the following commands:

CONTAINERD_VERSION=$(curl -s https://api.github.com/repos/containerd/containerd/releases/latest | jq -r '.tag_name')
CONTAINERD_VERSION=${CONTAINERD_VERSION#v}
curl -s -LO https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-${PLATFORM}.tar.gz
sudo tar xf containerd-${CONTAINERD_VERSION}-linux-${PLATFORM}.tar.gz -C /usr/local

sudo mkdir -p /etc/containerd
cat <<- EOF | sudo tee /etc/containerd/config.toml > /dev/null
version = 2
[plugins]
    [plugins."io.containerd.grpc.v1.cri"]
        [plugins."io.containerd.grpc.v1.cri".containerd]
            discard_unpacked_layers = true
            [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
                [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
                    runtime_type = "io.containerd.runc.v2"
                    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
                        SystemdCgroup = true
EOF

RUNC_VERSION=$(curl -s https://api.github.com/repos/opencontainers/runc/releases/latest | jq -r '.tag_name')

curl -s -L https://github.com/opencontainers/runc/releases/download/${RUNC_VERSION}/runc.${PLATFORM} -o runc.${PLATFORM}
sudo install -m 755 runc.${PLATFORM} /usr/local/sbin/runc

# Restart containerd
curl -s -L https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o containerd.service
sudo mv containerd.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
Enter fullscreen mode Exit fullscreen mode

Kubetools

Next, we need to install the necessary Kubernetes tools:

  • kubeadm: The tool used to install the Kubernetes cluster.
  • kubectl: The tool used to interact with the cluster (e.g., run pods, etc.).
  • kubelet: The Kubernetes agent that runs on each node in the cluster. Without kubelet, a node cannot join or function in a Kubernetes cluster.

The official documentation describes different installation methods. In this case, we'll use the manual installation:

RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
pushd /usr/local/bin
sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${PLATFORM}/{kubeadm,kubelet,kubectl}
sudo chmod +x {kubeadm,kubelet}
popd

RELEASE_VERSION="v0.16.2"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Enter fullscreen mode Exit fullscreen mode

In addition to installing kubelet and kubectl, we must configure the runtime-endpoint so Kubernetes can communicate with the container runtime, ensuring proper container management on each node. For this, the crictl tool needs to be installed:

CRICTL=crictl-${RELEASE}-linux-${PLATFORM}.tar.gz
curl -s -LO "https://github.com/kubernetes-sigs/cri-tools/releases/download/${RELEASE}/${CRICTL}"
sudo tar -C /usr/local/bin -xz -f ${CRICTL}
sudo crictl config --set \
        runtime-endpoint=unix:///run/containerd/containerd.sock
Enter fullscreen mode Exit fullscreen mode

K8s installation

Now that all the necessary tools are installed, we can set up the Kubernetes cluster. As mentioned, we will configure a 2-node cluster: one control plane node and one worker node. These will be two separate VM instances, so make sure to run the previous commands on both instances.

  • Control Plane Node: Manages the cluster and runs components like the API server, controller manager, and scheduler.
  • Worker Node: Runs applications (pods) and manages containers. It includes components like kubelet, container runtime, and kube-proxy.

Separating the control plane and worker nodes ensures scalability, fault tolerance, and improved performance. Control plane components are resource-intensive and need isolation from application workloads, while worker nodes handle the containerized applications. This separation improves stability and security.

The installation of Kubernetes is straightforward. First, configure the control plane and then join the worker node.

sudo kubeadm init

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

# Install network plugin
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
Enter fullscreen mode Exit fullscreen mode

In this example, we install the Calico network plugin. Once this is done, the worker node must join the control plane. The join command can be retrieved by running the following on the control plane node:

kubeadm token create --print-join-command
Enter fullscreen mode Exit fullscreen mode

Copy and run the command on the worker node (with sudo).

And that’s it! Your Kubernetes cluster is up and running.

linux Article's
30 articles in total
Favicon
Easy development environments with Nix and Nix flakes!
Favicon
Setting Up a Simple Two-Node Kubernetes Cluster in No Time
Favicon
Nextcloud on Raspberry Pi - Fedora + Podman Quadlets
Favicon
NVIDIA Drivers with Secure Boot on Ubuntu
Favicon
Как создать свой VPN и получить доступ ко всему?
Favicon
How I used a named pipe to save memory and prevent crashes (in Perl)
Favicon
KDE vs GNOME vs Others: Choosing the Best Linux Desktop Environment in 2025
Favicon
The Linux Foundation Data and AI Fundamentals
Favicon
Kubernetes Security Best Practices
Favicon
A new shell for using modern alternatives to Unix commands
Favicon
Como configurar 2FA em Servidores Linux
Favicon
Configurar servidor de archivos local con Ubuntu y Samba
Favicon
Google Cloud Shell: Establishing Secure Connections via SSH
Favicon
Understanding Linux Shells: Interactive, Non-Interactive, and RC Files
Favicon
[Boost]
Favicon
I am going to learn java in next 8 weeks, please follow me for regular updates
Favicon
Configuring network access with Cisco ASA via minicom utility
Favicon
Fixing Linux Backup Sync Issues for exFAT Compatibility
Favicon
Enhance Your macOS Terminal with Oh My Zsh, Autosuggestions, and Powerlevel10k
Favicon
Turning Markdown into Learning: publishing a challenge on labs.iximiuz.com
Favicon
Fixes for a critical rsync vulnerability (CVE-2024-12084) have been released for Stable/Bookworm, Testing and Unstable....
Favicon
My Zig with Ghostty
Favicon
Understanding Node Problem Detector in Kubernetes: Beyond Default Node Conditions
Favicon
Nginx Simplified: Technical Insights with Real-World Analogies
Favicon
GNOME vs KDE Plasma: Which One Is for You?
Favicon
SSH Keys | Change the label of the public key
Favicon
Debian and KDE 6 - WSL - How to install KDE 6 via Debian - Windows 11 - X410 - Linux - 2024 https://www.youtube.com/watch?v=yrtgmwsptVc
Favicon
Linux/Unix login overview and a bit of clever tricks with "history"
Favicon
🏆 Branching to Level Up in the Cloud! ☁️
Favicon
Mastering Linux File Systems: Everything You Need to Know About Symlinks and Hard Links

Featured ones: