CKA — Install kubeadm
The Three Kubernetes Binaries
Every Kubernetes node needs three binaries:
| Binary | Purpose | Runs on |
|---|---|---|
| kubeadm | Bootstrap and manage the cluster | All nodes (used during setup/upgrade) |
| kubelet | Node agent that runs Pods | All nodes (always running) |
| kubectl | CLI to interact with the cluster | Control plane (and admin machines) |
System Requirements
| Requirement | Control Plane | Worker Node |
|---|---|---|
| CPU | 2 cores minimum | 1 core minimum |
| Memory | 2 GB minimum | 1 GB minimum |
| Disk | 20 GB free | 20 GB free |
| Network | Full connectivity to all nodes | Full connectivity to all nodes |
| Swap | Disabled | Disabled |
Required Ports
| Component | Port | Protocol | Node Type |
|---|---|---|---|
| kube-apiserver | 6443 | TCP | Control plane |
| etcd | 2379-2380 | TCP | Control plane |
| kubelet | 10250 | TCP | All nodes |
| kube-scheduler | 10259 | TCP | Control plane |
| kube-controller-manager | 10257 | TCP | Control plane |
| NodePort Services | 30000-32767 | TCP | Worker nodes |
Install on Ubuntu / Debian
Run these commands on all nodes (control plane and workers):
# Install required packages
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# Add Kubernetes apt repository (v1.30)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key \
| sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' \
| sudo tee /etc/apt/sources.list.d/kubernetes.list
# Install specific versions
sudo apt-get update
sudo apt-get install -y kubelet=1.30.0-1.1 kubeadm=1.30.0-1.1 kubectl=1.30.0-1.1
# Pin the versions (prevent accidental upgrades)
sudo apt-mark hold kubelet kubeadm kubectl
# Enable kubelet
sudo systemctl enable --now kubelet
Version Pinning
Version pinning ensures that apt upgrade does not accidentally upgrade Kubernetes components:
# Hold (pin) versions
sudo apt-mark hold kubelet kubeadm kubectl
# Check held packages
sudo apt-mark showhold
# Unhold (when ready to upgrade)
sudo apt-mark unhold kubelet kubeadm kubectl
Exam tip: Always pin versions after installation to avoid accidental upgrades that break the cluster.
Verify Installation
kubeadm version
# kubeadm version: &version.Info{Major:"1", Minor:"30", ...}
kubelet --version
# Kubernetes v1.30.0
kubectl version --client
# Client Version: v1.30.0
Pre-Flight Checks
Before running kubeadm init, you can run pre-flight checks to verify the system is ready:
sudo kubeadm init --dry-run
This validates:
- Swap is disabled
- Required ports are available
- Container runtime is running
- Required kernel modules are loaded
- System has enough CPU and memory