Модуль 20 / 24
Observability и диагностика
Содержание
1. Цели и результат модуля
После модуля вы соберёте logs, events и point-in-time metrics, свяжете task failure с reconciliation и зададите alerts для replicas, restarts, disk и HTTP.
- начинать с desired/actual state
- коррелировать service, task, node и время
- разделять симптомы и причины
- проверять доступность снаружи
2. Теория: сигналы наблюдаемости
Metrics показывают численное состояние, logs объясняют работу компонента, events фиксируют изменения, traces связывают путь запроса. Docker CLI помогает локальной диагностике, а история и alerting требуют внешнего сборщика.
Manager знает desired state и task history, Engine — local containers и ресурсы, reverse proxy — внешний результат. Полная картина требует всех уровней.
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 нужен заранее.
4. Корреляция и retention
Используйте UTC и связывайте service ID, task ID, node и container ID. Service task history хранит замены, а events имеют ограниченное локальное окно.
Ограничивайте json-file logs, задавайте retention и избегайте labels высокой cardinality. Secrets нельзя писать в logs.
5. Методические указания
- Снимите baseline
- Создайте известный traffic
- Выберите node по placement
- Посчитайте errors
- Сопоставьте exit code, event и task
- Проверьте desired равно running
6. Лабораторная работа: baseline
Зафиксируйте nodes, replicas, task history и policies.
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}}'7. Лабораторная работа: logs
Создайте пять запросов и найдите их в service и proxy logs.
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 traefik8. Лабораторная работа: ресурсы
Проверьте каждый node, containers, disk и reclaimable Docker data.
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-pager9. Лабораторная работа: failure correlation
Выберите node с task, завершите container и выполните 30 HTTPS-запросов. Найдите exit 137, kill/die events и replacement task.
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 15ssh 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. Контроль, критерии освоения и cleanup
- Где виден desired state?
- Чем events отличаются от logs?
- Почему stats недостаточно для trend?
- Что означает exit 137?
- Почему mismatch важен без errors?
- Какие поля нужны alert?
Модуль освоен, если kill, die, failed task и replacement связаны, HTTP failures равны нулю, desired равен running. Cleanup удаляет event-файл; сервис сохраняется.
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/