Single-Node kubeadm Cluster Setup
Take one Ubuntu 26.04 machine from nothing to a working Kubernetes cluster with kubeadm: containerd on the systemd cgroup driver, the kernel settings kubelet needs, Calico for pod networking, the control-plane taint removed, and a workload proving DNS and Service routing both work.
Installation and Cluster Builds Guide 7 of 103 Beginner
- Kubernetes1.36.4
- Cluster1 node
- Runtimecontainerd 2.2.6
- CNICalico v3.32.1
- TimeAbout 40 min
Download sizes, image digests, timings and pod name suffixes differ on every run. Patch versions move weekly, so treat these as what was on the machine rather than as requirements.
- Kernel7.0.0-29-generic
- Calicov3.32.1
| Server Name | IP Address | OS | Roles | CPU | RAM | HDD |
|---|---|---|---|---|---|---|
| CKA4001 | 192.168.0.191 | Ubuntu 26.04 LTS | Control Plane Node | 2 Core | 4 GB | 50 GB |
This guide includes
Use this when you need a real cluster of your own rather than a managed one or a toy. This matters because building one with kubeadm is where the components stop being a diagram - and two of the steps are where most first attempts quietly fail.
- meeting kubeadm's preflight floor on CPU and memory, and turning swap off for good
- loading
overlayandbr_netfilterand setting the sysctls the pod network needs - pointing containerd at the systemd cgroup driver, the step that quietly ruins clusters
- running
kubeadm init, then watching the node stay NotReady until Calico is installed in the right order - removing the control-plane taint, then proving DNS and Service routing actually work
Before you start
- An Ubuntu 26.04 machine with at least 2 CPUs and 2 GB of RAM.
kubeadmrefuses to start below that, and on one machine the control plane and your workloads share whatever you give it. - A user with
sudorights, and a hostname unique on the network:kubeadmuses the hostname as the node name. - A fixed address, from a static config or a DHCP reservation. The API server certificate is issued for the address you advertise, so a control plane that moves needs its certificates regenerating.
- Outbound HTTPS to
pkgs.k8s.io,registry.k8s.io,quay.ioandraw.githubusercontent.com. - Know your LAN range before you start. It decides the pod CIDR, and picking one that overlaps is the most common way to end up with a cluster that looks healthy and cannot route.
-
Check the machine meets kubeadm's floor
-
Turn swap off, and keep it off
-
Load the kernel modules and set the sysctls
-
Point containerd at the systemd cgroup driver
-
Add the Kubernetes apt repository
-
Install kubelet, kubeadm and kubectl, then hold them
-
Initialise the control plane
-
Get a kubeconfig, and see the cluster refuse to be Ready
-
Install Calico, and wait for its CRDs before configuring it
-
Remove the control-plane taint
-
Prove it works: DNS and Service routing
-
Clean up the smoke test