Install K8s Cluster on Ubuntu 20.04

k8s

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

# 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

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

sudo swapoff -a
sudo mount -a
free -h

Enable kernel modules and configure sysctl.

# 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

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)

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

#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)

#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

# 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

# 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

kubectl get nodes -o wide
# 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

Previous Post Next Post