7.1 Einrichtung des Monitorings mit Prometheus
In diesem Schritt schauen wir uns an, wie man Monitoring und Logging für unsere Multi-Container-Anwendung einrichtet. Das ermöglicht es, den Zustand und die Performance der Services zu verfolgen und Logs zu sammeln und zu analysieren, um Probleme zu diagnostizieren.
Ziel: Metriken von Services sammeln und visualisieren, um die Performance und den Zustand der Anwendung zu überwachen.
Installation und Einrichtung von Prometheus
In diesem Beispiel wird Prometheus mit Docker gestartet. Dadurch ist es plattformübergreifend und ermöglicht eine gleichermaßen effektive Bereitstellung des Monitorings auf jedem Betriebssystem, das Docker unterstützt.
1. Erstellen eines Verzeichnisses für die Konfiguration von Prometheus:
mkdir prometheus
cd prometheus
2. Erstellen der Konfigurationsdatei prometheus.yml
:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'flask-app'
static_configs:
- targets: ['backend:5000']
- job_name: 'node-app'
static_configs:
- targets: ['frontend:3000']
3. Erstellen eines Dockerfiles für Prometheus:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. Hinzufügen von Prometheus zu compose.yaml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
7.2 Installation und Einrichtung von Grafana
1. Erstellen eines Verzeichnisses für die Grafana-Konfiguration:
mkdir grafana
cd grafana
2. Erstellen einer Dockerfile für Grafana:
FROM grafana/grafana
3. Hinzufügen von Grafana zu docker-compose.yml
:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. Einrichtung von Grafana für Prometheus:
- Starte die Container mit
docker compose up
. - Öffne die Grafana-Oberfläche im Browser unter
http://localhost:3033
. - Melde dich mit den Standard-Anmeldedaten (admin/admin) an.
- Gehe zu
"Configuration"
->"Data Sources"
und füge eine neue Datenquelle hinzu. - Wähle
"Prometheus"
und gib dieURL http://prometheus:9090
ein. - Speichere die Einstellungen.
Erstellen von Dashboards in Grafana
- Ein neues Dashboard erstellen:
- Gehe zu
"Create"
->"Dashboard"
. - Klicke auf
"Add new panel"
. - Wähle im
"Query"
-Bereich die DatenquellePrometheus
. - Gib eine
PromQL
-Abfrage ein, um die Metriken abzurufen. Zum Beispiel, um die Nutzung derCPU
zu überwachen:
- Gehe zu
- Panel-Einstellungen:
- Wähle den Diagrammtyp (z. B. "Graph").
- Konfiguriere das Panel (z. B. Titel, Legende, Achsen usw.).
- Klicke auf
"Apply"
, um das Panel zu speichern.
- Zusätzliche Panels erstellen:
- Wiederhole die Schritte, um zusätzliche Panels für andere Metriken wie Speicher, Netzwerk und Festplatte zu erstellen.
rate(container_cpu_usage_seconds_total[1m])
7.3 Einrichtung des ELK Stack
Einrichtung von Logging mit ELK Stack (Elasticsearch, Logstash, Kibana)
.
Ziel: Logs von unseren Services sammeln, speichern und analysieren.
Installation und Einrichtung von Elasticsearch
Hinzufügen von Elasticsearch
in compose.yaml
:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Installation und Einrichtung von Logstash
Schritt 1. Erstellen eines Verzeichnisses für die Logstash-Konfiguration:
mkdir logstash
cd logstash
Schritt 2. Erstellung der Konfigurationsdatei logstash.conf
:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
Schritt 3. Erstellen einer Dockerfile für Logstash
:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
Schritt 4. Hinzufügen von Logstash in compose.yaml
:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Installation und Einrichtung von Kibana
Hinzufügen von Kibana in compose.yaml
:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
Installation von Filebeat für das Sammeln von Logs
Schritt 1. Erstellen eines Verzeichnisses für die Filebeat-Konfiguration:
mkdir filebeat
cd filebeat
Schritt 2. Erstellung der Konfigurationsdatei filebeat.yml
:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
Schritt 3. Erstellen einer Dockerfile für Filebeat:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
Schritt 4. Hinzufügen von Filebeat in compose.yaml
:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 Komplette Datei
Komplette Datei compose.yaml
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
GO TO FULL VERSION