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:

  1. Dua stat tile: VM Aktif (ready/total), Aplikasi Sehat (healthy/total)
  2. Tiga progress bar resource cluster (CPU, Memori, Storage) — warna berubah otomatis sesuai ambang (hijau <70%, kuning 70–90%, merah >90%)
  3. Tiga panel detail (<details>, collapse default supaya homepage tetap ringkas):
  4. Tabel per VM (node, peran, status, CPU%, memori%, storage%)
  5. Grid status tiap aplikasi (dot hijau/merah + ready count)
  6. 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.