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 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

Enable Required Modules

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf 
overlay 
br_netfilter 
EOF 
sudo modprobe overlay 
sudo modprobe br_netfilter

Sysctl settings

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1 
EOF 
sudo sysctl --system

Install Kubernetes Dependencies

sudo apt-get update 
sudo apt-get install apt-transport-https ca-certificates curl gpg -y 
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
# pastikan bind-address ke ip
sudo nano /etc/kubernetes/manifests/kube-apiserver.yaml 
--- 
spec: 
  containers: 
  - command: 
    - kube-apiserver 
    - --advertise-address=192.168.0.101 
    - --bind-address=192.168.0.101 
    - --allow-privileged=true 
---

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. Deploy Kubernetes Dashboard (Webadmin)

Langkah 1: Deploy Kubernetes Dashboard (v2.7.0)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml --validate=false 
kubectl get pods -n kubernetes-dashboard

Langkah 2: Buat Admin Service Account + RoleBinding

cat <<EOF | kubectl apply -f - 
apiVersion: v1 
kind: ServiceAccount 
metadata: 
  name: admin-user 
  namespace: kubernetes-dashboard 
--- 
apiVersion: rbac.authorization.k8s.io/v1 
kind: ClusterRoleBinding 
metadata: 
  name: admin-user 
roleRef: 
  apiGroup: rbac.authorization.k8s.io 
  kind: ClusterRole 
  name: cluster-admin 
subjects: 
- kind: ServiceAccount 
  name: admin-user 
  namespace: kubernetes-dashboard 
EOF

Langkah 3: Ambil Token Login Dashboard

kubectl -n kubernetes-dashboard create token admin-user

Langkah 4: Akses Dashboard via Web Browser

kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443

Lalu akses via browser:
https://localhost:8443
Login pakai token dari langkah 3.


5. 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