Контейнеры Unhealthy после обновления в конфигурации с балансировщиком
title: Контейнеры Unhealthy после обновления в конфигурации с балансировщиком slug: ts-konteinery-unhealthy-posle-obnovleniya tags: [обновление, unhealthy, балансировщик, HAProxy, NFS, Redis, docker] domain: Troubleshooting type: Troubleshooting audience: partner-engineer product_versions: "4.x" status: ready related_components: [ПринтМенеджер, Балансировщик, NFS, Redis] related_pages:
- kak-obnovit-printum
- kak-rabotaet-otkazoustoychivyy-printmanager
- kak-rabotaet-filialnaya-arhitektura-printum
Контейнеры Unhealthy после обновления в конфигурации с балансировщиком
Симптомы
После обновления ПринтМенеджер в схеме с балансировщиком:
- Один или несколько контейнеров
printmanager-appзапускаются со статусомunhealthy. - Нода недоступна через HAProxy (статус
DOWNв панели HAProxy). - Печать работает частично или не работает совсем.
Причина
Три наиболее частые:
- NFS не смонтирован — volume
printmanager_mediaнедоступен, контейнер не может запуститься. - Redis потерял master — после одновременного перезапуска нод Redis sentinel не успел выбрать нового мастера.
- Ошибка прав в printmanager-ftpd — контейнер завершился с ошибкой при записи PID-файла.
Диагностика
Шаг 1. Проверить статус всех контейнеров на проблемной ноде:
cd /opt/printmanager
sudo docker-compose ps
Зафиксировать какие контейнеры в статусе unhealthy или Exit.
Шаг 2. Проверить монтирование NFS:
df -h | grep printmanager
mount | grep nfs
Норма: NFS-том смонтирован и отображается в выводе.
Ошибка: том отсутствует или connection refused.
Шаг 3. Проверить логи printmanager-app:
sudo docker-compose logs printmanager-app --tail=100
Признак NFS-проблемы:
failed to mount local volume: connection refused, port=2049, addr=127.0.0.1
Шаг 4. Проверить Redis:
sudo docker-compose logs printmanager-redis --tail=50
Признак проблемы Redis:
Connection with master lost
MASTER <-> REPLICA sync started
+sdown master
+tilt mode entered
Шаг 5. Проверить printmanager-ftpd:
sudo docker-compose logs printmanager-ftpd --tail=50
Признак проблемы ftpd:
Permission denied при записи PID
Решение
NFS не смонтирован
Проверить, запущен ли stunnel (если NFS проброшен через stunnel):
systemctl status stunnel
Если stunnel не запущен:
systemctl start stunnel
После этого перезапустить ПринтМенеджер:
sudo docker-compose down && sudo docker-compose up -d
Если stunnel отсутствует после восстановления из бэкапа — см. restore.sh не восстанавливает stunnel (TODO).
Redis не выбрал мастера
Подождать 1–2 минуты — sentinel должен автоматически выбрать нового мастера. Если не восстановился:
sudo docker-compose restart printmanager-redis printmanager-redis-sentinel
Проверить логи через 1 минуту:
sudo docker-compose logs printmanager-redis-sentinel --tail=30
Норма: +elected-leader, +promoted-slave.
Ошибка прав в printmanager-ftpd
sudo docker-compose restart printmanager-ftpd
Если ошибка повторяется — передать логи в ТП.
Как проверить результат
sudo docker-compose ps
Все контейнеры в статусе Up. В панели HAProxy нода отображается как UP. Тестовое задание успешно печатается.
Когда эскалировать
- Причина не определяется по логам.
- NFS недоступен по сетевым причинам (не связано с stunnel).
- Redis не восстанавливается после перезапуска.
- Проблема воспроизводится на всех нодах одновременно.
Приложить к заявке: вывод docker-compose ps со всех нод, логи printmanager-app, printmanager-redis, printmanager-ftpd, версии М и ПринтМенеджер.