Эти возможности доступны только в Enterprise Edition.

Описание модуля

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

Модуль состоит из оригинального CoreDNS, разворачиваемого в DaemonSet на все ноды, с добавлением алгоритма настройки сети и настройки правил iptables.

Назначение

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

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

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

Одно из решений — поставить DNS сервер на каждый узел, для чего и предназначен настоящий модуль.

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

Grafana dashboard

Kubernetes / DNS (node local), на которой отображены:

  • Общие графики. Позволяют оценить в целом картину работы DNS.
  • Графики по узлам. В случае идентификации проблем какого-то узла на общих графиках, позволяют более детально изучить ее данные.
  • Графики по upstream. Позволяют оценить работу кластерного DNS и северов узлов, указанных в /etc/resolv.conf.

Как работает

На каждом узле:

  • поднят интерфейс с IP-адресом clusterIP сервиса kube-dns,
  • запускается кеширующий CoreDNS, который слушает на этом адресе,
  • добавлено хитрое правило в iptables, что если сокет открыт – идти туда, если не открыт – работает обычная магия куба для clusterIP.

Само правило, которое и позволяет сделать беспроблемный fallback:

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

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

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

  1. Кэширование всех запросов
  2. Forward всех DNS запросов в ClusterIP кластерного DNS