Monitor Custom di Homepage¶
Status: SUDAH DIIMPLEMENTASIKAN (9 Juli 2026)
Widget monitor real-time sudah tampil di https://oneke.ums.id/ — menampilkan jumlah VM
aktif, status kesehatan tiap aplikasi, dan pemakaian resource (total, per VM, per aplikasi).
Data diambil langsung dari Prometheus + Kubernetes API yang sudah terpasang
(Instalasi Monitoring), bukan data statis.
1. Keputusan Arsitektur¶
| Item | Keputusan | Alasan |
|---|---|---|
| Pendekatan | API custom + JS polling (bukan embed iframe Grafana) | Data terstruktur bebas sesuai kebutuhan (VM aktif, status app terpisah, breakdown resource); tidak perlu buka akses publik/anonymous ke Grafana yang saat ini di-protect login |
| Definisi "VM aktif" | Jumlah node K8s yang Ready (kubectl get nodes) |
Akses penuh tersedia via kubeconfig; VNF tidak dihitung karena bukan node K8s. Total OpenNebula VM sesungguhnya butuh akses API/CLI OpenNebula yang belum tersedia |
| Sumber data resource | Prometheus (kube_node_status_capacity, container_cpu_usage_seconds_total, longhorn_node_storage_*_bytes) |
Semua metrik ini sudah tersedia tanpa exporter tambahan — hasil kerja Instalasi Monitoring |
| Update interval | 30 detik (polling JS fetch) |
Cukup responsif untuk dashboard status, tidak membebani Prometheus |
2. Backend — status-api¶
Layanan kecil (FastAPI + kubernetes client Python) di namespace demo-app, satu endpoint:
GET /api/status/summary
mengembalikan JSON gabungan tiga bagian: vms, apps, resources.
2.1 Sumber Data per Bagian¶
| Bagian | Sumber | Detail |
|---|---|---|
vms |
Kubernetes API (list_node) + Prometheus |
Status Ready per node dari K8s API; CPU/memori/storage usage & capacity per node dari Prometheus (kube_node_status_capacity, container_cpu_usage_seconds_total ... by (node), longhorn_node_storage_*_bytes) |
apps |
Kubernetes API (read_namespaced_deployment / read_namespaced_stateful_set) |
Daftar tetap 10 workload kunci (Homepage, Dokumentasi, Galera, Postgres, phpMyAdmin, pgAdmin, Grafana, Prometheus, Longhorn UI, Dashboard) — healthy jika readyReplicas == replicas |
resources |
Prometheus | Total cluster (CPU/memori/storage, used vs capacity) + breakdown per namespace (by (namespace)) |
2.2 Deploy Tanpa Build Image Kustom¶
Mengikuti pola yang sama seperti CronJob backup Galera (§8.2 Instalasi MariaDB) — hindari build+push
image Docker kustom, cukup initContainer yang pip install --target=/deps ke volume bersama,
lalu container utama menjalankan kode dari ConfigMap dengan PYTHONPATH=/deps:
initContainers:
- name: install-deps
image: python:3.12-slim
command: ['sh', '-c', 'pip install --target=/deps --no-cache-dir fastapi uvicorn kubernetes requests']
volumeMounts: [{ name: deps, mountPath: /deps }]
containers:
- name: status-api
image: python:3.12-slim
command: ['sh', '-c', 'PYTHONPATH=/deps python -m uvicorn app:app --host 0.0.0.0 --port 8000']
workingDir: /app
volumeMounts:
- { name: deps, mountPath: /deps }
- { name: code, mountPath: /app }
volumes:
- { name: deps, emptyDir: {} }
- { name: code, configMap: { name: status-api-code } }
2.3 RBAC — Least Privilege¶
ServiceAccount + ClusterRole read-only, hanya get/list pada nodes, pods,
deployments, statefulsets — tidak ada akses tulis sama sekali.
Gotcha: subresource /status butuh permission terpisah
Percobaan awal pakai read_namespaced_deployment_status() (client Python) gagal 403
Forbidden — endpoint itu memakai subresource deployments/status, bukan deployments
biasa, jadi butuh rule RBAC terpisah (resources: ["deployments/status"]). Fix: pakai
read_namespaced_deployment() (resource utama, bukan subresource /status) yang sudah
tercakup oleh permission get pada deployments biasa — cukup satu rule RBAC.
2.4 Routing¶
IngressRoute biasa (tanpa stripPrefix, karena route FastAPI sudah include prefix penuh
/api/status/summary), priority: 100 mengikuti pola standar di cluster ini:
routes:
- match: Host(`oneke.ums.id`) && PathPrefix(`/api/status`)
priority: 100
services: [{ name: status-api-svc, port: 8000 }]
Endpoint ini publik, read-only, tanpa Basic Auth — konsisten dengan sifat homepage yang memang publik, dan tidak ada data sensitif (hanya angka agregat kesehatan/pemakaian resource).
3. Widget di Homepage¶
Bagian baru "Status Sistem oneKE" ditambahkan di bawah kartu utama homepage, berisi:
- Dua stat tile: VM Aktif (
ready/total), Aplikasi Sehat (healthy/total) - Tiga progress bar resource cluster (CPU, Memori, Storage) — warna berubah otomatis sesuai ambang (hijau <70%, kuning 70–90%, merah >90%)
- Tiga panel detail (
<details>, collapse default supaya homepage tetap ringkas): - Tabel per VM (node, peran, status, CPU%, memori%, storage%)
- Grid status tiap aplikasi (dot hijau/merah + ready count)
- Bar pemakaian resource per namespace, diurutkan dari yang terbesar
JavaScript polos (tanpa framework/library eksternal) — fetch('/api/status/summary') tiap 30
detik, render ke DOM. Palet warna & pola progress bar mengikuti sistem desain data-viz standar
(status hijau/kuning/merah untuk ambang batas, biru untuk perbandingan magnitude netral).
4. Verifikasi Visual ✅¶
Diuji dengan headless Chrome (screenshot penuh halaman, termasuk ketiga panel detail dibuka) — seluruh data tampil benar: 8/8 VM aktif, 10/10 aplikasi sehat, breakdown resource per node dan per namespace konsisten dengan data mentah dari Prometheus.
Ringkasan Eksekusi¶
| Langkah | Status |
|---|---|
Backend status-api (FastAPI + K8s client, tanpa build image kustom) |
✅ |
| RBAC read-only (ServiceAccount, ClusterRole, ClusterRoleBinding) | ✅ |
Endpoint /api/status/summary publik via Traefik |
✅ |
| Widget homepage (stat tile, progress bar, 3 panel detail) | ✅ |
| Verifikasi visual (headless browser screenshot) | ✅ |
Diimplementasikan 9 Juli 2026. Lihat Instalasi Monitoring untuk detail metrik Prometheus yang jadi sumber data widget ini.