# Install K8s Cluster on Ubuntu 20.04 ![](https://i.imgur.com/4pqF0hV.png) ## Requirements | Server Type | Server Hostname | IP address | Specs | | --- | --- | --- | --- | | Master | master | 192.168.1.200/24 | RAM: 4G, 2vCPU | | Worker | worker1 | 192.168.1.201/24 | RAM: 2G, 1vCPU | | Worker | worker2 | 192.168.1.202/24 | RAM: 2G, 1vCPU | ## 1. Installing k8s (both master & worker node) **Install kubelet, kubeadm and kubectl** ```bash # Set hostname # On master node sudo hostnamectl set-hostname "master" # On worker node sudo hostnamectl set-hostname "node1" sudo hostnamectl set-hostname "node2" # update packages sudo apt update sudo apt -y full-upgrade [ -f /var/run/reboot-required ] && sudo reboot -f # config sudo apt -y install curl apt-transport-https curl -s [https://packages.cloud.google.com/apt/doc/apt-key.gpg](https://packages.cloud.google.com/apt/doc/apt-key.gpg) | sudo apt-key add - echo "deb [https://apt.kubernetes.io/](https://apt.kubernetes.io/) kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list #install sudo apt update sudo apt -y install kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl #check kubectl version --output=yaml kubeadm version --output=yaml ``` **Disable Swap** ```bash sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab sudo nano /etc/fstab # comment line /swap.img #/swap.img none swap sw 0 0 ``` **Confirm setting is correct** ```bash sudo swapoff -a sudo mount -a free -h ``` **Enable kernel modules and configure sysctl.** ```bash # Enable kernel modules sudo modprobe overlay sudo modprobe br_netfilter # Add some settings to sysctl sudo tee /etc/sysctl.d/kubernetes.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF # Reload sysctl sudo sysctl --system ``` ## 2. Install Container runtime ![https://www.nyanblock.com/wp-content/uploads/2022/04/image-1-1024x423.png](https://www.nyanblock.com/wp-content/uploads/2022/04/image-1-1024x423.png) ```bash sudo apt update sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install -y containerd.io docker-ce docker-ce-cli # Create required directories sudo mkdir -p /etc/systemd/system/docker.service.d # Create daemon json config file ====================================================== sudo tee /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF # Start and enable Services ====================================================== sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl restart docker sudo systemctl status docker ``` ## 3. Install and config cri-dockerd (docker-shim) ```bash wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.0/cri-dockerd-0.3.0.amd64.tgz tar xvf cri-dockerd-0.3.0.amd64.tgz sudo mv cri-dockerd/cri-dockerd /usr/local/bin/ sudo chmod +x /usr/local/bin/cri-dockerd #Check cri-dockerd --version ## Configure systemd units for cri-dockerd: ====================================================== wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/ sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service ## Start and enable the services sudo systemctl daemon-reload sudo systemctl enable cri-docker.service sudo systemctl enable --now cri-docker.socket ``` ## 4. **Initialize master node** **Checking** ```bash #check module **br_netfilter** lsmod | grep br_netfilter # Enable kubelet service sudo systemctl enable kubelet sudo systemctl start kubelet #check kubelet service sudo systemctl status kubelet ``` **Init cluster (master node)** ```bash #init sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///run/cri-dockerd.sock #config mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config sudo kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml #check watch kubectl get nodes ``` ## 5. Join worker node ```bash # On Master node kubeadm token create --print-join-command # On Worker node kubeadm join 192.168.1.200:6443 \ --cri-socket unix:///run/cri-dockerd.sock \ --token wrsrkm.vuuetb8jnkkvfe98 \ --discovery-token-ca-cert-hash sha256:9c949654a4ab32409f411f38e4418686e9bd9dc2a59c48fa10bf85a5f2970847 ``` ## Remove worker nodes ```bash # ON MASTER NODE kubectl get nodes kubectl drain **worker1** --delete-local-data --force --ignore-daemonsets kubectl delete **worker1** kubectl get nodes # ON WORKER NODE kubeadm reset ``` # Test commands ```bash kubectl get nodes -o wide ``` ```bash # Restart Cluster docker restart $(docker ps -a -q) systemctl restart kubelet systemctl status docker systemctl status kubelet sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl restart kubelet ```