Änderungsstand: 2021-09-16
Swarmpit, Swarm Dashboard und Prometheus monitoring Docker Swarm cluster (like Grafana):
Swarmpit ist ein leichtgewichtiges, mobilfreundliches Docker Swarm-Management-UI. Viele Sachen werden zwar auch im Portainer angezeigt, aber der Vorteil liegt auf der Hand. Man muss nicht den Portainer öffnen, um die Sachen angezeigt zu bekommen. Swarm Dashboard ist ein einfaches Anzeigetool, welches die Dockerverteilung auf den Nodes zeigt.
Swarmpit
- Portainer öffnen
- Stacks
- + Add stackName: swarmpit
- Web editor:
- Folgenden Code eingeben:
version: '3.3'
services:
app:
image: swarmpit/swarmpit:latest
environment:
- SWARMPIT_DB=http://db:5984
- SWARMPIT_INFLUXDB=http://influxdb:8086
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 888:8080
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 60s
timeout: 10s
retries: 3
networks:
- net
deploy:
resources:
limits:
cpus: '0.50'
memory: 1024M
reservations:
cpus: '0.25'
memory: 512M
placement:
constraints:
- node.role == manager
db:
image: couchdb:2.3.0
volumes:
- db-data:/opt/couchdb/data
networks:
- net
deploy:
resources:
limits:
cpus: '0.30'
memory: 256M
reservations:
cpus: '0.15'
memory: 128M
influxdb:
image: influxdb:1.7
volumes:
- influx-data:/var/lib/influxdb
networks:
- net
deploy:
resources:
limits:
cpus: '0.60'
memory: 512M
reservations:
cpus: '0.30'
memory: 128M
agent:
image: swarmpit/agent:latest
environment:
- DOCKER_API_VERSION=1.35
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- net
deploy:
mode: global
labels:
swarmpit.agent: 'true'
resources:
limits:
cpus: '0.10'
memory: 64M
reservations:
cpus: '0.05'
memory: 32M
networks:
net:
driver: overlay
volumes:
db-data:
driver: local
influx-data:
driver: local
Actions: Deploy the stack
Da der Swarmpit-Agent „global“ ausgerollt wird, ist der Dienst automatisch auf allen Nodes vorhanden.
Aufruf im Browser: Server-IP:888
Quelle:
https://awesomeopensource.com/project/swarmpit/swarmpit
.
Swarm Dashboard
- Portainer öffnen
- Stacks
- + Add stackName: svc
- Web editor:
- Folgenden Code eingeben:
version: "3"
services:
dashboard:
image: charypar/swarm-dashboard
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
ports:
- 8081:8080
environment:
PORT: 8080
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
Actions: Deploy the stack
Aufruf im Browser: Server-IP:8081

Quelle:
https://awesomeopensource.com/project/charypar/swarm-dashboard
Prometheus monitoring Docker Swarm cluster
Ich orientierte mich an den Guide der Quellangabe und änderte diesen nach meinen Ansprüchen.
Am ersten Manager-Node einloggen. Dann:
sudo nano /etc/docker/daemon.json
Folgendes am Ende der Datei (die Datei kann auch vorher leer sein) eintragen:
{
"metrics-addr" : "127.0.0.1:9323",
"experimental" : true
}
Strg-x, y, Enter
sudo service docker restart
cd && git clone https://github.com/stefanprodan/swarmprom.git
cd && cd swarmprom
mv docker-compose.yml docker-compose.bak
cd && cd swarmprom && sudo nano docker-compose.yml
Folgendes komplett einfügen:
version: "3.3"
services:
dockerd-exporter:
image: stefanprodan/caddy
networks:
- mon_net
environment:
- DOCKER_GWBRIDGE_IP=172.18.0.1
configs:
- source: dockerd_config
target: /etc/caddy/Caddyfile
deploy:
mode: global
resources:
limits:
memory: 128M
reservations:
memory: 64M
cadvisor:
image: gcr.io/cadvisor/cadvisor
networks:
- mon_net
command: -logtostderr -docker_only
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /:/rootfs:ro
- /var/run:/var/run
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
deploy:
mode: global
resources:
limits:
memory: 128M
reservations:
memory: 64M
grafana:
image: stefanprodan/swarmprom-grafana:5.3.4
networks:
- mon_net
environment:
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
#- GF_SERVER_ROOT_URL=${GF_SERVER_ROOT_URL:-localhost}
#- GF_SMTP_ENABLED=${GF_SMTP_ENABLED:-false}
#- GF_SMTP_FROM_ADDRESS=${GF_SMTP_FROM_ADDRESS:-grafana@test.com}
#- GF_SMTP_FROM_NAME=${GF_SMTP_FROM_NAME:-Grafana}
#- GF_SMTP_HOST=${GF_SMTP_HOST:-smtp:25}
#- GF_SMTP_USER=${GF_SMTP_USER}
#- GF_SMTP_PASSWORD=${GF_SMTP_PASSWORD}
volumes:
- grafana:/var/lib/grafana
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
memory: 128M
reservations:
memory: 64M
alertmanager:
image: stefanprodan/swarmprom-alertmanager:v0.14.0
networks:
- mon_net
environment:
- SLACK_URL=${SLACK_URL:-https://hooks.slack.com/services/TOKEN}
- SLACK_CHANNEL=${SLACK_CHANNEL:-general}
- SLACK_USER=${SLACK_USER:-alertmanager}
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
volumes:
- alertmanager:/alertmanager
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
memory: 128M
reservations:
memory: 64M
unsee:
image: cloudflare/unsee:v0.8.0
networks:
- mon_net
environment:
- "ALERTMANAGER_URIS=default:http://alertmanager:9093"
deploy:
mode: replicated
replicas: 1
node-exporter:
image: stefanprodan/swarmprom-node-exporter:v0.16.0
networks:
- mon_net
environment:
- NODE_ID={{.Node.ID}}
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
- /etc/hostname:/etc/nodename
command:
- '--path.sysfs=/host/sys'
- '--path.procfs=/host/proc'
- '--collector.textfile.directory=/etc/node-exporter/'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
- '--no-collector.ipvs'
deploy:
mode: global
resources:
limits:
memory: 128M
reservations:
memory: 64M
prometheus:
image: stefanprodan/swarmprom-prometheus:v2.5.0
networks:
- mon_net
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention=${PROMETHEUS_RETENTION:-24h}'
volumes:
- prometheus:/prometheus
configs:
- source: node_rules
target: /etc/prometheus/swarm_node.rules.yml
- source: task_rules
target: /etc/prometheus/swarm_task.rules.yml
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
memory: 2048M
reservations:
memory: 128M
caddy:
image: stefanprodan/caddy
ports:
- "3000:3000"
- "9090:9090"
- "9093:9093"
- "9094:9094"
networks:
- mon_net
environment:
- ADMIN_USER=${ADMIN_USER:-admin}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
configs:
- source: caddy_config
target: /etc/caddy/Caddyfile
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
memory: 128M
reservations:
memory: 64M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 5s
timeout: 1s
retries: 5
volumes:
prometheus: {}
grafana: {}
alertmanager: {}
configs:
caddy_config:
file: ./caddy/Caddyfile
dockerd_config:
file: ./dockerd-exporter/Caddyfile
node_rules:
file: ./prometheus/rules/swarm_node.rules.yml
task_rules:
file: ./prometheus/rules/swarm_task.rules.yml
networks:
mon_net:
driver: overlay
attachable: true
Strg-x, y, Enter
cd && cd swarmprom && ADMIN_USER=admin ADMIN_PASSWORD=admin docker stack deploy -c docker-compose.yml mon
Jetzt etwas warten, bis die Images heruntergeladen und die Dienste gestartet wurden. Kontrollieren kann man das mit:
docker service ls
Alle Ausgaben mit mon_ sind für mich nun interessant:
f4lnr0ug67yu mon_alertmanager replicated 1/1 stefanprodan/swarmprom-alertmanager:v0.14.0
jrnl0vw57am0 mon_caddy replicated 1/1 stefanprodan/caddy:latest *:3000->3000/tcp, *:9090->9090/tcp, *:9093-9094->9093-9094/tcp
lxyq832szsd6 mon_cadvisor global 4/4 gcr.io/cadvisor/cadvisor:latest
rn9wkp7vjz7g mon_dockerd-exporter global 4/4 stefanprodan/caddy:latest
grci7iaxshdv mon_grafana replicated 1/1 stefanprodan/swarmprom-grafana:5.3.4
j1bh4s6qnmjr mon_node-exporter global 4/4 stefanprodan/swarmprom-node-exporter:v0.16.0
rwwjj3ooui62 mon_prometheus replicated 1/1 stefanprodan/swarmprom-prometheus:v2.5.0
of6zkdmualrp mon_unsee replicated 1/1 cloudflare/unsee:v0.8.0
Erst wenn bei allen Diensten x/x (identische Werte) angezeigt werden, wurde alles komplett geladen.
Aufruf im Browser:
Server-IP:3000
Hat man das Dashboard geöffnet, admin admin eingeben und das Passwort ändern. Dann links oben auf „Home“ und den gewünschten Dienst wählen. Die für mich wichtigste Ausgabe ist hierbei „Docker Swarm Nodes“
Docker Swarm Nodes:
.
Quelle:
https://www.fatalerrors.org/a/prometheus-monitoring-docker-swarm-cluster.html




