We’ll create two scripts:
1. k8s-node-setup.sh → run on all nodes (control-plane + workers)
2. k8s-master-init.sh → run only on the control-plane to initialize the cluster
1. k8s-node-setup.sh (all nodes)
This script prepares Ubuntu for Kubernetes, installs containerd, kubeadm, kubelet, kubectl.
#!/bin/bash
set -e
echo "[Step 0] Updating system..."
sudo apt-get update -y
echo "[Step 1] Disabling swap..."
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^/#/' /etc/fstab
echo "[Step 2] Loading kernel modules..."
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
echo "[Step 3] Setting sysctl params..."
cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
echo "[Step 4] Installing containerd..."
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl enable --now containerd
sudo systemctl restart containerd
echo "[Step 5] Installing kubeadm, kubelet, kubectl..."
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/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.33/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
echo "✅ Node prep complete. Ready for kubeadm init (control-plane) or join (workers)."
2. k8s-master-init.sh (control-plane only)
This initializes the control-plane with Calico networking.
#!/bin/bash
set -e
POD_CIDR="192.168.0.0/16"
API_ADVERTISE_IP=$(hostname -I | awk '{print $1}')
echo "[Step 1] Initializing Kubernetes control-plane..."
sudo kubeadm init \
--pod-network-cidr=${POD_CIDR} \
--apiserver-advertise-address=${API_ADVERTISE_IP}
echo "[Step 2] Setting up kubeconfig for current user..."
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo "[Step 3] Installing Calico CNI..."
kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
echo "✅ Control-plane initialized. Workers can now join using the kubeadm join command printed above."
3. Worker join command
After running the master init script, copy the kubeadm join ... line that is printed and run it on each worker node.
If you need a new token later:
sudo kubeadm token create --print-join-command
No comments:
Post a Comment