# Kubernetes  Cluster Creation Using Kubeadm

Kubernetes

Kubernetes is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications. It allows you to manage clusters of nodes efficiently.

In this guide, I'll walk you through setting up a multi-node Kubernetes cluster using **Kubeadm**. I used **EC2 instances (t2.medium)** for both the master and worker nodes.

---

## **Prerequisites**

Before we start, make sure you have:

* **Two or more Ubuntu 18.04 or higher EC2 instances** (t2.medium recommended)
    
* **At least 2GB of RAM and 2 CPU cores per instance**
    
* **Network connectivity between nodes**
    
* **Root access** to each server
    

---

## **Step 1: Update and Install Dependencies (Run on All Nodes)**

Update the package list and install required dependencies to ensure the latest versions are available:

```bash
sudo apt-get update
sudo apt install apt-transport-https curl -y
```

---

## **Step 2: Install Containerd (Run on All Nodes)**

Kubernetes requires a container runtime. We will install **Containerd**, which is a lightweight container runtime:

```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install containerd.io -y
```

### **Configure Containerd (Run on All Nodes)**

Generate and update the default configuration file for **Containerd**:

```bash
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
```

Enable `SystemdCgroup` to ensure better compatibility with Kubernetes:

```bash
sudo sed -i -e 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
```

Alternatively, you can manually open the configuration file and change the setting:

```bash
sudo nano /etc/containerd/config.toml
```

Find the line:

```bash
SystemdCgroup = false
```

Change it to:

```bash
SystemdCgroup = true
```

Save and exit (`CTRL+X`, then `Y`, then `Enter`).

Restart **Containerd** to apply changes:

```bash
sudo systemctl restart containerd
```

---

## **Step 3: Install Kubernetes (Run on All Nodes)**

Install Kubernetes components **(kubelet, kubeadm, and kubectl)** to set up and manage the cluster:

```bash
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
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
```

---

## **Step 4: Disable Swap (Run on All Nodes)**

Kubernetes requires swap to be disabled for performance reasons:

```bash
sudo swapoff -a
```

To make this change permanent, remove swap entries in `/etc/fstab`:

```bash
sudo nano /etc/fstab
```

---

## **Step 5: Enable Kernel Modules and Sysctl Settings (Run on All Nodes)**

Enable kernel modules and IP forwarding for Kubernetes networking:

```bash
sudo modprobe br_netfilter
sudo sysctl -w net.ipv4.ip_forward=1
```

---

## **Step 6: Initialize the Kubernetes Cluster (Run on Master Node Only)**

Initialize the cluster using **kubeadm**, specifying a pod network CIDR:

```bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
```

After initialization, configure `kubectl` for cluster management:

```bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

---

## **Step 7: Install Flannel (Run on Master Node Only)**

Flannel is a **networking solution** that allows pods to communicate across nodes:

```bash
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
```

Verify that all system pods are running:

```bash
kubectl get pods --all-namespaces
```

---

## **Step 8: Join Worker Nodes to the Cluster (Run on Worker Nodes Only)**

After initializing the cluster, the `kubeadm init` command will output a **join command** similar to this:

```bash
kubeadm join <MASTER_NODE_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
```

Run this command on **each worker node** to add it to the cluster.

To verify if worker nodes have successfully joined, run this command on the master node:

```bash
kubectl get nodes
```

---

## **Conclusion**

Congratulations! 🎉 You have successfully set up a multi-node Kubernetes cluster using **Kubeadm**. You can now deploy applications, set up services, and explore more Kubernetes features!

Let me know if you have any questions!
