Instalasi Kubernetes High Availability (HA) Cluster dengan Kubeadm & Containerd
Introduction
Pada artikel ini, kita akan melakukan instalasi Kubernetes Cluster High Availability (HA). Untuk menjamin ketersediaan tinggi pada control-plane endpoint, kita menggunakan HAProxy sebagai Load Balancer.
Topology
---
Setup Haproxy
Kita akan menggunakan Haporxy sebagai loadbalancer untuk controlplane kubernetes.
frontend kubernetes_api
bind *:6443
mode tcp
option tcplog
default_backend kubernetes_masters
backend kubernetes_masters
mode tcp
option tcp-check
balance roundrobin
server master1 10.100.19.51:6443 check fall 3 rise 2
server master2 10.100.19.52:6443 check fall 3 rise 2
server master3 10.100.19.53:6443 check fall 3 rise 2
Persiapan & Hardening System (Semua Node)
Lakukan konfigurasi berikut di seluruh node (Control-plane & Worker).
Konfigurasi Firewall (UFW)
Aktifkan aturan forwarding pada UFW agar trafik antar-interface dapat saling berkomunikasi:
sudo sed -i 's/^DEFAULT_FORWARD_POLICY=.*/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
Port yang Harus Dibuka pada Control-Plane Nodes:
-
6443/tcp: Kubernetes API Server -
10250/tcp: Kubelet API -
10257/tcp: Kube-controller-manager -
10259/tcp: Kube-scheduler -
2380/tcp: etcd client/peer API
sudo ufw allow 6443/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10257/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 2380/tcp
Port yang Harus Dibuka pada Worker Nodes:
10250/tcp: Kubelet API
sudo ufw allow 10250/tcp
Konfigurasi Dasar OS (Semua Node)
-
Ubah Timezone
sudo timedatectl set-timezone Asia/Jakarta -
Ubah Hostname (Sesuaikan dengan nama node masing-masing)
sudo hostnamectl set-hostname <hostname-server> -
Update & Upgrade Package
sudo apt update && sudo apt upgrade -y -
Nonaktifkan Swap (Wajib untuk Kubernetes)
sudo swapoff -a sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab -
Load Kernel Modules
sudo modprobe overlay sudo modprobe br_netfilter # Buat permanen saat boot sudo tee /etc/modules-load.d/k8s.conf <<EOF overlay br_netfilter EOF -
Konfigurasi Sysctl / Kernel Parameter
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 # Apply sysctl tanpa perlu reboot sudo sysctl --system -
Verifikasi Module & Sysctl
# Cek modul kernel lsmod | grep -E "br_netfilter|overlay" # Cek parameter sysctl sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward -
Reboot Server
sudo reboot
Instalasi Containerd Runtime (Semua Node)
Kita akan menggunakan Containerd sebagai container runtime.
-
Install Dependensi
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates -
Tambah Repositori Docker / Containerd
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -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" -y -
Install Containerd
sudo apt update && sudo apt install -y containerd.io -
Konfigurasi Containerd menggunakan SystemdCgroup
sudo mkdir -p /etc/containerd 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
Instalasi Komponen Kubernetes (Semua Node)
Kita akan menginstall Kubernetes versi v1.34 menggunakan kubeadm.
-
Tambah Public Signing Key Kubernetes
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/k8s.gpg -
Tambah Repositori Kubernetes
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 Kubelet, Kubeadm, dan Kubectl
sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl -
Pre-pull Container Image (Direkomendasikan agar proses inisialisasi tidak terputus karena masalah koneksi)
sudo kubeadm config images list sudo kubeadm config images pull
Inisialisasi Cluster (Hanya di Master 1)
“Tips: Buat VM Snapshot terlebih dahulu sebelum menjalankan langkah ini agar lebih mudah melakukan rollback jika terjadi kesalahan.
Jalankan perintah inisialisasi berikut pada Master 1:
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:6443 \
--upload-certs
Penjelasan Parameter:
-
--pod-network-cidr: Alokasi IP Address range untuk Pod Network. -
--service-cidr: Alokasi IP Address range untuk ClusterIP Service. -
--control-plane-endpoint: IP Virtual (VIP) atau FQDN dari Load Balancer (HAProxy). -
--upload-certs: Mengunggah sertifikat control-plane ke Secretkubeadm-certssecara otomatis.
---
Menggabungkan Node ke Cluster
Setelah kubeadm init selesai, output terminal akan memberikan perintah join untuk Control-Plane dan Worker.
Join Additional Control-Plane (Master 2 & Master 3)
Jalankan perintah join dengan flag --control-plane pada Master 2 dan Master 3:
sudo kubeadm join 10.100.19.100:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH> \
--control-plane --certificate-key <CERT-KEY>
Join Worker Nodes (Semua Worker)
Jalankan perintah join standar pada seluruh Worker Node:
sudo kubeadm join 10.100.19.100:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
Konfigurasi Kubectl & Verifikasi Cluster
Konfigurasi Akses Kubectl (Di Control-Plane Nodes)
Agar kita dapat menjalankan perintah kubectl dari user biasa:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Verifikasi Node Status
Jalankan perintah ini untuk melihat status seluruh node:
kubectl get nodes
Catatan Tambahan: Node mungkin akan berada dalam status NotReady sampai Anda menginstall Container Network Interface (CNI) seperti Calico, Cilium, atau Flannel. Pasang CNI pilihan Anda untuk menyelesaikan konfigurasi cluster.