DEV Community

Cover image for Article 6: Minimalist monitoring with Prometheus & Grafana
Woulf
Woulf

Posted on • Edited on

Article 6: Minimalist monitoring with Prometheus & Grafana

Integrating Prometheus & Grafana to monitor my self-hosted Kubernetes cluster with public HTTPS access, a customized default dashboard, and maintained security, all in an MVP GitOps logic.

In this sixth step, I’m integrating a monitoring system to supervise my Kubernetes cluster, keeping things minimalist, self-hosted, and avoiding unnecessary complexity.


Objective: simple and effective visibility

I want to view the state of my cluster at a glance: CPU, memory, pods, network. No over-engineering, no email alerts, just a clear dashboard.

I’m using the Helm chart kube-prometheus-stack, widely used in production, even though I’m underutilizing it here for educational purposes.


Installation with Helm

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --values prometheus-stack-values.yaml
Enter fullscreen mode Exit fullscreen mode

I disabled alertmanager in the values.yaml file, since I don’t want to manage alerts for this MVP:

alertmanager:
  enabled: false
Enter fullscreen mode Exit fullscreen mode

Why not use the MicroK8s Prometheus module?

MicroK8s offers a prometheus module that can be enabled in one line:

microk8s enable prometheus
Enter fullscreen mode Exit fullscreen mode

But this module is a black box and hard to integrate into a GitOps workflow:

  • It’s not versioned in your Git repo
  • It offers almost no control over configuration or versions
  • It doesn’t separate Grafana and Prometheus cleanly

By choosing the Helm chart kube-prometheus-stack, I keep full control over configuration via my values.yaml, can version my infrastructure, and make my setup portable to any cloud or local Kubernetes cluster.


Grafana access

I created an Ingress at grafana.woulf.fr with an HTTPS certificate managed by cert-manager.

Admin access is protected by a Kubernetes Secret (not committed), defined like this:

grafana:
  admin:
    existingSecret: monitoring-grafana
Enter fullscreen mode Exit fullscreen mode

Secret creation

kubectl -n monitoring create secret generic monitoring-grafana \
  --from-literal=admin-user=admin \
  --from-literal=admin-password=********

To enable easy public access, I allowed anonymous access with the Viewer role (read-only):

grafana:
  grafana.ini:
    auth.anonymous:
      enabled: true
      org_name: Main Org.
      org_role: Viewer
      hide_version: true
Enter fullscreen mode Exit fullscreen mode

Default dashboard

I chose the built-in Kubernetes / Compute Resources / Cluster dashboard, then exported and versioned it into a ConfigMap, mounting it as the home dashboard:

grafana:
  grafana.ini:
    dashboards:
      default_home_dashboard_path: /var/lib/grafana/dashboards/grafana-dashboard-home/default.json
  dashboardsConfigMaps:
    grafana-dashboard-home: grafana-dashboard-home
  sidecar:
    dashboards:
      enabled: true
      label: grafana_dashboard
      searchNamespace: ALL
Enter fullscreen mode Exit fullscreen mode

The related ConfigMap is versioned in my infra repo and labeled with grafana_dashboard: "1" to be auto-loaded by Grafana’s sidecar.

📁 A ConfigMap is a Kubernetes resource that lets you mount non-sensitive files into a pod.
It is automatically reloaded when modified.


Result

  • Grafana is publicly accessible over HTTPS
  • Default dashboard is readable and useful
  • No login required to monitor the cluster
  • Admin account is secured via a Kubernetes Secret

This approach follows DevOps best practices while staying simple and understandable for a visitor or recruiter.


🧠 What about production?

This setup is intentionally minimalist and educational, but in a production context, several aspects would be hardened:

  • Alertmanager would be enabled with alert routing to services (email, Slack, etc.) to notify when components fail.
  • Grafana access wouldn’t be anonymous: it would be IP-restricted, proxied, or SSO/LDAP-protected.
  • Admin passwords wouldn’t be handled via static Secrets, but through Vault or a secrets manager (SealedSecrets, ExternalSecrets).
  • Dashboards would be provisioned via API or dedicated files with more modular versioning strategies.
  • TLS certificates would be managed via larger-scale automatic rotation mechanisms (wildcard DNS, ACME DNS challenge, etc.)

But for this MVP, the setup offers a great balance between simplicity, readability, baseline security, and GitOps maintainability.


⚡ Next step: adding loki for centralized log collection? Or testing ArgoCD for advanced GitOps?

Stay tuned!

Top comments (0)