DNS и обнаружение сервисов

В Kubernetes не нужно знать IP — сервисы находят друг друга по имени благодаря встроенному DNS.

Service discovery — механизм, по которому приложения находят друг друга по имени, а не по IP. В Kubernetes за это отвечает встроенный DNS (CoreDNS).

Когда вы создаёте Service с именем backend, в кластере появляется DNS-запись. Любой под может обратиться к нему просто как http://backend — без всяких IP-адресов. Это и делает конфигурацию переносимой: имена не меняются при пересоздании.

Имя сервиса как адрес

Пусть есть Service backend, слушающий порт 8080. Фронтенд-под обращается так:

# изнутри пода фронтенда
curl http://backend:8080/api/health

DNS превратит 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
Откуда зовёмАдрес
тот же namespacebackend
другой namespacebackend.data
полная формаbackend.data.svc.cluster.local

Итог

  • CoreDNS даёт каждому сервису DNS-имя — обращайтесь по имени, а не по IP.
  • В одном namespace хватает короткого имени; между namespace добавляйте его имя.
  • FQDN: имя.namespace.svc.cluster.local.
Проверьте себя
1. Как один под обращается к другому приложению в том же namespace?
AТолько по IP-адресу пода
BПо имени сервиса, например http://backend
CЧерез kubectl exec
DЧерез etcd напрямую
2. Как выглядит полное DNS-имя сервиса?
Aимя.svc
Bимя.namespace.svc.cluster.local
Ccluster.local.namespace.имя
Dимя@namespace
3. Что отвечает за DNS внутри кластера Kubernetes?
Akubelet
Betcd
CCoreDNS
Dkube-proxy
Поддержать проект