User-defined Playground

kubeadm Playground

A single-machine playground to experiment with kubeadm, a tool built to provide best-practice "fast paths" for creating Kubernetes clusters.

kubeadm playground: A single-machine playground to experiment with kubeadm,
a tool built to provide best-practice "fast paths" for creating Kubernetes clusters.
Machines & network
2 VMs · 8 vCPU · 16GiB RAM
Playground host Internet NAT MASQUERADE local (bridge) 172.16.0.0/24 gw 172.16.0.1/24eth0eth0
VM
vCPU ·
eth0
/
oci://ghcr.io/sagikazarmark/iximiuz-labs/base/kubeadm/dev-machine:5c7cbaff35cb
VM
vCPU ·
eth0
/
oci://ghcr.io/sagikazarmark/iximiuz-labs/base/kubeadm:6fb748a73c9f
About
Note

This is a single-machine playground. A multi-machine playground for larger and HA clusters is WIP.

🔧 System Components

  • kubelet: The primary node agent that runs on each node
  • Container Runtimes:
    • containerd: Lightweight container runtime (recommended)
    • CRI-O: Lightweight container runtime for Kubernetes
  • Networking:
    • CNI plugins: Container Network Interface plugins
    • Flannel: Network overlay for pod-to-pod communication
    • Canal: Calico for network policy and Flannel

🛠️ Tools

  • kubeadm: Cluster lifecycle management and bootstrapping
  • kubectl (alias: k): Kubernetes cluster management and debugging
  • nerdctl: Docker-compatible CLI for containerd
  • krew: kubectl plugin manager for extending functionality

🎯 Getting Started

Quick Setup

If you want to quickly set up a working cluster, use the automated script:

/opt/lab/init.sh --remove-taint
Available options
OptionDefaultDescription
--remove-taintfalseRemove the NoSchedule taint that may prevent pods from being scheduled to this node.
--cniflannelNetwork add-on to install. Valid values: none, flannel, canal
--no-load-imagesfalseDo not load the images from local cache.
Important

⚠️ When none is selected as the network addon, the initialization script will skip installing any CNI plugin.

On the dev-machine, run the following command to configure kubectl:

/opt/lab/configure.sh

Manual Setup

For a manual setup, check out this tutorial.

Verify Your Cluster

# Check all system pods are running
kubectl get pods --all-namespaces

# Deploy a test application
kubectl create deployment podinfo --image=ghcr.io/stefanprodan/podinfo --port=9898
kubectl expose deployment podinfo --port=9898

# Wait for the pod to be ready
kubectl wait --for=condition=Ready pods --all --timeout=300s

# Check the deployment
kubectl get pods,services

# Send a request to the application
curl http://$(kubectl get svc podinfo -o jsonpath='{.spec.clusterIP}:{.spec.ports[0].port}')

Resetting the Cluster

The easiest way to reset the cluster is terminating the playground and starting a new one.

That being said, it's a good idea to learn how to reset the cluster manually.

First, reset the cluster itself using kubeadm:

kubeadm reset -f

Stop kubelet:

systemctl stop kubelet

Then cleanup any CNI config created by the network addon you installed:

rm -rf /etc/cni/net.d/*.{conf,conflist}

Delete any CNI interfaces created by the network addon:

ip link delete cni0

# For flannel
ip link delete flannel.1

📚 Learn More

📖 Tutorials

🧪 Playgrounds

Happy learning! 🚀

Every playground includes
Learn more about playgrounds
Start
Settings