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.
Setup Kubernetes
Hardening (ALL Nodes)
Untuk hardening masing-masing VM, kita bisa menggunakan tips dibawah ini
Dalam tutorial diatas, kita melakukan konfigurasi UFW, untuk port yang diallow kubernetes sebagai berikut
Enable forwarding rules pada ufw agar trafik antara interface bisa komunikasi.
sudo sed -i 's/^DEFAULT_FORWARD_POLICY=.*/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufwKonfigurasi UFW untuk Control-plane
sudo ufw allow 6443/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10257/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 2380/tcpKonfigurasi UFW untuk Worker
sudo ufw allow 10250/tcp| 6443 | Kubernetes API Server |
| 10250 | Kubelet |
| 10257 | Kube-controller-manager |
| 10259 | Kube-scheduler |
| 2380 | etcd |
First Setup (ALL Nodes)
Ubah timezone
sudo timedatectl set-timezone Asia/JakartaUbah hostname sesuai yang sudah kita tentukan
sudo hostnamectl set-hostname <hostname server>Update & upgrade package
sudo apt update && sudo apt upgrade -yReboot server
sudo rebootDisable swap dan swap partition pada /etc/fstab
sudo swapoff -a
sudo sed -i 's\/swap.img\#/swap.img\g' /etc/fstabLoad kernel modules
sudo modprobe overlay
sudo modprobe br_netfilterSetting permanent loading kernel
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOFAdd 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
EOTLoad kernel diatas kernel parameter tanpa reboot
sudo sysctl --systemVerifikasi bahwa module overlay dan br_netfilter sudah running
lsmod | grep br_netfilter
lsmod | grep overlayVerifikasi 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_forwardInstall 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-certificatesAdd 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.ioConfigure 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 containerdInstall 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.gpgAdd 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.listInstall kubernetes
sudo apt update
sudo apt install kubelet kubeadm kubectl -yPull 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 pullInitialized 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/configChek 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 CNI (Cluster Network Interface)
Untuk konfigurasi CNI agar status pada node ready, bisa cek pada link berikut