DNS и обнаружение сервисов
В Kubernetes не нужно знать IP — сервисы находят друг друга по имени благодаря встроенному DNS.
Service discovery — механизм, по которому приложения находят друг друга по имени, а не по IP. В Kubernetes за это отвечает встроенный DNS (CoreDNS).
Когда вы создаёте Service с именем backend, в кластере появляется DNS-запись. Любой под может обратиться к нему просто как http://backend — без всяких IP-адресов. Это и делает конфигурацию переносимой: имена не меняются при пересоздании.
Имя сервиса как адрес
Пусть есть Service backend, слушающий порт 8080. Фронтенд-под обращается так:
# изнутри пода фронтенда
curl http://backend:8080/api/healthDNS превратит backend в ClusterIP сервиса, а тот сбалансирует запрос на один из подов бэкенда.
Полное DNS-имя (FQDN)
Короткое имя backend работает в пределах одного namespace. Полная форма включает namespace:
<имя-сервиса>.<namespace>.svc.cluster.local
Пример:
backend.default.svc.cluster.localЧтобы обратиться к сервису в другом namespace, добавьте его имя:
# фронтенд из namespace 'shop' зовёт сервис 'db' в namespace 'data'
curl http://db.data:5432Переменные окружения как бонус
Помимо DNS, Kubernetes пробрасывает в поды переменные окружения с адресами сервисов, существовавших на момент старта пода. Но DNS надёжнее: он работает и для сервисов, созданных позже. Поэтому в коде используйте имена, а не env-переменные с IP.
Проверка DNS изнутри
Зайдём в под и проверим резолвинг имени:
kubectl run tester --image=busybox:1.36 -it --rm -- sh
# внутри:
nslookup backendВывод:
Server: 10.96.0.10 Address: 10.96.0.10:53 Name: backend.default.svc.cluster.local Address: 10.96.140.21
| Откуда зовём | Адрес |
| тот же namespace | backend |
| другой namespace | backend.data |
| полная форма | backend.data.svc.cluster.local |
Итог
- CoreDNS даёт каждому сервису DNS-имя — обращайтесь по имени, а не по IP.
- В одном namespace хватает короткого имени; между namespace добавляйте его имя.
- FQDN:
имя.namespace.svc.cluster.local.