Введение в DNS-сервис Kubernetes

Вступление

Система доменных имен (DNS) - это система для связи различных типов информации, таких как IP-адреса, с легко запоминающимися именами. По умолчанию большинство кластеров Kubernetes автоматически настраивают внутреннюю службу DNS, чтобы обеспечить легкий механизм для обнаружения службы. Встроенное обнаружение служб облегчает приложениям поиск и связь друг с другом в кластерах Kubernetes, даже когда модули и службы создаются, удаляются и перемещаются между узлами.

Детали реализации службы Kubernetes DNS изменились в последних версиях Kubernetes. В этой статье мы рассмотрим обе версии службы Kubernetes DNS какkube-dns, так иCoreDNS. Мы рассмотрим, как они работают, и записи DNS, которые генерирует Kubernetes.

Чтобы получить более полное представление о DNS, прежде чем начать, прочтитеAn Introduction to DNS Terminology, Components, and Concepts. По любым темам Kubernetes, которые могут быть вам незнакомы, вы можете прочитатьAn Introduction to Kubernetes.

Что предоставляет DNS-сервис Kubernetes?

До версии Kubernetes 1.11 служба Kubernetes DNS была основана наkube-dns. Версия 1.11 представилаCoreDNS для решения некоторых проблем безопасности и стабильности с kube-dns.

Независимо от программного обеспечения, обрабатывающего фактические записи DNS, обе реализации работают одинаково:

  • Создается служба с именемkube-dns и один или несколько модулей.

  • Сервисkube-dns прослушивает событияservice иendpoint от Kubernetes API и обновляет свои записи DNS по мере необходимости. Эти события запускаются при создании, обновлении или удалении служб Kubernetes и связанных с ними модулей.

  • kubelet устанавливает параметр/etc/resolv.confnameserver для каждого нового модуля на IP-адрес кластера службыkube-dns с соответствующими параметрамиsearch, позволяющими использовать более короткие имена хостов:

    resolv.conf

    nameserver 10.32.0.10
    search namespace.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • Приложения, работающие в контейнерах, могут затем преобразовывать имена хостов, такие какexample-service.namespace, в правильные IP-адреса кластера.

Пример записей Kubernetes DNS

Полная запись DNSA сервиса Kubernetes будет выглядеть, как в следующем примере:

service.namespace.svc.cluster.local

Модуль будет иметь запись в этом формате, отражающую фактический IP-адрес модуля:

10.32.0.125.namespace.pod.cluster.local

Кроме того, для именованных портов службы Kubernetes создаются записиSRV:

_port-name._protocol.service.namespace.svc.cluster.local

Результатом всего этого является встроенный механизм обнаружения служб на основе DNS, в котором ваше приложение или микросервис могут назначать простое и непротиворечивое имя хоста для доступа к другим службам или модулям в кластере.

Поиск доменов и разрешение коротких имен хостов

Из-за суффиксов поискового домена, перечисленных в файлеresolv.conf, вам часто не нужно использовать полное имя хоста для связи с другой службой. Если вы обращаетесь к службе в том же пространстве имен, вы можете использовать только имя службы, чтобы связаться с ней:

other-service

Если служба находится в другом пространстве имен, добавьте его в запрос:

other-service.other-namespace

Если вы ориентируетесь на модуль, вам нужно будет использовать по крайней мере следующее:

pod-ip.other-namespace.pod

Как мы видели в файлеresolv.conf по умолчанию, только суффиксы.svc заполняются автоматически, поэтому убедитесь, что вы указали все до.pod.

Теперь, когда мы знаем о практическом использовании службы DNS Kubernetes, давайте рассмотрим некоторые детали двух разных реализаций.

Подробности внедрения DNS в Kubernetes

Как отмечалось в предыдущем разделе, Kubernetes версии 1.11 представил новое программное обеспечение для обработки службыkube-dns. Мотивация к изменению заключалась в повышении производительности и безопасности сервиса. Давайте сначала посмотрим на исходную реализациюkube-dns.

Кубэ-DNS

Службаkube-dns до Kubernetes 1.11 состояла из трех контейнеров, работающих в модулеkube-dns в пространстве именkube-system. Три контейнера:

  • kube-dns: контейнер, который запускаетSkyDNS, который выполняет разрешение DNS-запросов

  • dnsmasq: - популярный облегченный преобразователь DNS и кэш, который кэширует ответы от SkyDNS.

  • sidecar: - вспомогательный контейнер, который обрабатывает отчеты о метриках и отвечает на проверки работоспособности службы.

Уязвимости безопасности в Dnsmasq и проблемы с масштабированием производительности SkyDNS привели к созданию системы замены CoreDNS.

CoreDNS

Начиная с Kubernetes 1.11, новый DNS-сервис Kubernetes,CoreDNS стал общедоступным. Это означает, что он готов к производственному использованию и будет службой DNS кластера по умолчанию для многих инструментов установки и управляемых провайдеров Kubernetes.

CoreDNS - это отдельный процесс, написанный на Go, который охватывает все функции предыдущей системы. Один контейнер разрешает и кэширует DNS-запросы, отвечает на проверки работоспособности и предоставляет метрики.

В дополнение к решению проблем, связанных с производительностью и безопасностью, CoreDNS исправляет некоторые другие незначительные ошибки и добавляет некоторые новые функции:

  • Некоторые проблемы с несовместимостью между использованием stubDomains и внешними сервисами были исправлены

  • CoreDNS может улучшить циклическое распределение нагрузки на основе DNS путем рандомизации порядка, в котором он возвращает определенные записи

  • Функция под названиемautopath может улучшить время отклика DNS при разрешении внешних имен хостов, более разумно перебирая каждый из суффиксов домена поиска, перечисленных вresolv.conf

  • С kube-dns10.32.0.125.namespace.pod.cluster.local всегда будет преобразовываться в10.32.0.125, даже если пода на самом деле не существует. CoreDNS имеет режим «проверено pods», который успешно разрешается, только если существует pod с правильным IP и в правильном пространстве имен.

Для получения дополнительной информации о CoreDNS и его отличиях от kube-dns вы можете прочитатьthe Kubernetes CoreDNS GA announcement.

Дополнительные параметры конфигурации

Операторы Kubernetes часто хотят настроить, как их поды и контейнеры разрешают определенные пользовательские домены, или им нужно настроить вышестоящие серверы имен или суффиксы доменов поиска, настроенные вresolv.conf. Вы можете сделать это с помощью параметраdnsConfig в спецификации вашего модуля:

example_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  namespace: example
  name: custom-dns
spec:
  containers:
    - name: example
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 203.0.113.44
    searches:
      - custom.dns.local

Обновление этой конфигурации перезапишетresolv.conf модуля, чтобы изменения вступили в силу. Конфигурация напрямую соответствует стандартным параметрамresolv.conf, поэтому приведенная выше конфигурация создаст файл со строкамиnameserver 203.0.113.44 иsearch custom.dns.local.

Заключение

В этой статье мы рассмотрели основы того, что DNS-сервис Kubernetes предоставляет разработчикам, показали несколько примеров DNS-записей для сервисов и модулей, обсудили, как система реализована в различных версиях Kubernetes, и выделили некоторые дополнительные параметры конфигурации, доступные для настройки ваших модулей. разрешить DNS-запросы.

Дополнительную информацию о службе Kubernetes DNS см. Вthe official Kubernetes DNS for Services and Pods documentation.

Related