Первоначально опубликовано на моем блог
Одним из основных преимуществ развертывания рабочих нагрузок в 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 встреча К которому я пошел, в прошлые выходные, где люди упомянули о необходимости иметь дело с этим.
Вот несколько дополнительных ссылок, которые вы можете прочитать в Интернете:
- Объяснить Почему в Кубернетах
- Отлично прочитайте, как NDOT влияет на производительность приложений
- несоответствия Musl и Glibc Resolver
Примечание : Я особенно не использую копать
в этом посте. копать
Видимо автоматически добавляет Отказ
(идентификатор корневой зоны), чтобы сделать домен FQDN One без Даже сначала проходите через путь поиска. Я упомянул об этом кратко в одном из моих старше посты. Тем не менее, вполне удивительно, чтобы увидеть, что вам нужно дать флагу, чтобы сделать его вести себя в том, что кажется стандартным способом.
Это всегда DNS, не так ли;)
Плавник!
Первоначально опубликовано на моем блог
Оригинал: «https://dev.to/mrkaran/dns-lookups-in-kubernetes-5cm1»