Внешние сбои разрешения DNS в Интернете из контейнеров Windows

У меня есть установка кластера Windows ACS с использованием k8s, которая в целом работает хорошо. Я развернул ASP.NET Core webapi и контейнеры рабочих приложений. Эти два контейнера отлично работают как локально, так и в целом в ACS. Я могу масштабировать их и обратно, развертывать новые версии и т. д.

Они функциональны и работают, но затем внезапно начинают генерировать ошибки разрешения DNS при попытке доступа к внешним интернет-ресурсам. Я вижу исключения, которые включают:

System.Net.Http.WinHttpException: имя или адрес сервера не могут быть разрешены

Ресурсы, к которым они пытаются получить доступ, прекрасно разрешаются, а затем внезапно перестают разрешаться. Затем через какое-то неопределенное время (несколько минут, 20 минут или даже, кажется, несколько часов) они снова начинают разрешаться, довольно прерывисто. Обратите внимание, что этими внешними ресурсами являются CosmosDB, Azure Queues и сторонняя служба ведения журналов под названием Loggly (точка в том, что все они являются крупными веб-ресурсами и не виноваты здесь). Также обратите внимание, что два контейнера не обязательно теряют DNS одновременно.

Я попытался открыть командную оболочку внутри контейнера:

kubectl exec -it {podname} -- powershell

А затем с помощью powershell запросить сайт:

invoke-webrequest -uri www.google.com -outfile test.txt

получить-контент test.txt

... и он работает нормально, я могу получить доступ к google.com. Поэтому я понятия не имею, как это отладить. Существуют ли известные проблемы с k8s в ACS, которые могут быть здесь задействованы?

Я развернул те же контейнеры на простом хосте Server 2016 и вообще не вижу проблемы. Таким образом, кажется, что это связано либо с k8s, либо с самим кластером ACS. Я перестраивал кластер ACS 4 или 5 раз в разных регионах (которые используют разные версии k8s) и вижу точно такую ​​же проблему.

Для меня это главный блокатор. Внешний доступ в Интернет, очевидно, является очень базовой и основной функциональностью. Мой webapi и рабочее приложение полностью сломаны без него.


person BrettRobi    schedule 20.09.2017    source источник


Ответы (2)


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

Другим вариантом может быть жесткое кодирование IP-адресов либо с помощью службы, как в https://kubernetes.io/docs/concepts/services-networking/service/#services-without-selectors или с помощью файла hosts с HostsAliases, как описано в https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/

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

person p_l    schedule 01.10.2017
comment
Полностью ценю предложения. Я определенно не собираюсь жестко кодировать какие-либо IP-адреса (безумие!), И, честно говоря, я также не собираюсь размещать DNS самостоятельно. Оба кажутся мне пластырем гораздо более серьезной проблемы (и снова я ценю ваш вклад!). Откровенно говоря, мне нужно, чтобы ребята из ACS или Windows Container пришли и помогли, иначе я боюсь, что ACS может быть слишком зарождающейся для меня. - person BrettRobi; 09.10.2017

У меня был непрямой контакт с командой Windows DNS в Microsoft, и мне предложили временное решение этой проблемы.

Добавьте приведенные ниже две команды в файл докеров всех модулей, в которых возникла проблема:

Set-Service dnscache -StartupType disabled
Stop-Service dnscache

Перераспределите, и вам должно повезти. Я работаю уже 2 дня и не видел никаких сбоев, тогда как раньше я видел сбои в течение нескольких часов. Вы можете заметить более высокую задержку при разрешении DNS из-за отсутствия кэширования, но для меня это НАМНОГО лучше, чем явные сбои. Также обратите внимание, что это НЕ рекомендуемая стратегия для производственного использования.

person BrettRobi    schedule 01.11.2017
comment
Я сталкиваюсь с той же проблемой в контейнерах Linux ACS, где имена хостов, такие как bitbucket.com, периодически не разрешаются. - person Nicolas Mommaerts; 08.05.2018