WSL2 Ubuntu Kubernetes cluster control plane and Calico automation script

Totally new to Kubernetes. But I had a need, so with CoPilot and Manus created an install script that gets cluster plane with nodes up in ready state in 4 minutes. Hope it helps someoneโ€ฆ


#!/bin/bash
set -e  # Exit on errors

echo "๐Ÿš€ Starting Kubernetes Cluster Setup on Ubuntu with Calico"

### 1๏ธโƒฃ Disable Swap (Required for Kubernetes)
echo "๐Ÿ›  Checking for swap..."
if sudo swapon --summary | grep -q "partition"; then
    echo "โš ๏ธ Swap is enabled, disabling..."
    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    echo "โœ… Swap disabled successfully!"
else
    echo "โœ… No active swap found."
fi

### 2๏ธโƒฃ Update & Install Dependencies
echo "๐Ÿ”ง Updating system packages..."
sudo apt update && sudo apt install -y curl apt-transport-https

### 3๏ธโƒฃ Add Kubernetes Repository
echo "๐Ÿ”— Adding Kubernetes repository..."
sudo rm -f /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update

### 4๏ธโƒฃ Install Kubernetes & Container Runtime
echo "๐Ÿ“ฆ Installing kubeadm, kubelet, kubectl, and containerd..."
sudo apt install -y kubeadm kubelet kubectl containerd

### 5๏ธโƒฃ Validate & Restart Containerd
echo "๐Ÿ›  Checking containerd..."
if ! sudo systemctl is-active --quiet containerd; then
    echo "โš ๏ธ Containerd is not running, fixing..."
    [ -f /etc/containerd/config.toml ] || sudo containerd config default | sudo tee /etc/containerd/config.toml
    sudo systemctl restart containerd
    sudo systemctl enable containerd
fi

### 6๏ธโƒฃ Fix CRI Sandbox Image Mismatch
echo "๐Ÿš€ Removing outdated sandbox image and setting correct version..."
sudo ctr -n k8s.io images rm registry.k8s.io/pause:3.8 || echo "โœ… No need to remove, already cleared."
sudo ctr -n k8s.io images pull registry.k8s.io/pause:3.9
sudo ctr -n k8s.io images tag registry.k8s.io/pause:3.9 registry.k8s.io/pause:3.8

### 7๏ธโƒฃ Set IP Forwarding (Single Entry)
echo "๐ŸŒ Enabling IP forwarding..."
sudo sysctl -w net.ipv4.ip_forward=1

### 8๏ธโƒฃ Clean Previous Kubernetes Manifests
echo "๐Ÿงน Cleaning previous Kubernetes manifests..."
sudo rm -rf /etc/kubernetes/manifests/*.yaml

### 9๏ธโƒฃ Detect WSL2 IP & Configure Kubelet Node Binding
echo "๐Ÿ” Detecting WSL2 network interface..."
WSL_IP=$(ip -o -4 addr show eth0 | awk '{print $4}' | cut -d/ -f1)
echo "๐Ÿ’ก Detected Node IP: $WSL_IP"

echo "๐Ÿ›  Ensuring kubelet binds to correct IP..."
sudo sed -i "/^KUBELET_EXTRA_ARGS=/c\KUBELET_EXTRA_ARGS=--node-ip=$WSL_IP" /var/lib/kubelet/kubeadm-flags.env
sudo systemctl restart kubelet

### ๐Ÿ”Ÿ Initialize Kubernetes Cluster
echo "๐Ÿš€ Initializing Kubernetes Cluster..."
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=$WSL_IP --ignore-preflight-errors=FileAvailable || {
    echo "โŒ Kubernetes initialization failed, resetting..."
    sudo kubeadm reset -f
    sudo systemctl restart containerd
    sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=$WSL_IP --ignore-preflight-errors=FileAvailable
}

### ๐Ÿ”Ÿ Configure Kubectl for User
echo "๐Ÿ”ง Setting up kubectl access..."
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

### ๐Ÿ”Ÿ Modify Calico YAML Before Deployment
echo "๐ŸŒ Downloading and modifying Calico manifest..."
curl -sSL -o calico.yaml https://docs.projectcalico.org/manifests/calico.yaml

### Validate Download
if [ ! -s calico.yaml ]; then
    echo "โŒ Failed to download Calico manifest! Exiting..."
    exit 1
fi

### Remove Unsupported Volume Mounts
sed -i '/name: bpffs/d' calico.yaml
sed -i '/name: var-run-calico/d' calico.yaml
sed -i '/mountPath: \/sys\/fs\/bpffs/d' calico.yaml
sed -i '/mountPath: \/var\/run\/calico/d' calico.yaml

### ๐Ÿ”Ÿ Deploy Modified Calico
echo "๐Ÿš€ Applying modified Calico..."
kubectl apply -f calico.yaml --validate=false

### ๐Ÿ”Ÿ Remove Control-Plane Taint
echo "๐Ÿ›  Removing control-plane scheduling restrictions..."
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

### ๐Ÿ”Ÿ Verify Cluster Health
echo "๐Ÿ” Checking cluster status..."
kubectl get nodes
kubectl get pods -n kube-system

### ๐Ÿ”Ÿ Final Kubelet Health Check & Debugging
echo "๐Ÿ›  Checking kubelet status..."
sudo systemctl restart kubelet
sleep 10  # Allow stabilization
if ! sudo systemctl is-active --quiet kubelet; then
    echo "โš ๏ธ Kubelet is not running, checking logs..."
    sudo journalctl -u kubelet --no-pager | tail -40
    echo "๐Ÿ”ง Attempting kubelet recovery..."
    sudo kubeadm init phase kubelet-start --config /etc/kubernetes/kubelet-config.yaml
    sudo systemctl restart kubelet
fi

### ๐Ÿ”Ÿ Verify Kubelet Port Accessibility
echo "๐Ÿ” Checking kube-apiserver accessibility..."
curl -sSL http://$WSL_IP:6443 || {
    echo "โš ๏ธ API server unreachable, adjusting firewall..."
    sudo ufw allow 6443/tcp
    sudo ufw allow 10248/tcp
    sudo systemctl restart kubelet
}

echo "โœ… Kubernetes setup complete with modified Calico!"