Рубрики
Uncategorized

ДНС поина в Куберане

В этом посте я расскажу о том, как узнал о FQDN, поисковых путях и NDOTS для решения медленного разрешения DNS в Куберане. Теги с Куберанетами, DevOps, DNS.

Первоначально опубликовано на моем блог

Одним из основных преимуществ развертывания рабочих нагрузок в Kubernetes является бесшовным открытием приложений. Внутри кластерной связи становится легко с концепцией Сервис который представляет виртуальный IP поддерживающий набор POD IPS. Например, если ваниль Сервис должен поговорить с Шоколад Сервис, это может напрямую использовать виртуальный IP для Шоколад Отказ Теперь вопрос в том, кто решает запрос DNS для Шоколад и как?

Разрешение DNS настроен в кластере Kubernetes через Coredns. . Кублет настраивает каждый POD /etc/resolv.conf использовать POD Coredns как Inserver Отказ Вы можете увидеть содержимое /etc/resolv.conf Внутри любого стручка они будут выглядеть что-то вроде:

search hello.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.152.183.10
options ndots:5

Этот конфиг используется клиентами DNS для пересылки запросов DNS к DNS-серверу. resolv.conf. это файл конфигурации Resolver, который имеет информацию о:

  • Inserver : Где DNS-запросы направлены на. В нашем случае это адрес Coredns услуга.

  • Поиск : Представляет путь поиска для определенного домена. Интересно Google.com или Mrkaran.dev не имеет fqdn (полностью квалифицированное доменное имя). Стандартное соглашение о том, что большинство резольсеров DNS следуют, является то, что если домен заканчивается Отказ (Представление корневой зоны), домен считается FQDN. Некоторые резольсеры пытаются действовать умным и добавлять Отказ сами себя. Итак, mrkaran.dev. это пк, но Mrkaran.dev не является.

  • ndots : Это самое интересное значение и это выделить этого поста. ndots Представляет пороговое значение количества точек в имени запроса, чтобы рассмотреть его как «полностью квалифицированное» доменное имя. Больше на это позже, как мы обнаруживаем поток DNS-поиска.

Давайте проверим, что произойдет, когда мы запрашиваем для Mrkaran.dev в стручке.

$ nslookup mrkaran.dev
Server: 10.152.183.10
Address: 10.152.183.10#53

Non-authoritative answer:
Name: mrkaran.dev
Address: 157.230.35.153
Name: mrkaran.dev
Address: 2400:6180:0:d1::519:6001

Для этого эксперимента я также включил уровень регистрации Coredns на все что делает его очень многослойным. Давайте посмотрим на журналы Coredns POD:

[INFO] 10.1.28.1:35998 - 11131 "A IN mrkaran.dev.hello.svc.cluster.local. udp 53 false 512" NXDOMAIN qr,aa,rd 146 0.000263728s
[INFO] 10.1.28.1:34040 - 36853 "A IN mrkaran.dev.svc.cluster.local. udp 47 false 512" NXDOMAIN qr,aa,rd 140 0.000214201s
[INFO] 10.1.28.1:33468 - 29482 "A IN mrkaran.dev.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.000156107s
[INFO] 10.1.28.1:58471 - 45814 "A IN mrkaran.dev. udp 29 false 512" NOERROR qr,rd,ra 56 0.110263459s
[INFO] 10.1.28.1:54800 - 2463 "AAAA IN mrkaran.dev. udp 29 false 512" NOERROR qr,rd,ra 68 0.145091744s

Whew. Итак, 2 вещи расщепляют мой интерес здесь:

  • Запрос Iterate через все пути поиска до тех пор, пока ответ не содержит NoError код (который клиенты DNS понимают и хранят его в результате). Nxdomain Просто указывает, что никакой записи не найдены для этого доменного имени. С Mrkaran.dev Разве fqdn (согласно настройке ndots = 5 ), Resolver смотрит на поисковый путь и определяет порядок запроса.

  • А и АААА Рекорды уволены параллельно. Это потому, что Одно- запрос вариант в /etc/resolv.conf Имеет конфигурацию по умолчанию для выполнения параллельного поиска IPv4 и IPv6. Вы можете отключить это, используя Одно- запрос вариант.

Примечание : Glibc можно настроить, чтобы отправить эти запросы последовательно, но мускул не может, поэтому альпийские пользователи должны принять к сведению.

Игра с NDOTS

Давайте играть с ndots немного больше и посмотри, как это ведет себя. Идея проста, для клиента DNS узнает, является ли домен абсолютным или не является через это ndots параметр. Например, если вы запрашиваете для Google Просто как будет знать DNS-клиент, если это абсолютный домен. Если вы установите ndots как 1 DNS-клиент скажет «О, Google Нет даже одной 1 точки, позвольте мне попробовать пройти через список поиска. Однако, если вы запрашиваете для Google.com , список поиска будет полностью игнорироваться, поскольку имя запроса удовлетворяет ndots порог (По крайней мере, одна точка).

Мы можем видеть это, на самом деле делать это:

$ cat /etc/resolv.conf
options ndots:1
$ nslookup mrkaran
Server: 10.152.183.10
Address: 10.152.183.10#53

** server can't find mrkaran: NXDOMAIN

Coredns logs:

[INFO] 10.1.28.1:52495 - 2606 "A IN mrkaran.hello.svc.cluster.local. udp 49 false 512" NXDOMAIN qr,aa,rd 142 0.000524939s
[INFO] 10.1.28.1:59287 - 57522 "A IN mrkaran.svc.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.000368277s
[INFO] 10.1.28.1:53086 - 4863 "A IN mrkaran.cluster.local. udp 39 false 512" NXDOMAIN qr,aa,rd 132 0.000355344s
[INFO] 10.1.28.1:56863 - 41678 "A IN mrkaran. udp 25 false 512" NXDOMAIN qr,rd,ra 100 0.034629206s

С МРКАРАН не указывал ни одного Отказ Таким образом, список поиска использовался, чтобы найти ответ.

Примечание : ndots Значение молча ограничено 15 и это 5 в Кубернане как по умолчанию.

Обработка этого в производстве

Если ваше приложение оказывает природу, которая делает много внешних сетевых вызовов, DNS может стать узким местом в случае интенсивного трафика, поскольку много дополнительных запросов сделано до того, как реальный запрос DNS даже уволен. Вполне необычайно видеть приложения, добавляющие корневую зону в доменных именах, но это можно считать взлом. Итак, вместо использования api.twitter.com , вы можете жестко определить ваше приложение, чтобы включить api.twitter.com. Что будет заставить клиентов DNS сделать авторитетный поиск непосредственно на абсолютном домене.

В качестве альтернативы, так как K8S 1.14, dnsconfig и Dnspolicy Функциональные ворота стали стабильными. Так что при развертывании POD вы можете указать ndots Постановка на что-то меньшее, скажем 3 или если вы хотите быть действительно агрессивным, вы можете перевернуть его до 1 Отказ Последствия этого будут заключаться в том, что каждая внутренняя связь теперь должна включать полную домен. Это один из классических компромиссов, где вы должны выбрать между производительностью и переносимостью. Если приложение не требует супер низких задержек, я думаю, вам не нужно беспокоиться об этом, поскольку результаты DNS также кэшируются внутри.

Рекомендации

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

Вот несколько дополнительных ссылок, которые вы можете прочитать в Интернете:

Примечание : Я особенно не использую копать в этом посте. копать Видимо автоматически добавляет Отказ (идентификатор корневой зоны), чтобы сделать домен FQDN One без Даже сначала проходите через путь поиска. Я упомянул об этом кратко в одном из моих старше посты. Тем не менее, вполне удивительно, чтобы увидеть, что вам нужно дать флагу, чтобы сделать его вести себя в том, что кажется стандартным способом.

Это всегда DNS, не так ли;)

Плавник!

Первоначально опубликовано на моем блог

Оригинал: «https://dev.to/mrkaran/dns-lookups-in-kubernetes-5cm1»