1. Eksekusi di semua nodes

  1. Update repo & packages
sudo apt-get update -y && sudo apt upgrade -y --with-new-pkgs
  1. Install dependencies
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
  1. Setup localtime
sudo timedatectl set-timezone Asia/Jakarta
  1. Setup hosts file
sudo nano /etc/hosts
...
xxx.xxx.xxx.xxx hostname
... 

2. Install Kubernetes dan Containerd

  1. Disable swap
sudo swapoff -a
  1. Disable swap on startup in /etc/fstab:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  1. Create configuration file for containerd:
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
  1. Load modules:
sudo modprobe overlay
sudo modprobe br_netfilter
  1. Set system configurations for Kubernetes networking:
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
  1. Apply new settings:
sudo sysctl --system
  1. Install Containerd
sudo apt-get update && sudo apt-get install -y containerd
  1. Create default configuration file for containerd:
sudo mkdir -p /etc/containerd
  1. Generate default containerd configuration and save to the newly created default file:
sudo containerd config default | sudo tee /etc/containerd/config.toml
  1. Restart & check status containerd to ensure new configuration file usage:
sudo systemctl restart containerd
sudo systemctl status containerd
  1. Add kubernetes repository
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update
  1. Install Kubelet, kubeadm dan kubectl
sudo apt-get -y install kubelet=1.23.0-00 kubeadm=1.23.0-00 kubectl=1.23.0-00

3. Clustering Kubernetes

Master Nodes

  1. Init kubernetes

Jika menggunakan flannel

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint "<vip-atau-hostname-master:6443>" --upload-certs

Jika menggunakan calico

sudo kubeadm init --control-plane-endpoint "<vip-atau-hostname-master:6443>" --upload-certs
  1. Set Kubectl access
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. Alternatively, if you are the root user, you can run:
export KUBECONFIG=$HOME/.kube/config
  1. Install CNI

Jika menggunakan Flannel

kubectl apply -f [https://raw.githubusercontent.com/coreos/**flan**nel/master/Documentation/kube-**flan**nel.yml](https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)

jika menggunakan Calico

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Init kubernetes jika menggunakan versi dibawah 1.20.x

  1. Bikin file kubeadm-config
sudo nano kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
podSubnet: "10.244.0.0/16"
kubernetesVersion: "v1.15.1"  ## *sesuaikan dengan versi cluster*
controlPlaneEndpoint: “<vip-atau-hostname-master:6443>"
apiServer:
  certSANs:
  - "IP-Master1"
  - "hostname-master1"
  - "IP-Master2"
  - "hostname-master2"
  - "IP-Master3"
  - "hostname-master3"
  - "IP-VIP"
  - "hostname-VIP"
  1. Init Cluster
kubeadm init --config=kubeadm-config.yaml
  1. Sebelum join cluster, copy file ke semua master
scp -r /etc/kubernetes/pki master-node:~/
cd pki
mkdir -p /etc/kubernetes/pki/etcd
cp ca.crt ca.key sa.key sa.pub front-proxy-ca.crt front-proxy-ca.key /etc/kubernetes/pki
cp etcd/ca.crt etcd/ca.key /etc/kubernetes/pki/etcd/

Join cluster

  1. Join Master node ke Cluster

In the Control Plane Node/Master node, create the token and copy the kubeadm join command (NOTE:The join command can also be found in the output from kubeadm init command):

sudo kubeadm token create --print-join-command

sudo kubeadm join <join command from the previous command> --control-plane —apiserver-advertise-address=<ip-node>
  1. Join Worker node ke Cluster
sudo kubeadm join <join command from the previous command>
kubectl label nodes <worker-hostname> type=app
  1. Add worker label
kubectl label nodes <worker-hostname> [node-role.kubernetes.io/worker=](http://node-role.kubernetes.io/worker=)

4. Rejoin master/worker node baru ke existing cluster

master$ sudo KUBECERT=$(kubeadm init phase upload-certs --upload-certs)
master# sudo kubeadm token create --certificate-key $KUBECERT --print-join-command
worker-new$ sudo kubeadm join <join command from the previous command>
  
master-new$ sudo kubeadm join --control-plane <join command from the previous command>