K3s adalah distribusi Kubernetes yang dirancang lebih ringan dan mudah diimplementasikan, terutama pada environment dengan resource terbatas seperti edge computing. Dan karakteristik penting dalam Production Environment adalah High Availability (HA), dengan high availabity kita akan bisa menjadikan uptime service aplikasi kita tanpa downtime.
Pada kesempatan ini saya ingin mencontohkan untuk Implementasi High Availability (HA) Kubernetes Cluster dengan K3s.
Contoh Skenario
- Kubernetes HA Cluster dengan 5 Nodes (3 Master & 2 Worker).
- Semua node menggunakan linux debian 12 bookworm.
- Menggunakan K3s versi 1.26.12.
- Packages Manager dengan HELM.
- LoadBalancer dengan METALLB.
- Ingress Controller dengan NGINX INGRESS.
- Database Embedded dengan ETCD di node MASTER.
- PersistentVolume dengan LONGHORN.
Pastikan masing-masing nodes kita mempunyai unique hostname dulu ya, contoh:
$ hostnamectl set-hostname kube-master-1
atau
$ echo kube-master-1 > /etc/hostname
Install depencies yang dibutuhkan disemua node:
$ sudo apt install apparmor iptables jq open-iscsi nfs-common -y
Master Nodes
Disini saya setting eksekusi semua perintah kubectl
tanpa perlu sudo
ya, jadi file config k3s nya saya setup seperti ini setelah saya install k3s nya.
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/rancher/k3s/k3s.yaml $HOME/.kube/config.yaml
$ sudo chown $USER:$GROUP $HOME/.kube/config.yaml
$ export KUBECONFIG=$HOME/.kube/config.yaml
# biar permanen environment variable nya, saya simpan di file .bashrc.
$ echo 'export KUBECONFIG=$HOME/.kube/config.yaml' >> $HOME/.bashrc
kube-master-1
Dalam contoh ini saya install K3s nya di semua nodes dengan single script ya, seperti contoh :
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.26.12+k3s1 sh -s - server --cluster-init --token [email protected] --disable servicelb,local-storage,traefik
Sesuai dengan skenario yang saya rencanakan, kita non-aktifkan “servicelb” “local-storage” dan “traefik“. Dan sesuaikan token yang kita inginkan di flag --token
.
kube-master-2
Di nodes master-2 saya jalankan perintah tuk joining seperti:
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.26.12+k3s1 sh -s - server --server https://192.168.99.101:6443 --token [email protected] --disable servicelb,local-storage,traefik
Sesuaikan IP Server node master-1 kita, contoh ini saya menggunakan IP 192.168.99.101 di node master-1.
kube-master-3
Di nodes master-3 saya jalankan perintah tuk joining:
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.26.12+k3s1 sh -s - server --server https://192.168.99.101:6443 --token [email protected] --disable servicelb,local-storage,traefik
next, kita lanjut ke nodes worker.
Worker Nodes
kube-worker-4
Untuk di nodes worker pakai flag agent ya, untuk join ke master.
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.26.12+k3s1 sh -s - agent --server https://192.168.99.101:6443 --token [email protected]
Lanjut, ke node worker terakhir
kube-worker-5
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.26.12+k3s1 sh -s - agent --server https://192.168.99.101:6443 --token [email protected]
Sekarang kita test apakah semua node dan service sudah READY.
Verifikasi Instalasi
Untuk verifikasi semua nodes sudah join cluster dan service berjalan, jalankan perintah:
$ kubectl get nodes
Outputnya harusnya terlihat seperti ini:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master-1.homelab.modalsemangat.com Ready control-plane,etcd,master 57m v1.28.5+k3s1
kube-master-2.homelab.modalsemangat.com Ready control-plane,etcd,master 54m v1.28.5+k3s1
kube-master-3.homelab.modalsemangat.com Ready control-plane,etcd,master 52m v1.28.5+k3s1
kube-worker-4.homelab.modalsemangat.com Ready <none> 20m v1.28.5+k3s1
kube-worker-5.homelab.modalsemangat.com Ready <none> 17m v1.28.5+k3s1
dietpi@kube-master-1:~$
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6799fbcd5-vpfbl 1/1 Running 6 (5m58s ago) 17h
kube-system metrics-server-67c658944b-lzq8s 1/1 Running 9 (3m42s ago) 17h