Описание модуля
Разворачивает кеширующий DNS-сервер на каждом узле кластера, экспортирует данные в Prometheus
для удобного анализа работы DNS в кластере на доске Grafana.
Модуль состоит из оригинального CoreDNS
, разворачиваемого в DaemonSet на все узлы, с добавлением алгоритма настройки сети и настройки правил iptables.
Назначение
Существует ряд проблем в стандартной работе DNS в Kubernetes, которые могут привести к неоправданному снижению ключевых показателей работы сервиса:
- Отсутствие кеширования запросов (в Linux из коробки нет кеша, соответственно и в Pod’ах его тоже нет из коробки).
- Все DNS-запросы из контейнера влекут за собой сетевой запрос к кластерному DNS. Запросы к ресурсам в рамках одного узла все равно приводят к сетевым запросам.
- Запрос из Pod’а сначала разрешается в кластерных 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: если сокет открыт — идти туда, если не открыт – работает обычная магия Kubernetes для clusterIP.
Само правило, которое и позволяет сделать беспроблемный fallback:
-A PREROUTING -d <IP-адрес kube-dns> -m socket --nowildcard -j NOTRACK
Особенности конфигурации CoreDNS
Основные характеристики конфигурации CoreDNS:
- кэширование всех запросов;
- forward всех DNS запросов в ClusterIP кластерного DNS.