Kubernetes

Bootstrapping a cluster locally

updated 2026-05-18 1 min read #kubernetes #core

Installing kubeadm

Pre-check

Check OS versions. https://kubernetes.io/docs/reference/node/kernel-version-requirements/

Verify the MAC address and product_uuid are unique for every node.

ip link or ifconfig -a
sudo cat /sys/class/dmi/id/product_uuid

Check required ports: https://kubernetes.io/docs/reference/networking/ports-and-protocols/

Swap configuration: swap should either be disabled or tolerated by kubelet

Installing a container runtime

Become root firstly

sudo su

Containerd

Well, let’s just use containerd. Instruction https://github.com/containerd/containerd/blob/main/docs/getting-started.md

Download and extract containerd binary (double check version).

sudo su
wget https://github.com/containerd/containerd/releases/download/v2.3.0/containerd-2.3.0-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-2.3.0-linux-amd64.tar.gz

Start via systemd.

wget -P /usr/local/lib/systemd/system/ https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd

Runc

Download and install runc.

wget -P . https://github.com/opencontainers/runc/releases/download/v1.5.0-rc.2/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin.runc

CNI Plugins

wget https://github.com/containernetworking/plugins/releases/download/v1.9.1/cni-plugins-linux-amd64-v1.9.1.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.9.1.tgz

(Optional) nerdctl for interacting with containerd via CLI

wget https://github.com/containerd/nerdctl/releases/download/v2.3.0/nerdctl-2.3.0-linux-amd64.tar.gz
tar Cxzvvf /usr/local/bin nerdctl-2.3.0-linux-amd64.tar.gz

Generate containerd config

mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml

Enable IPv4 packet forwarding

cat << EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

Verify.

sysctl net.ipv4.ip_forward

Choose cgroup drivers

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
systemctl restart containerd

Installing kubeadm, kubelet and kubectl

DOWNLOAD_DIR="/usr/local/bin"
mkdir -p "$DOWNLOAD_DIR"

CRICTL_VERSION="v1.31.0"
ARCH="amd64"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz

RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
ARCH="amd64"
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
chmod +x {kubeadm,kubelet}

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:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
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:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

sudo systemctl enable --now kubelet