k3s Kubernetes Ringan untuk Startup Indonesia: Setup Produksi di VPS Budget

Foto oleh Unsplash

Foto oleh Unsplash
Kubernetes penuh (k8s) membutuhkan minimal 2GB RAM per node hanya untuk komponen control plane — kendala signifikan bagi startup Indonesia yang berjalan di tier VPS Biznet, IDCloudHost, atau Niagahoster. k3s, distribusi Kubernetes ringan dari Rancher, menjalankan control plane-nya dalam kurang dari 500MB RAM dan hadir sebagai binary tunggal dengan load balancer bawaan dan backing store SQLite opsional. Panduan ini membahas cluster k3s 3-node tingkat produksi yang menjalankan workload nyata dengan kurang dari Rp 600k/bulan total.
k3s mencapai footprint kecilnya dengan menghapus integrasi cloud-provider (AWS EBS, GCE PD), fitur alpha, dan API lawas yang kebanyakan cluster tidak pernah gunakan. Ia mengganti etcd dengan SQLite untuk setup node tunggal (atau menggunakan etcd tertanam untuk cluster HA) dan menyertakan Flannel CNI, Traefik ingress, CoreDNS, dan local-path-provisioner secara bawaan. Hasilnya adalah distribusi Kubernetes yang sepenuhnya konform yang lulus tes konformitas CNCF, artinya perintah kubectl standar dan manifest Kubernetes apa pun bekerja tanpa modifikasi.
Node server k3s minimal membutuhkan 512MB RAM dan 1 vCPU, dibandingkan instalasi kubeadm standar yang membutuhkan minimal 2GB RAM hanya untuk control plane. Node agent k3s bisa berjalan dengan sesedikit 256MB RAM. Artinya VPS Rp 200k/bulan (1 vCPU, 1GB RAM) dari IDCloudHost dapat berfungsi sebagai server k3s sekaligus menjalankan workload ringan — opsi yang sama sekali tidak ada dengan Kubernetes standar.
k3s adalah pilihan tepat ketika tim Anda memiliki kapasitas operasional untuk mengelola cluster kecil, workload Anda cocok di 3–5 node, dan biaya Kubernetes terkelola (Google GKE Autopilot, DigitalOcean Kubernetes) melebihi anggaran Anda. Untuk startup Indonesia dengan 2–5 engineer, cluster k3s menghilangkan vendor lock-in cloud dan mengurangi overhead Kubernetes bulanan dari Rp 400k+ (biaya manajemen cluster GKE) menjadi nol.
Nonaktifkan Traefik saat instalasi server k3s (--disable traefik) jika Anda berencana menggunakan ingress controller berbeda. Mengganti Traefik setelah instalasi memungkinkan tetapi melibatkan lebih banyak langkah. NGINX Ingress Controller adalah pengganti umum; tambahkan '--set controller.service.type=LoadBalancer' dan konfigurasikan MetalLB untuk menetapkan IP dari rentang IP VPS Anda.
Instalasi k3s adalah satu perintah curl yang mengunduh, menginstal, dan memulai layanan k3s dengan systemd. Node server (control plane) mengekspos API Kubernetes pada port 6443 dan menghasilkan token node yang digunakan node agent untuk bergabung ke cluster. Untuk setup 3-node produksi, gunakan 1 node server dan 2 node agent — ini memberikan redundansi workload tanpa kompleksitas control plane HA yang membutuhkan 3 node server dan etcd eksternal.
Script instalasi menerima environment variable dan flag yang menyesuaikan konfigurasi k3s tanpa memerlukan file konfigurasi terpisah. Memberikan --tls-san dengan IP publik atau domain server Anda memastikan sertifikat API server menyertakan SAN yang benar, yang diperlukan untuk akses kubectl dari luar cluster. Setelah menginstal node agent, verifikasi cluster dengan kubectl get nodes -o wide — semua node harus menunjukkan status Ready dalam 30 detik.
#!/bin/bash
# 1. Install k3s server node (control plane)
curl -sfL https://get.k3s.io | sh -s - server \
--disable traefik \
--flannel-backend=vxlan \
--tls-san=YOUR_PUBLIC_IP
# 2. Retrieve node token for agents
K3S_TOKEN=$(sudo cat /var/lib/rancher/k3s/server/node-token)
echo "Token: $K3S_TOKEN"
# 3. Join agent nodes (run on each worker VPS)
curl -sfL https://get.k3s.io | K3S_URL=https://SERVER_IP:6443 \
K3S_TOKEN=$K3S_TOKEN sh -
# 4. Verify cluster
kubectl get nodes -o wide
---
# sample-deployment.yaml — runs on k3s unchanged
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: production
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: web-app-svc
namespace: production
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
type: ClusterIPk3s menulis file kubeconfig ke /etc/rancher/k3s/k3s.yaml dengan alamat server diatur ke 127.0.0.1. Salin file ini ke mesin lokal Anda dan ganti 127.0.0.1 dengan IP publik server. Tetapkan KUBECONFIG=/path/to/k3s.yaml atau gabungkan ke ~/.kube/config. Jangan pernah mengekspos port API Kubernetes (6443) secara publik tanpa allowlisting IP — gunakan aturan firewall untuk membatasinya hanya ke alamat IP tim Anda.
local-path-provisioner default k3s membuat PersistentVolume di disk lokal node tempat pod dijadwalkan — jika node tersebut gagal, data hilang. Longhorn menyediakan block storage terdistribusi yang mereplikasi volume di beberapa node, memungkinkan penjadwalan ulang pod tanpa kehilangan data. Ia terintegrasi sebagai StorageClass, artinya PersistentVolumeClaim Kubernetes yang ada bekerja tanpa modifikasi setelah Longhorn diinstal.
Longhorn diinstal melalui satu kubectl apply atau Helm chart dan menyediakan UI web di /longhorn-ui untuk memantau kesehatan volume, penempatan replika, dan status backup. Tetapkan jumlah replika default ke 2 untuk cluster 3-node (direplikasi di 2 dari 3 node) — menetapkannya ke 3 berhasil tetapi tidak menyisakan margin untuk node yang down selama maintenance. Konfigurasikan backup target yang kompatibel S3 (Wasabi atau Cloudflare R2 adalah pilihan hemat biaya dari Indonesia) untuk snapshot pemulihan bencana.
k3s hadir dengan Traefik sebagai ingress controller default, tetapi tidak secara otomatis menyediakan sertifikat TLS. Service yang diekspos melalui Ingress tanpa TLS mengirimkan semua data termasuk session cookie dalam plaintext. Instal cert-manager dan konfigurasikan ClusterIssuer dengan Let's Encrypt sebelum membuat resource Ingress yang dapat diakses publik. Ini memakan waktu 10 menit tetapi melindungi setiap service dalam cluster.
Men-deploy ke k3s dari GitHub Actions memerlukan mengekspos API server (port 6443) atau menggunakan solusi tunnel seperti Cloudflare Tunnel atau ngrok untuk menghindari eksposur publik. Simpan kubeconfig sebagai secret GitHub Actions, lalu gunakan action azure/setup-kubectl untuk menjalankan kubectl apply di pipeline. Workflow deploy lengkap membutuhkan kurang dari 2 menit: build Docker image, push ke registry, perbarui tag image Deployment dengan kubectl set image, dan verifikasi rollout dengan kubectl rollout status.
Pada node VPS budget, melupakan resource requests dan limits adalah jalan tercepat menuju cluster yang tidak stabil. Tanpa limits, pod yang bermasalah dapat mengonsumsi semua memori yang tersedia dan memicu OOM killer, mengusir pod lain. Definisikan requests (jumlah yang dicadangkan untuk scheduling) dan limits (batas keras) untuk setiap deployment. Web service yang dioptimalkan pada node 1GB RAM biasanya menggunakan 64Mi requests / 256Mi limits untuk memori.
k3s mendukung upgrade in-place menggunakan system-upgrade-controller — operator upgrade native Kubernetes yang mem-cordon node, men-drain pod-nya, mengupgrade k3s, dan meng-uncordon-nya, satu node pada satu waktu. Definisikan objek Plan upgrade yang menentukan versi k3s target dan controller menangani rolling upgrade secara otomatis. Untuk cluster 3-node, seluruh proses ini membutuhkan 5–10 menit tanpa downtime untuk aplikasi yang dikonfigurasi dengan minimal 2 replika.
Gunakan kubeconfig bawaan k3s di /etc/rancher/k3s/k3s.yaml bersama Lens atau OpenLens (IDE Kubernetes gratis) untuk pengalaman manajemen cluster berbasis GUI. Lens mendeteksi otomatis resource limits, menampilkan grafik CPU/memori real-time per pod, dan menyediakan terminal langsung ke container mana pun — jauh lebih cepat untuk debugging daripada perintah kubectl mentah.
Cluster k3s 3-node di IDCloudHost atau Biznet berjalan sekitar Rp 600k–900k/bulan tergantung tier VPS — sebanding dengan satu droplet DigitalOcean $10 tetapi dengan orkestrasi Kubernetes penuh. Seiring workload bertumbuh, tambahkan node agent secara bertahap: penambahan node k3s membutuhkan kurang dari 5 menit. Ketika Anda melampaui 5–6 node, beralih ke layanan Kubernetes terkelola menjadi ekonomis karena overhead operasional mengelola lebih banyak node melebihi penghematan biaya.
Deploy Helm chart kube-prometheus-stack (Prometheus Operator + Grafana + Alertmanager) untuk mendapatkan observabilitas cluster penuh dengan dashboard bawaan untuk CPU node, memori, disk, dan metrik workload Kubernetes. Pada node budget, kurangi retensi Prometheus ke 7 hari dan tetapkan resource requests ke 200m CPU / 512Mi RAM agar tidak mempengaruhi pod workload. Dashboard Grafana k3s (ID 15282) menyediakan metrik spesifik k3s termasuk ukuran database SQLite tertanam dan statistik jaringan Flannel.
Istilah kunci dalam artikel ini meliputi k3s, Longhorn, etcd, and Flannel CNI.