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.

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

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.

⚠️ 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! 🚀

Start
Settings