Monitoring K8s

Nadat de Kubernetes Cluster ‘up-and-running’ is en er pods met applicaties op draaien, willen we de status van het cluster gaan monitoren. Datgene dat gemonitored kan worden dient ‘gescraped‘ te worden en voor Kubernetes is Prometheus daar de uitgelezen tool voor. Scrapen van de systeem-eigenschappen van de node(s) zelf kan heel goed met ‘node-exporter‘.

Prometheus

Om Prometheus te installeren is het meest eenvoudige om deze in een docker container te draaien. Voer daarvoor de volgende commando’s uit:

$ docker create --name prom_empty prom/prometheus
$ docker cp prom_empty:/etc/prometheus/prometheus.yml ./prometheus.yml

Wijzig het bestand prometheus.yml zodanig dat de ‘targets’ in de ‘scrape_configs’ naar de localhost, de master en de nodes van het Kubernetes-cluster verwijzen waar node-exporter straks op geïnstalleerd wordt:

scrape_configs:
   # The job name is added as a label job=<job_name> to any timeseries scraped from this config.
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  
  - job_name: 'master'
    static_configs:
    - targets: ['master:9100']
 
  - job_name: 'node1'
    static_configs:
    - targets: ['node1:9100']
 
  - job_name: 'node2'
    static_configs:
    - targets: ['node2:9100'] 

Plaats het bestand terug in de docker image door een nieuwe image te bouwen. Maak een Dockerfile met de volgende inhoud:

FROM prom/prometheus
COPY ./prometheus.yml /etc/prometheus/prometheus.yml

Vervolgens bouwen en starten we de nieuwe image met:

$ docker build -t prometheus/rpi-cluster .
$ docker run -p 9090:9090 --restart=always --name prometheus-rpi -d prometheus/rpi-cluster

Controle kan door een browser te starten naar localhost op poort 9090

http://localhost:9090

Node Exporter

Node-exporter voegt extra informatie toe om te monitoren (scrapen). Denk hierbij aan CPU, geheugen, netwerk en disk statistieken. Om node-exporter te installeren, voer de volgende commando’s uit op alle nodes waarvan deze informatie ‘gescraped‘ dient te worden.:

$ curl -SL https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-armv7.tar.gz
$ sudo tar -xvf node_exporter-0.14.0.linux-armv7.tar.gz -C /usr/local/bin/ --strip-components=1
$ sudo vi /etc/systemd/system/nodeexporter.service

Wijzig dit bestand alsvolgt:

[Unit]
Description=NodeExporter

[Service]
TimeoutStartSec=0
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

en vervolg de installatie met:

$ sudo systemctl daemon-reload
$ sudo systemctl enable nodeexporter
$ sudo systemctl start nodeexporter

Controle kan met curl naar één van de K8s-nodes:

curl node_name:9100/metrics | less

Prometheus UI

Ga wederom met een browser naar localhost op poort 9090:

http://localhost:9090

De user-interface ziet er alsvolgt uit:

Om te zien of en welke nodes ‘gescraped’ worden, ga naar Status -> Targets. Dat ziet op mijn cluster dan zo uit:

Via de menu-optie ‘Graph‘ kun je in het Expression veld een metric opvragen, bijvoorbeeld ontvangen netwerk verkeer. Na “Execute” ziet dat er bv. zo uit:

Grafana

Om een dashboard te maken met informatie uit Prometheus is er het programma ‘Grafana‘. Dit geeft via een Web-interface op een grafische wijze de metrics weer vanuit o.a. Prometheus. Installeren gaat alsvolgt:

$ wget https://dl.grafana.com/oss/release/grafana-rpi_6.2.5_armhf.deb
$ sudo dpkg -i grafana-rpi_6.2.5_armhf.deb
$ sudo apt install libfontconfig1
$ sudo apt --fix-broken install
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server

Hierna draait de Grafana server op poort 3000. Bijvoorbeeld http://grafana:3000 Met een browser kan ingelogd worden in de Grafana portal en als eerste dien je aan te melden als user ‘admin‘. Na registratie en wachtwoord wijziging wordt het standaard dashboard getoond. Kies hier voor ‘Create your first data source‘ en selecteer ‘Prometheus‘. Als dat dezelfde host is, kies dan voor http://localhost:9090 als URL.

Na een import van Dashboard 1860 ziet dat er alsvolgt uit: