AizuDemy

Tutorial Setup Homelab K3s di STB Bekas Pakai Cloudflare Tunnel

Tutorial Setup Homelab K3s di STB Bekas Pakai Cloudflare Tunnel
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 7 mnt baca baca
โšก TL;DR

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
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

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

  1. Unduh image Armbian S905X versi minimal (Debian Bookworm Linux 6.x ARM64).
  2. Tulis image ke MicroSD (minimal 16GB Class 10) memakai utility balenaEtcher atau dd:
    sudo dd if=Armbian_S905x_Bookworm.img of=/dev/sdX bs=4M status=progress conv=fsync
  3. Buka partisi BOOT di MicroSD. Sesuaikan konfigurasi Device Tree Blob (DTB). Edit file uEnv.txt:
    FDT=/dtb/amlogic/meson-gxl-s905x-p212.dtb
  4. Masukkan MicroSD ke STB. Tekan tombol reset fisik di dalam lubang Jack AV menggunakan kawat/tusuk gigi saat menyambungkan kabel power (Toothpick Method).
  5. Tunggu proses U-Boot mengalihkan bootloader ke MicroSD.
  6. Dapatkan IP address STB dari dashboard DHCP router. Akses shell via SSH:
    ssh root@<IP_ADDRESS_STB>
    (Password default: 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.txt

Tambahkan parameter cgroup pada baris extraargs:

extraargs=cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

Buat 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/fstab

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

Reboot sistem untuk menerapkan parameter kernel:

sudo reboot

Verifikasi status cgroup setelah reboot:

cat /proc/cgroups

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

Verifikasi kesiapan node Kubernetes:

sudo k3s kubectl get nodes -o wide

Konfigurasi 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 ~/.bashrc

Uji perintah kubectl standar:

kubectl get pods -A

Deployment 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: 80

Terapkan manifest ke cluster:

kubectl apply -f nginx-demo.yaml

Verifikasi status Pod dan Endpoint Service:

kubectl get pods -l app=nginx-demo
kubectl get svc nginx-service

Expose 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.deb

Otentikasi dan Pembuatan Tunnel

  1. Jalankan proses otentikasi akun Cloudflare:
    cloudflared tunnel login
    Salin URL yang dihasilkan ke browser. Pilih domain yang sudah terhubung di Cloudflare.
  2. Buat tunnel baru untuk node STB:
    cloudflared tunnel create stb-k3s-tunnel
    Output menampilkan UUID tunnel unik dan lokasi file sertifikat/kredensial JSON di ~/.cloudflared/<UUID>.json. Salin UUID tersebut.
  3. Buat file konfigurasi tunnel ~/.cloudflared/config.yml:
    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
    Note: Target service menunjuk ke DNS internal Kubernetes CoreDNS (<service-name>.<namespace>.svc.cluster.local) atau IP ClusterIP.
  4. Petakan DNS record domain ke tunnel:
    cloudflared tunnel route dns stb-k3s-tunnel homelab.domainanda.com
    Perintah ini membuat DNS record tipe CNAME secara otomatis di dashboard Cloudflare.
  5. Daftarkan dan jalankan cloudflared sebagai 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.service

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

Wajib 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.txt untuk 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 cloudflared dan 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

  1. Dapatkan token autentikasi dari Node Master (STB 1):
    sudo cat /var/lib/rancher/k3s/server/node-token
  2. Ambil IP lokal STB Master: 192.168.1.100.
  3. 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 -
  4. 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.

๐Ÿ“– Artikel Terkait