DNS и обнаружение служб
Поймите, как Pod находят друг друга с помощью встроенного DNS Kubernetes и как работает обнаружение служб.
«DNS и обнаружение служб» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Проблема обнаружения сервисов
Поды создаются и удаляются, а их IP постоянно меняются. Жёсткая фиксация IP-адресов сразу привела бы к сбоям. Kubernetes решает эту проблему с помощью обнаружения сервисов на основе DNS.
Вместо IP-адреса вы обращаетесь к стабильному имени.
DNS кластера
В каждом кластере работает сервис DNS (обычно CoreDNS). Он автоматически создаёт DNS-записи для сервисов и подов, поэтому имена преобразуются в правильный ClusterIP.
DNS-имена сервисов
Сервис получает DNS-имя по предсказуемому шаблону:
service-name.namespace.svc.cluster.local
В пределах одного пространства имён можно использовать только короткое имя service-name.
# from a Pod in the same namespace
curl http://payment-service:8080
# fully qualified, from any namespace
curl http://payment-service.shop.svc.cluster.local:8080Пространства имён и имена
Пространство имён является частью имени. Чтобы обратиться к сервису в другом пространстве имён, укажите его: service.namespace.
# Pod in 'frontend' namespace calling 'backend' namespace
curl http://api.backend.svc.cluster.localПроверка DNS из пода
Для проверки разрешения имён можно запустить временный под.
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- nslookup payment-serviceКак CoreDNS разрешает имена
Когда под запрашивает имя, запрос отправляется в CoreDNS. CoreDNS находит соответствующий сервис и возвращает его ClusterIP. Для сервисов без виртуального IP-адреса CoreDNS напрямую возвращает IP-адреса подов.
Сервисы без виртуального IP-адреса
Сервис без виртуального IP-адреса (clusterIP: None) не использует один виртуальный IP-адрес. Вместо этого DNS возвращает отдельные IP-адреса подов, что особенно важно для приложений с состоянием, которые обращаются к подам напрямую.
apiVersion: v1
kind: Service
metadata:
name: db
spec:
clusterIP: None
selector:
app: db
ports:
- port: 5432DNS-записи подов
При использовании сервиса без виртуального IP-адреса каждый обслуживаемый им под также может получить собственную DNS-запись. Это полезно для StatefulSets, в которых поды имеют стабильные идентификаторы, например db-0 и db-1.
# stable per-Pod name in a StatefulSet
curl http://db-0.db.default.svc.cluster.local:5432Проверка resolv.conf пода
Kubernetes добавляет конфигурацию DNS в каждый под. Домены поиска позволяют правильно разрешать короткие имена.
kubectl exec -it mypod -- cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.localПеременные окружения и DNS
Kubernetes также добавляет сведения для подключения к сервисам в виде переменных окружения, но только для сервисов, существовавших на момент запуска пода. DNS предпочтительнее, поскольку он всегда отражает актуальное состояние.
Распространённые проблемы с DNS
- Забыть указать пространство имён при обращении между пространствами имён
- Ожидать DNS-запись для сервиса, у которого нет соответствующих подов (нет конечных точек)
- Кэшировать устаревшие IP-адреса в приложении вместо повторного разрешения имени
Быстрая проверка
Выберите правильный формат DNS-имени.
Итоги
Вы узнали, что Kubernetes использует CoreDNS, чтобы предоставлять сервисам стабильные DNS-имена по шаблону service.namespace.svc.cluster.local. Короткие имена работают внутри пространства имён, сервисы без виртуального IP-адреса предоставляют IP-адреса отдельных подов, а DNS всегда отражает текущее состояние кластера.
Часто задаваемые вопросы
Урок «DNS и обнаружение служб» бесплатный?
Да — полный текст урока «DNS и обнаружение служб» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «DNS и обнаружение служб»?
Поймите, как Pod находят друг друга с помощью встроенного DNS Kubernetes и как работает обнаружение служб. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «DNS и обнаружение служб»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Открытие доступа к приложениям с помощью сервисов
- Типы сервисов: ClusterIP, NodePort, LoadBalancer
- Ingress для внешнего доступа
- DNS и обнаружение служб