来自 Windows 个容器的外部互联网 DNS 解析失败

External internet DNS resolution failures from Windows containers

我有一个使用 k8s 的 ACS Windows 集群设置,通常 运行 很好。我已经部署了 ASP.NET 个核心 webapi 和辅助应用程序容器。这两个容器在本地运行良好,在 ACS 中通常也运行良好。我可以将它们横向扩展和收缩,部署新版本等。

它们正常工作,但在尝试访问外部互联网资源时突然开始生成 DNS 解析错误。我看到的例外情况包括:

System.Net.Http.WinHttpException: The server name or address could not be resolved

他们尝试访问的资源解析正常,然后突然停止解析。然后在一段不确定的时间(几分钟、20 分钟,甚至几个小时)之后,它们又开始消退,非常断断续续地清除。请注意,这些外部资源是 CosmosDB、Azure Queues 和名为 Loggly 的第 3 方日志记录服务(要点是它们都是大型网络资产,这里没有错)。另请注意,两个容器不一定同时丢失 DNS。

我试过在容器内打开一个命令shell:

kubectl exec -it {podname} -- powershell

然后使用 powershell 请求站点:

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

get-content test.txt

...它工作正常,我可以访问 google.com。所以我不知道如何调试它。 ACS 上的 k8s 是否存在可能在此处发挥作用的已知问题?

我已经将相同的容器部署到一个简单的 Server 2016 主机上,完全没有发现问题。所以它似乎围绕着 k8s 或 ACS 集群本身。我在不同的地区(使用不同的 k8s 版本)重建了 ACS 集群 4 或 5 次,看到完全相同的问题。

这对我来说是一个主要障碍。外部互联网访问显然是非常基本和核心的功能。没有它,我的 webapi 和 worker 应用程序就完全崩溃了。

虽然我怀疑 windows 容器网络代码有些奇怪(过去一直...有问题),但您可以设置一个小容器 运行 一个 dns 解析器并将其添加为kube-dns 配置映射中的上游服务器。如果问题与 kube-dns 连接到外部名称服务器有关,本地缓存可能会有所帮助。

另一种选择是对 IP 进行硬编码,或者使用 https://kubernetes.io/docs/concepts/services-networking/service/#services-without-selectors 中的服务 或者通过将主机文件与 HostsAliases 一起使用,如 https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/

中所述

希望对您有所帮助 - 间歇性的 DNS 问题有时会让您觉得自己快要疯了(我仍然认为根据我的经验,有一个未解决的案例是某个地方的硬件故障)。

我已经与 Microsoft 的 Windows DNS 团队进行了间接联系,并获得了针对此问题的临时修复。

将以下两个命令添加到出现问题的 pods 的 dockerfile 中:

Set-Service dnscache -StartupType disabled
Stop-Service dnscache

重新部署,你应该会有更好的运气。我现在 运行 已经 2 天了,零失败,而以前我会在几个小时内看到失败。由于缺少缓存,您可能会注意到 DNS 解析的延迟更高,但对我来说,这比完全失败要好得多。另请注意,这不是推荐的生产使用策略。