Da ich die Informationen an verschiedenen Orten zusammengesucht habe ist dieses Tutorial primär eine Anleitung für mich selbst um mit Grafana und Prometheus diverse Server und Services zu überwachen.
Der Hauptgrund dafür ist hauptsächlich, dass ich die Metrics von verschiedenen Servern ermitteln und darstellen will und deshalb die Daten öffentlich zugägnglich machen muss, was ein Sicherheitsrisiko darstellt.
Deshalb ist diese Anleitung dafür Gedacht, die Daten einigermassen sicher zugänglich zu machen.
Als erstes erstelle ich mal eine Gruppe und einen User pmjmetrics und füge den User dann der docker Grupe hinzu.
groupadd --system pmjmetrics
useradd -m -d /opt/pmjmetrics -s /bin/bash --system -g pmjmetrics pmjmetrics
usermod -aG docker pmjmetrics
Anschliessend benutze ich diesen User für die weiterern Schritte
su - pmjmetrics
Node Exporter
Node exporter ist einfach zu installieren; einfach herunterladen und ausführen.
Ich mache das im Verzeichnis ~/exporter/node
mkdir -p ~/exporter
cd ~/exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.5.0.linux-amd64.tar.gz
mv node_exporter-1.5.0.linux-amd64 node
rm node_exporter-1.5.0.linux-amd64.tar.gz
Nun erstelle ich einen Service für den Exporter.
Dies muss ich wieder als root erledigen.
exit
nano /etc/systemd/system/pmjmetrics-node.service
mit folgendem Inhalt
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=pmjmetrics
Group=pmjmetrics
Type=simple
ExecStart=/opt/pmjmetrics/exporter/node/node_exporter --collector.textfile.directory=/opt/pmjmetrics/exporter/node
[Install]
WantedBy=multi-user.target
Anschliessend den Service Daeom neu laden
systemctl daemon-reload
Jetzt kann der Exporter beim Systemstart automatisch gestartet werden
systemctl enable pmjmetrics-node
service pmjmetrics-node start
Prometheus
Nun installiere ich Prometheus.
Dazu nutze ich wieder den User pmjmetrics
.
su - pmjmetrics
Ich starte Prometheus aus bequemlichkeit in einem Docker Container.
Damit ich mit dem Exporter kommunizieren kann, muss ich folgende Flag beim starten des Containers benutzen: --add-host=host.docker.internal:host-gateway
.
Ausserdem muss ich noch die Verzeichnisse ~/prometheus/config
und ~/prometheus/data
erstellen.
Aber erst muss ich die Prometheus Konfigurationsdatei erstellen
mkdir -p ~/prometheus/config
nano ~/prometheus/config/prometheus.yml
mit folgendem Inhalt
#global config
global:
scrape_interval: 1m
evaluation_interval: 5s
scrape_timeout: 15s
external_labels:
monitor: 'codelab-monitor'
# Scrape configs only contain one scrape target
scrape_configs:
- job_name: 'PMJ Prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'PMJ Node'
scrape_interval: 5s
static_configs:
- targets: ['host.docker.internal:9100']
labels:
instance: 'localhost:9100'
Nun starte ich den Container
mkdir -p ~/prometheus/data
ID=$(id -u)
docker run -d --user $ID -p 9090:9090 --volume /opt/pmjmetrics/prometheus/config:/etc/prometheus --volume /opt/pmjmetrics/prometheus/data:/prometheus --add-host=host.docker.internal:host-gateway --name prometheus --restart always prom/prometheus:latest
Da ich von diversen Servern Daten sammeln will, muss ich von einer zentralen Grafana Instanz auf diese Server zugreiffen können. Dies bedeutet auch, dass ich den Port 9090 von Prometheus gegen aussen öffnen muss. Dadurch kann JEDER auf diese Daten zugreifen!
Deshalb öffne ich den Port 9090 nur für den Server auf dem die Grafana Instanz läuft.
Als Erstes muss ich wieder zum root User und dann Firewalld konfigurieren.
exit
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="__GRAFANA-IP__" port protocol="tcp" port="9090" accept'
firewall-cmd --reload
Um diese Regel wieder zu entfernen:
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="__GRAFANA-IP__" port protocol="tcp" port="9090" accept'
firewall-cmd --reload
Grafana
Gtafana lasse ich in einem Docker Container laufen.
Die Daten speichere ich im Verzeichnis ~/grafana/data
Da ich die Iptables deaktivieren musste um auch VMs betreiben zu können, muss ich den Container mit --network=host
starten um Internetzugang zu haben.
mkdir -p ~/grafana/data
mkdir -p ~/grafana/config
Den Container starte ich dann wie folgt:
ID=$(id -u)
docker run -d --user $ID --volume "$PWD/grafana/data:/var/lib/grafana" --mount type=bind,source="$PWD/grafana/config/grafana.ini",target="/etc/grafana/grafana.ini",readonly -p 3000:3000 --name grafana --restart always --network=host grafana/grafana-oss:latest