Tutorial Setup Homelab K3s di STB Bekas Pakai Cloudflare Tunnel
Poin Kunci Artikel Ini:
- SoC: Amlogic S905X (Quad-Core 1.5 GHz ARM Cortex-A53)
- Arsitektur CPU: ARMv8-A (64-bit)
- RAM: 1GB atau 2GB DDR3
Analisis Hardware: Potensi STB Android Bekas untuk Server Cluster
STB Android bekas ISP seperti FiberHome HG680P dan ZTE B860H ditenagai System-on-Chip (SoC) Amlogic S905X. Chipset ARM64 Quad-Core Cortex-A53 1.5 GHz hemat energi. Daya operasional hanya 3 Watt hingga 5 Watt pada beban kerja penuh. Biaya operasi bulanan sangat rendah dibanding server x86 standar.
Spesifikasi Teknis Target Node
- SoC: Amlogic S905X (Quad-Core 1.5 GHz ARM Cortex-A53)
- Arsitektur CPU: ARMv8-A (64-bit)
- RAM: 1GB atau 2GB DDR3
- Penyimpanan Internal: 8GB eMMC
- Penyimpanan Eksternal: Port MicroSD (SDHC/SDXC) & USB 2.0
- Konektivitas Jaringan: Realtek RTL8211F Gigabit/100Mbps Ethernet & Wi-Fi 2.4GHz
- Power Supply: 12V / 1A DC (Konsumsi menganggur ~2.5W, beban puncak ~4.8W)
Flash OS: Migrasi dari Android ke Armbian Linux
K3s butuh kernel Linux native. Android OS tidak mendukung subsystem cgroup Kubernetes secara default. Ganti OS ke Armbian Linux berbasis Debian Bookworm atau Ubuntu Jammy server image.
Langkah Flash Armbian ke MicroSD
- Unduh image Armbian S905X versi minimal (Debian Bookworm Linux 6.x ARM64).
- Tulis image ke MicroSD (minimal 16GB Class 10) memakai utility
balenaEtcherataudd:sudo dd if=Armbian_S905x_Bookworm.img of=/dev/sdX bs=4M status=progress conv=fsync - Buka partisi
BOOTdi MicroSD. Sesuaikan konfigurasi Device Tree Blob (DTB). Edit fileuEnv.txt:FDT=/dtb/amlogic/meson-gxl-s905x-p212.dtb - Masukkan MicroSD ke STB. Tekan tombol reset fisik di dalam lubang Jack AV menggunakan kawat/tusuk gigi saat menyambungkan kabel power (Toothpick Method).
- Tunggu proses U-Boot mengalihkan bootloader ke MicroSD.
- Dapatkan IP address STB dari dashboard DHCP router. Akses shell via SSH:
(Password default:ssh root@<IP_ADDRESS_STB>1234). Ubah password dan buat user sudo baru.
Konfigurasi Linux Kernel: Enable Cgroup Memory & Swap File
Kubelet K3s gagal inisialisasi jika kernel tidak mencatat penggunaan memori per kontainer. Aktifkan parameter kernel cgroup memory secara manual.
Edit file konfigurasi bootloader /boot/armbianEnv.txt:
sudo nano /boot/armbianEnv.txtTambahkan parameter cgroup pada baris extraargs:
extraargs=cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memoryBuat swap file 2GB. Swap mencegah kernel OOM Killer mematikan proses K3s saat lonjakan alokasi RAM pada varian STB RAM 1GB:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabSesuaikan nilai swappiness agar OS hanya memakai swap saat RAM fisik habis:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swappiness.conf
sudo sysctl --systemReboot sistem untuk menerapkan parameter kernel:
sudo rebootVerifikasi status cgroup setelah reboot:
cat /proc/cgroupsPastikan baris memory menunjukkan angka 1 pada kolom teratas (enabled).
Instalasi K3s Lightweight Kubernetes
K3s membuang fitur legacy Kubernetes dan penyedia cloud eksternal. Ukuran biner tunggal kurang dari 100MB. Untuk alokasi RAM 1GB, matikan komponen bawaan seperti Traefik Ingress Controller dan ServiceLB (Klipper-LB). Cloudflare Tunnel akan menggantikan peran LoadBalancer dan Ingress eksternal.
Eksekusi Script Instalasi K3s Optimized
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable=traefik --disable=servicelb --node-name=stb-node-01" sh -Periksa status eksekusi service systemd K3s:
sudo systemctl status k3sVerifikasi kesiapan node Kubernetes:
sudo k3s kubectl get nodes -o wideKonfigurasi Akses kubectl User Non-Root
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config
echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc
source ~/.bashrcUji perintah kubectl standar:
kubectl get pods -ADeployment Aplikasi Uji: NGINX Web Server
Uji fungsionalitas pengontrol Pod dan Networking K3s dengan mengeksekusi manifest Deployment dan ClusterIP Service.
Buat file nginx-demo.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests:
memory: "16Mi"
cpu: "25m"
limits:
memory: "64Mi"
cpu: "100m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
type: ClusterIP
selector:
app: nginx-demo
ports:
- port: 80
targetPort: 80Terapkan manifest ke cluster:
kubectl apply -f nginx-demo.yamlVerifikasi status Pod dan Endpoint Service:
kubectl get pods -l app=nginx-demo
kubectl get svc nginx-serviceExpose Service via Cloudflare Tunnel (cloudflared)
Cloudflare Tunnel membuat koneksi outbound terenkripsi (TLS) dari STB ke edge network Cloudflare. Keunggulan: Tanpa Port Forwarding router, bypass Carrier-Grade NAT (CGNAT) dari ISP, tidak butuh IP publik statis, serta perlindungan DDoS bawaan.
Instalasi cloudflared Daemon ARM64
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb
sudo dpkg -i cloudflared.deb
rm cloudflared.debOtentikasi dan Pembuatan Tunnel
- Jalankan proses otentikasi akun Cloudflare:
Salin URL yang dihasilkan ke browser. Pilih domain yang sudah terhubung di Cloudflare.cloudflared tunnel login - Buat tunnel baru untuk node STB:
Output menampilkan UUID tunnel unik dan lokasi file sertifikat/kredensial JSON dicloudflared tunnel create stb-k3s-tunnel~/.cloudflared/<UUID>.json. Salin UUID tersebut. - Buat file konfigurasi tunnel
~/.cloudflared/config.yml:
Note: Target service menunjuk ke DNS internal Kubernetes CoreDNS (tunnel: <UUID-TUNNEL-ANDA> credentials-file: /root/.cloudflared/<UUID-TUNNEL-ANDA>.json ingress: - hostname: homelab.domainanda.com service: http://nginx-service.default.svc.cluster.local:80 - service: http_status:404<service-name>.<namespace>.svc.cluster.local) atau IP ClusterIP. - Petakan DNS record domain ke tunnel:
Perintah ini membuat DNS record tipe CNAME secara otomatis di dashboard Cloudflare.cloudflared tunnel route dns stb-k3s-tunnel homelab.domainanda.com - Daftarkan dan jalankan
cloudflaredsebagai systemd daemon:sudo cloudflared service install sudo systemctl start cloudflared sudo systemctl enable cloudflared
Uji akses domain https://homelab.domainanda.com via browser atau cURL dari luar jaringan lokal.
Optimasi Performa & Manajemen Memori RAM 1GB
Membatasi Resource Kubelet & Containerd
Default K3s mengalokasikan threshold buffer yang terlalu besar untuk hardware berkapasitas RAM 1GB. Atur limit spesifik pada pengenal service K3s.
Edit file service /etc/systemd/system/k3s.service:
sudo nano /etc/systemd/system/k3s.serviceModifikasi ExecStart dengan penambahan argument pembatas:
ExecStart=/usr/local/bin/k3s \
server \
--disable=traefik \
--disable=servicelb \
--kubelet-arg="max-pods=10" \
--kubelet-arg="eviction-hard=memory.available<100Mi" \
--kubelet-arg="kube-reserved=cpu=100m,memory=150Mi" \
--kubelet-arg="system-reserved=cpu=100m,memory=150Mi"Muat ulang konfigurasi systemd dan restart K3s:
sudo systemctl daemon-reload
sudo systemctl restart k3sWajib Menentukan Resource Limits di Setiap Manifest Pod
Pod tanpa instruksi resources.limits.memory bisa mengambil seluruh sisa RAM STB. Hal ini memicu Kernel Kernel Panic atau SSH crash.
spec:
containers:
- name: app-name
image: app-image:tag
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "250m"Ringkasan Langkah Verifikasi Setup
- [x] Flash Armbian Linux Bookworm ARM64 ke MicroSD.
- [x] Modifikasi
/boot/armbianEnv.txtuntuk mengaktifkan cgroup memory. - [x] Konfigurasi 2GB Swap File dengan swappiness = 10.
- [x] Instal biner K3s tanpa Traefik dan ServiceLB.
- [x] Jalankan aplikasi uji NGINX dengan resource limits terpasang.
- [x] Instal daemon
cloudflareddan buat tunnel aktif. - [x] Hubungkan ingress tunnel ke CoreDNS K3s (
nginx-service.default.svc.cluster.local). - [x] Atur batas alokasi pods maksimum dan reserved memory pada flag Kubelet K3s.
Pengembangan Arsitektur Multi-Node Cluster
STB tunggal bertindak sebagai Control Plane dan Worker bersamaan. Untuk menambah throughput kineja, tambahkan STB bekas lain sebagai Worker Node murni.
Langkah Scaling Tambah Worker Node
- Dapatkan token autentikasi dari Node Master (STB 1):
sudo cat /var/lib/rancher/k3s/server/node-token - Ambil IP lokal STB Master:
192.168.1.100. - Pada STB Worker baru (STB 2) yang sudah dikonfigurasi Armbian, Swap, dan Cgroup, jalankan script agent:
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN_MASTER> sh - - Verifikasi penambahan node dari STB Master:
kubectl get nodes
Cluster Kubernetes K3s berbasis STB bekas siap menjalankan beban kerja mikro terdistribusi secara efisien, aman, dan hemat listrik.


