Service есть, а запросы не доходят
Вопрос
Под приложения работает, Service создан, но curl http://api.prod из другого пода зависает или отдаёт ошибку. Как будешь искать причину?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
DNS: резолвится ли имя (`nslookup api.prod` из пода), тот ли namespace
Эндпоинты: `kubectl get endpointslices`; пусто, значит не совпадает селектор или поды не Ready
Порты: `targetPort` совпадает с портом, который слушает приложение, и приложение слушает `0.0.0.0`
Прямой запрос на IP пода и порт: работает ли само приложение
NetworkPolicy, запрещающие трафик между namespace или подами
kube-proxy или CNI на узле: логи, правила, для Ingress ещё логи контроллера
Что могут спросить следом
- Как запустить отладочный под с утилитами?
- Чем отличается проблема с refused от таймаута в этом случае?
Разбор
Иду по цепочке от имени к процессу. Сначала из отладочного пода, например netshoot, nslookup api.prod: если имя не резолвится, проблема в DNS или опечатке в namespace. Потом смотрю эндпоинты: kubectl get endpointslices -l kubernetes.io/service-name=api. Пустой список, это самая частая причина: селектор сервиса не совпадает с метками подов, проверяю kubectl get pods --show-labels, или поды не проходят readiness, смотрю колонку READY и describe. Если адреса есть, иду в обход сервиса: curl на IP пода и targetPort. Не отвечает, значит порт не тот или приложение слушает 127.0.0.1. Отвечает на IP пода, но не через сервис: смотрю NetworkPolicy в обоих namespace и состояние kube-proxy или CNI на узле. Refused обычно значит неправильный порт, таймаут часто означает политику, которая молча отбрасывает пакеты. Если запрос идёт снаружи через Ingress, добавляю проверку логов Ingress-контроллера и его класса.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.