В стандартной работе DNS в Kubernetes существует ряд проблем, которые могут привести к неоправданному снижению ключевых показателей работы сервиса:

  • Linux-ядро по умолчанию не кэширует DNS-запросы, поэтому в подах локальный кэш отсутствует.
  • Все DNS-запросы из контейнера влекут за собой сетевой запрос к кластерному DNS. Запросы к ресурсам в рамках одного узла все равно приводят к сетевым запросам.
  • Запрос из пода сначала разрешается в кластерных DNS-зонах и только потом отправляется на внешние DNS-серверы. Например, запрос на ya.ru будет разрешаться сначала в кластерных зонах, таких как cluster.local, svc.cluster.local, <namespace>.svc.cluster.local, и только после получения отрицательных ответов, то есть по сути только с более чем второго раза, будет разрешаться правильно.

При появлении небольших сетевых задержек качество сервиса может значительно деградировать из-за приведенных выше проблем.

Одно из решений — установить DNS-сервер на каждый узел. В Deckhouse Virtualization Platform это реализуется с помощью модуля node-local-dns.

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

Принцип работы кэширующего DNS-сервера

При разворачивании кэширующего DNS-сервера модуль node-local-dns выполняет на каждом узле кластера следующие настройки:

  • Настраивает интерфейс с IP-адресом clusterIP сервиса kube-dns.
  • Запускает кэширующий CoreDNS, который слушает на этом адресе.
  • Добавляет правило в iptables: если сокет открыт, трафик перенаправляется на него, если не открыт — работает обычная Kubernetes-маршрутизация через ClusterIP:

    -A PREROUTING -d <IP-адрес kube-dns> -m socket --nowildcard -j NOTRACK
    

Особенности конфигурации CoreDNS

Основные характеристики конфигурации CoreDNS:

  • кэширование всех запросов;
  • передача всех DNS-запросов в ClusterIP кластерного DNS.

Дашборд Grafana

Дашборд Kubernetes / DNS (node local) отображает:

  • общие графики (для оценки работы DNS в целом);
  • графики по узлам (для глубокого изучения найденной на общем графике проблемы узла);
  • графики по upstream (для оценки работы кластерного DNS и серверов узлов, указанных в /etc/resolv.conf).