Introduction
Kita akan melakukan instalasi kubernetes cluster yang dimana kita akan menggunakan high available setup. Kita akan menggunakan LoadBalancer (haproxy) untuk koneksi control-plane endpoint.
Topology

Setup HAPROXY
Kita akan menggunakan Haporxy sebagai loadbalancer untuk controlplane kubernetes. Untuk setup haproxy bisa cek pada link berikut.
https://cygnenoir.net/installation-multiple-haproxy-server-using-keepalived-and-git/
Setup Kubernetes
First Setup (ALL Nodes)
Ubah timezone
sudo timedatectl set-timezone Asia/Jakarta
Ubah hostname sesuai yang sudah kita tentukan
sudo hostnamectl set-hostname <hostname server>
Update & upgrade package
sudo apt update && sudo apt upgrade -y
Reboot server
sudo reboot
Disable swap dan swap partition pada /etc/fstab
sudo swapoff -a
sudo sed -i 's\/swap.img\#/swap.img\g' /etc/fstab
Load kernel modules
sudo modprobe overlay
sudo modprobe br_netfilter
Setting permanent loading kernel
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
Add kernel parameter
sudo tee /etc/sysctl.d/kubernetes.conf <<EOT
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOT
Load kernel diatas kernel parameter tanpa reboot
sudo sysctl --system
Verifikasi bahwa module overlay dan br_netfilter sudah running
lsmod | grep br_netfilter
lsmod | grep overlay
Verifikasi bahwa net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, dan net.ipv4.ip_forward sudah di set ke 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
Install containerd (ALL Nodes)
Runtime yang akan kita gunakan yaitu containerd
Install containerd dependencies
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
Add repository containerd
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Install containderd
sudo apt update && sudo apt install containerd.io
Configure containerd for run using SystemdCgroup
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
Install Kubernetes (ALL Nodes)
Kita akan install kubernetes dan menggunakan versi 1.34 (current release) dan untuk manajemen cluster kita akan menggunakan kubeadm.
Download public signing key untuk Kubernetes package repository
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/k8s.gpg
Add Kubernetes repository
echo 'deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/k8s.list
Install kubernetes
sudo apt update
sudo apt install kubelet kubeadm kubectl -y
Pull image terlebih dahulu karena itu lebih direkomendasikan jika kita memiliki internet yang tidak bagus atau terputus ditengah-tengah, jadi tidak akan failed ketika install jika gagal download image
sudo kubeadm config images list
sudo kubeadm config images pull
Initialized kubernetes (On master1)
Pastikan sebelum kita init, kita membuat snapshoot sebelum kita lanjut untuk ke tahap selanjutnya. Akan memudahkan kita ketika ada error, kita tinggal rollback.
Init kubeadm
sudo kubeadm init --pod-network-cidr=10.248.0.0/14 --service-cidr=10.244.0.0/14 --control-plane-endpoint=10.100.19.100 --upload-certs
–pod-network-cidr = Berikan IP Address range untuk POD Network
–service-cidr = Berikan IP Address untuk Services ClusterIP
–control-plane-endpoint = Berikan IP Address atau domain untuk control-plane (Ini akan lebih baik digunakan ketika kita mempunyai multiple master)
–upload-certs = upload control-plane certificates ke the kubeadm-certs Secret.
Kita menggunakan –pod-network-cidr, –service-cidr, –control-plane-endpoint, jadi kita bisa berikan network lebih hati-hati, pada kedepannya akan berguna ketika kita memiliki multiple cluster kubernetes
Hasil dari init kubernetes

Join control-plane to kubernetes cluster (On master2&3)
Sekarang kita akan melakukan join sebagai control-plane ke kubernetes cluster yang sudah di init. Pastikan pada saat join pilih yang join Control-plane.
sudo kubeadm join 10.100.19.50:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH> \
--control-plane --certificate-key <CERT-KEY>

Join worker to kubernetes cluster (ALL worker)
Sekarang kita akan melakukan join sebagai worker node ke kuberentes cluster. Pastikan pada saat join pilih yang Wokrer.
Configuration Kubernetes
Copy default admin conf kubernetes to home (On Control-plane Nodes)
Jika kita ingin check cluster menggunakan kubectl, kita harus copy default admin conf ke home folder pada server tersebut
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Chek kubernetes cluster
kubectl get nodes

Karena semua nodes sudah bisa pengecekan nodes, untuk kedepannya kita akan menggunakan salah satu nodes aja untuk konfigurasi agar cluster ready
Setup ALL Nodes to a Worker Nodes
Untuk konfigurasi mengubah control-plane node menjadi worker node sesuai dengan topology yang kita buat, bisa cek pada link berikut
https://cygnenoir.net/make-a-control-plane-node-to-a-worker/
Setup CNI (Cluster Network Interface)
Untuk konfigurasi CNI agar status pada node ready, bisa cek pada link berikut
https://cygnenoir.net/installing-cni-kubernetes-using-cilium/