Проверка готовности или запуска не может подключиться к приложению
События Kubernetes «Readiness probe failed: dial tcp 10.0.0.5:8080: connect: connection refused» и «Startup probe failed»: приложение в контейнере ещё не слушает порт, слушает другой порт или только localhost. Как отличить долгий старт от ошибки настройки.
Что это значит
kubelet проверяет контейнер по расписанию: открывает соединение на порт или запрашивает адрес. connection refused значит, что по этому адресу никто не слушает. Варианты причин:
- приложение ещё стартует и порт пока не открыт;
- в проверке указан не тот порт;
- приложение слушает только
127.0.0.1, и снаружи контейнера порт недоступен; - приложение упало, а процесс контейнера ещё жив.
Последствия зависят от проверки. Не прошла проверка готовности: под не получает запросы, но не перезапускается. Не прошла проверка жизни (liveness) или запуска (startup) положенное число раз: контейнер перезапускается, и при долгом старте получается бесконечный цикл перезапусков.
Как проверить
kubectl describe pod <под> -n <namespace> | grep -E -A3 "Liveness|Readiness|Startup"
kubectl logs <под> -n <namespace> --previous | tail -50
kubectl exec <под> -n <namespace> -- ss -ltn
Последняя команда показывает, какие порты и на каких адресах реально слушает приложение, если в образе есть ss.
Что сделать
- Долгий старт: добавить проверку запуска (startupProbe) с запасом по времени, а проверки готовности и жизни оставить быстрыми.
- Не тот порт или адрес: исправить порт в проверке или настроить приложение слушать
0.0.0.0. - Проверку жизни делать простой, без обращений к базе и соседним сервисам: иначе сбой зависимости перезапускает все поды разом.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать