Installasi Kubernetes Cluster Multi-Node dengan Kubeadm dan WireGuard VPN

Kubernetes adalah platform orkestrasi container open-source yang populer digunakan untuk mengelola deployment dan scaling aplikasi secara otomatis di banyak server. Untuk membangun cluster Kubernetes yang terdiri dari beberapa node (server), diperlukan konektivitas jaringan stabil antar node. Namun pada kondisi tertentu, tidak semua server memiliki IP publik, seperti pada server rumah atau server pribadi milik anggota tim.

Oleh karena itu, dalam dokumentasi ini, kita akan menggunakan WireGuard VPN untuk menyatukan semua server dalam jaringan virtual private (mesh). Hanya 1 server (master) yang wajib memiliki IP publik agar bisa diakses oleh server lain melalui VPN. Server lainnya (worker) bisa berada di jaringan lokal, rumah, atau bahkan menggunakan koneksi internet mobile, selama dapat terhubung ke WireGuard master.

Catatan: Kubernetes tidak bisa bersanding dengan docker.io karena containerd yang berbeda service

 

🛠️ Topologi Cluster

  • Master Node (Server Kantor): Memiliki IP Publik, menjadi pusat kontrol Kubernetes.
  • Worker Node (Server Home): Terhubung melalui WireGuard, tidak memiliki IP publik.
  • Worker Node (Server Boz): Sama seperti server home, hanya terhubung via VPN.

1. Instalasi dan Konfigurasi WireGuard di Semua Server

Install WireGuard

 
 
 
sudo apt update 
sudo apt install wireguard -y

🔑 Generate Key Pair di Tiap Server

Server master

 
 
 
mkdir -p /home/wg_config/master 
wg genkey | tee /home/wg_config/master/master.key | wg pubkey > /home/wg_config/master/master.pub

Server home

 
 
 
mkdir -p /home/wg_config/home 
wg genkey | tee /home/wg_config/home/home.key | wg pubkey > /home/wg_config/home/home.pub

Server boz

 
 
 
mkdir -p /home/wg_config/boz 
wg genkey | tee /home/wg_config/boz/boz.key | wg pubkey > /home/wg_config/boz/boz.pub

Konfigurasi di Server Master (10.8.0.1) - /etc/wireguard/wg0.conf

 
 
 
nano /etc/wireguard/wg0.conf

Isi

 
 
 
[Interface] 
ListenPort = 51820 
Address = 10.8.0.1/24 
PrivateKey = 
 
[Peer] 
PublicKey = 
AllowedIPs = 10.8.0.2/32 
 
[Peer] 
PublicKey = 
AllowedIPs = 10.8.0.3/32

Konfigurasi di Server Home (10.8.0.2)

 
 
 
[Interface] 
Address = 10.8.0.2/24 
PrivateKey = 
 
[Peer] 
PublicKey = 
Endpoint = :51820 
AllowedIPs = 0.0.0.0/0 
PersistentKeepalive = 25

Konfigurasi di Server Boz (10.8.0.3)

 
 
 
[Interface] 
Address = 10.8.0.3/24 
PrivateKey = 
 
[Peer] 
PublicKey = 
Endpoint = :51820 
AllowedIPs = 0.0.0.0/0 
PersistentKeepalive = 25

Aktifkan WireGuard

 
 
 
sudo systemctl enable wg-quick@wg0 
sudo systemctl start wg-quick@wg0 
sudo systemctl restart wg-quick@wg0

Verifikasi Koneksi

 
 
 
ping 10.8.0.1   # dari client ke master 
ping 10.8.0.2   # dari master ke home 
ping 10.8.0.3   # dari master ke boz

Catatan Penting

Untuk konfigurasi peer pada home dan boz maka jika 0.0.0.0/0 akan merubah routing melalui wireguard termasuk internetnya, jika internet tetap menggunakan sumber saja maka bisa merubah peer di home dan boz menjadi

 
 
 
AllowedIPs = 10.8.0.0/24

2. Instalasi Kubernetes di Semua Node

Install Kubernetes Dependencies

 
 
 
sudo apt-get update 
sudo apt-get install -y apt-transport-https ca-certificates curl gpg 
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg 
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list 
sudo apt-get update 
sudo apt install kubelet kubeadm kubectl -y 
sudo apt-mark hold kubelet kubeadm kubectl

Install dan Konfigurasi Containerd

 
 
 
sudo apt install containerd -y 
sudo mkdir -p /etc/containerd 
containerd config default | sudo tee /etc/containerd/config.toml 
sudo systemctl restart containerd

3. Inisialisasi Cluster di Master

 
 
 
sudo kubeadm reset -f # hanya untuk menghapus conf lama 
sudo rm -rf ~/.kube /etc/kubernetes # hanya untuk menghapus conf lama 
sudo rm -f /etc/kubernetes/manifests/*.yaml # hanya untuk menghapus conf lama 
sudo swapoff -a 
nano /etc/fstab # ... swap swap sw 0 0 
 sudo systemctl restart containerd kubelet sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Note: Jangan lupa simpan kubeadm token yang dihasilkan

Set Kubeconfig untuk User

 
 
 
sudo mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Install CNI (Flannel)

 
 
 
systemctl restart kubelet 
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --validate=false 

Ambil Perintah Join Token

 
 
 
kubeadm token create --print-join-command

4. Join Server Home dan Boz ke Cluster

Di Masing-masing Worker Node:

 
 
 
sudo kubeadm join 10.8.0.1:6443 --token  \ 
    --discovery-token-ca-cert-hash sha256:

Verifikasi di Master

 
 
 
kubectl get nodes

✅ Verifikasi dan Monitoring

 
 
 
kubectl get nodes 
kubectl get pods --all-namespaces

🧠 Catatan

  • Pastikan semua server tetap terhubung ke VPN untuk komunikasi cluster.
  • Jika salah satu node tidak muncul, periksa konfigurasi WireGuard dan pastikan port 51820 terbuka di firewall.
  • Untuk setup lanjutan: tambahkan Ingress Controller, Helm, dan Auto-Scaler sesuai kebutuhan.

🔧 Uninstall Kubernetes Secara Lengkap (Kubeadm-based Cluster)

# 1. Hentikan semua service Kubernetes
sudo systemctl stop kubelet

# 2. Reset cluster (hapus semua konfigurasi dan static pod)
sudo kubeadm reset -f

# 3. Hapus konfigurasi dan direktori Kubernetes
sudo rm -rf ~/.kube
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet
sudo rm -rf /etc/cni
sudo rm -rf /opt/cni
sudo rm -rf /run/flannel

# 4. Hapus paket Kubernetes
sudo apt purge kubeadm kubelet kubectl kubernetes-cni
sudo apt autoremove
sudo apt autoclean

# 5. Cek dan bersihkan container runtime (opsional, jika pakai containerd atau docker)
sudo systemctl stop containerd
sudo rm -rf /var/lib/containerd
 

The power of documents

Kami sajikan dengan bahasa yang mudah dengan disertai command line yang bisa di copy-paste sehingga memudahkan untuk melakukan modifikasi command line