← К программе курса

Модуль 20 / 24

Observability и диагностика

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы соберёте logs, events и point-in-time metrics, свяжете task failure с reconciliation и зададите alerts для replicas, restarts, disk и HTTP.

  • начинать с desired/actual state
  • коррелировать service, task, node и время
  • разделять симптомы и причины
  • проверять доступность снаружи
02

2. Теория: сигналы наблюдаемости

Metrics показывают численное состояние, logs объясняют работу компонента, events фиксируют изменения, traces связывают путь запроса. Docker CLI помогает локальной диагностике, а история и alerting требуют внешнего сборщика.

Manager знает desired state и task history, Engine — local containers и ресурсы, reverse proxy — внешний результат. Полная картина требует всех уровней.

03

3. SLI и alerts

Следите за available replicas, restart rate, HTTP success/latency, CPU, memory и disk. Alert содержит условие, длительность, severity и runbook.

Replica mismatch уменьшает fault budget даже без HTTP errors. Disk pressure угрожает images, logs и Raft, поэтому alert нужен заранее.

04

4. Корреляция и retention

Используйте UTC и связывайте service ID, task ID, node и container ID. Service task history хранит замены, а events имеют ограниченное локальное окно.

Ограничивайте json-file logs, задавайте retention и избегайте labels высокой cardinality. Secrets нельзя писать в logs.

05

5. Методические указания

  • Снимите baseline
  • Создайте известный traffic
  • Выберите node по placement
  • Посчитайте errors
  • Сопоставьте exit code, event и task
  • Проверьте desired равно running
06

6. Лабораторная работа: baseline

Зафиксируйте nodes, replicas, task history и policies.

terminal
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker service ps --no-trunc swarm-ingress-demo
ssh swarm-manager-3 docker service inspect swarm-ingress-demo --format 'desired={{.Spec.Mode.Replicated.Replicas}} restart={{json .Spec.TaskTemplate.RestartPolicy}} update={{json .Spec.UpdateConfig}}'
07

7. Лабораторная работа: logs

Создайте пять запросов и найдите их в service и proxy logs.

terminal
for n in 1 2 3 4 5; do curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/; done
ssh swarm-manager-3 docker service logs --since 2m --timestamps --raw swarm-ingress-demo
docker logs --since 2m traefik
08

8. Лабораторная работа: ресурсы

Проверьте каждый node, containers, disk и reclaimable Docker data.

terminal
for host in swarm-manager-1 swarm-manager-2 swarm-manager-3; do ssh "$host" hostname; ssh "$host" docker stats --no-stream; ssh "$host" df -h / /var/lib/docker; ssh "$host" docker system df; done
ssh swarm-manager-3 sudo journalctl -u docker --since '10 minutes ago' --no-pager
09

9. Лабораторная работа: failure correlation

Выберите node с task, завершите container и выполните 30 HTTPS-запросов. Найдите exit 137, kill/die events и replacement task.

terminal
target=$(ssh swarm-manager-3 docker service ps --filter desired-state=running --format '{{.Node}}' swarm-ingress-demo | head -1)
ssh "$target" 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-ingress-demo | head -1); test -n "$id"; docker kill "$id"'
failures=0
for n in $(seq 1 30); do curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/ || failures=$((failures+1)); done
printf 'http_failures=%s\n' "$failures"
sleep 15
terminal
ssh swarm-manager-3 docker service ps --no-trunc swarm-ingress-demo
ssh swarm-manager-3 docker events --since 10m --until 0s --filter type=container --filter label=com.docker.swarm.service.name=swarm-ingress-demo
ssh swarm-manager-3 sudo journalctl -u docker --since '10 minutes ago' --no-pager
desired=$(ssh swarm-manager-3 docker service inspect swarm-ingress-demo --format '{{.Spec.Mode.Replicated.Replicas}}')
running=$(ssh swarm-manager-3 docker service ps --filter desired-state=running --format '{{.ID}}' swarm-ingress-demo | wc -l)
test "$desired" -eq "$running"
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/
  • нет replacement — scheduler и capacity
  • HTTP errors — ingress и readiness
  • events пусты — node или time window
  • disk растёт — rotation и retention
10

10. Контроль, критерии освоения и cleanup

  • Где виден desired state?
  • Чем events отличаются от logs?
  • Почему stats недостаточно для trend?
  • Что означает exit 137?
  • Почему mismatch важен без errors?
  • Какие поля нужны alert?

Модуль освоен, если kill, die, failed task и replacement связаны, HTTP failures равны нулю, desired равен running. Cleanup удаляет event-файл; сервис сохраняется.

terminal
ssh swarm-manager-3 rm -f /tmp/swarm-m20-events
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker node ls
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/