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

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