We are going to deploy mikrotik-exporter to visualise Prometheus monitoring data for Mikrotik.
Pre-requisites
A Mikrotik router. I’ve been using Mikrotik for many years, and it’s done the job really well. In my honest opinion, the best thing you can do with your ISP-provided router is to recycle it.
I currently use RB951G-2HnD (upgraded my old RB751G-2HnD) and RB2011UiAS-2HnD-IN. The latter one is an absolute beast considering its £110 (~150$) price tag.
We are using our Kubernetes homelab to deploy mikrotik-exporter.
Configure Mikrotik Router
Enable API service from our homelab LAN:
/ip service set api address=10.11.1.0/24 /ip service enable api
Create a prometheus group on the router that has API and read-only access.
/user group add name=prometheus policy=api,read
Create a prometheus user to access the API.
/user add name=prometheus group=prometheus password=changeme
Download Files from GitHub
Configuration files used in this article are hosted on GitHub. Clone the following repository:
$ git clone https://github.com/lisenet/kubernetes-homelab.git $ cd ./kubernetes-homelab/
Install and Configure mikrotik-exporter: Step by Step
Note that this homelab project is under development, therefore please refer to GitHub for any source code changes.
Create a Namespace
Create a monitoring namespace:
$ kubectl create ns monitoring
Create a Secret
Create a Kubernetes secret to store your Mikrotik password for the prometheus API user. Add your base64 encoded password to the file mikrotik-exporter-secret.yml
and run the following command:
$ kubectl apply -f ./kubernetes/mikrotik-exporter/mikrotik-exporter-secret.yml
This is what the code looks like:
--- apiVersion: v1 kind: Secret metadata: name: mikrotik-exporter-secret namespace: monitoring data: password: base64-encoded-mikrotik-user-password
Create a Config Map
Create a config map that contains details about the router.
$ kubectl apply -f ./kubernetes/mikrotik-exporter/mikrotik-exporter-config-map.yml
This is what the code looks like:
--- apiVersion: v1 kind: ConfigMap metadata: name: mikrotik-exporter-conf namespace: monitoring labels: app: mikrotik-exporter data: device: mikrotik address: 10.11.1.1 user: prometheus
Create a Deployment Configuration
$ kubectl apply -f ./kubernetes/mikrotik-exporter/mikrotik-exporter-deployment.yml
This is what the code looks like:
--- apiVersion: apps/v1 kind: Deployment metadata: name: mikrotik-exporter namespace: monitoring labels: app: mikrotik-exporter spec: replicas: 1 selector: matchLabels: app: mikrotik-exporter template: metadata: labels: app: mikrotik-exporter spec: containers: - name: mikrotik-exporter image: nshttpd/mikrotik-exporter:1.0.11 imagePullPolicy: IfNotPresent env: - name: "DEVICE" valueFrom: configMapKeyRef: name: mikrotik-exporter-conf key: device - name: "ADDRESS" valueFrom: configMapKeyRef: name: mikrotik-exporter-conf key: address - name: "USER" valueFrom: configMapKeyRef: name: mikrotik-exporter-conf key: user - name: "PASSWORD" valueFrom: secretKeyRef: name: mikrotik-exporter-secret key: password - name: "LOG_LEVEL" value: DEBUG ports: - containerPort: 9436 volumeMounts: - name: mikrotik-exporter-volume mountPath: /etc/mikrotik-exporter restartPolicy: Always terminationGracePeriodSeconds: 60 volumes: - name: mikrotik-exporter-volume emptyDir: {}
Create a Service
$ kubectl apply -f ./kubernetes/mikrotik-exporter/mikrotik-exporter-service.yml
This is what the code looks like:
--- apiVersion: v1 kind: Service metadata: name: mikrotik-exporter namespace: monitoring labels: app: mikrotik-exporter spec: selector: app: mikrotik-exporter type: NodePort ports: - port: 9436 targetPort: 9436
Check Monitoring Namespace
$ kubectl -n monitoring get all -l app=mikrotik-exporter NAME READY STATUS RESTARTS AGE pod/mikrotik-exporter-7cf8d9b85-dfxtx 1/1 Running 0 76s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/mikrotik-exporter NodePort 10.106.36.83 none 9436:30528/TCP 14d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/mikrotik-exporter 1/1 1 1 14d NAME DESIRED CURRENT READY AGE replicaset.apps/mikrotik-exporter-7cf8d9b85 1 1 1 6d4h
Configure Prometheus Scraping
Add static config that matches your Mikrotik router to the Prometheus config map and restart the pod.
- job_name: 'mikrotik-exporter' scrape_interval: 30s static_configs: - targets: - 10.11.1.1 # your Mikrotik router IP you wish to monitor metrics_path: /metrics params: module: [my_router] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: mikrotik-exporter:9436
Grafana Dashboard for Mikrotik
You can install a dashboard to monitor Mikrotik metrics: https://grafana.com/grafana/dashboards/12055
References
https://github.com/nshttpd/mikrotik-exporter