Как узнать адрес сервиса в Kubernetes для обращения к REST API
Что проверяют
Понимаете ли вы, откуда именно обращаетесь к сервису: изнутри кластера, со своей машины или из CI. Для тестировщика это рабочая задача, запустить автотесты против стенда. Следом спрашивают, как добраться до сервиса, у которого нет внешнего адреса.
Как отвечать
Сначала найти сам сервис, потом выбрать способ доступа:
kubectl get svc -n payments: список сервисов с типом,CLUSTER-IP,EXTERNAL-IPи портами.kubectl describe svc orders -n paymentsдобавит селектор иEndpoints, то есть адреса подов за сервисом;- DNS внутри кластера: полное имя
orders.payments.svc.cluster.local(доменcluster.localстоит по умолчанию, но в конкретном кластере может быть другим). Из того же namespace хватаетorders, из соседнегоorders.payments; - ClusterIP: тип по умолчанию, адрес доступен только изнутри кластера;
- доступ снаружи:
NodePortоткрывает порт на каждой ноде (по умолчанию из диапазона от 30000 до 32767),LoadBalancerполучает внешний IP от облака, но чаще REST API публикуют через Ingress или Gateway API по доменному имени. Хост и пути покажетkubectl get ingress -n payments; kubectl port-forward svc/orders 8080:80 -n payments: пробрасывает порт сервиса наlocalhost:8080. Самый быстрый способ проверить API руками;- порты: в манифесте сервиса есть
port, на котором слушает сам сервис, иtargetPort, порт контейнера. Через сервис обращаются наport.
Для автотестов в CI адрес не зашивают в код: базовый URL передают переменной окружения. Если тесты крутятся подом в том же кластере, берут DNS-имя сервиса, если снаружи, то адрес Ingress тестового стенда.
Где спотыкаются
Копируют CLUSTER-IP из вывода kubectl get svc в Postman на ноутбуке и не понимают, откуда таймаут. Этот адрес существует только в сети кластера.
Не смотрят на Endpoints. Сервис есть, а список пуст, потому что селектор не совпадает с метками подов или поды не прошли readiness. Запрос не доходит ни до одного пода, а проблему ищут в самом API.
Прописывают в тестах IP конкретного пода. Он меняется при каждом перезапуске. Стабильны только имя сервиса и адрес Ingress.