0

我有一个使用 k8s 的 ACS Windows 集群设置,通常运行良好。我已经部署了 ASP.NET Core webapi 和工作应用程序容器。这两个容器在本地运行良好,通常在 ACS 中也能正常运行。我可以扩展它们,部署新版本等。

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

System.Net.Http.WinHttpException:无法解析服务器名称或地址

他们试图访问的资源可以正常解析,然后突然停止解析。然后在一段不确定的时间后(几分钟、20 分钟,甚至似乎是几个小时),它们又开始消退,明显断断续续。请注意,这些外部资源是 CosmosDB、Azure 队列和名为 Loggly 的第 3 方日志服务(重点是它们都是大型 Web 属性,在这里没有错)。另请注意,两个容器不一定会同时丢失 DNS。

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

kubectl exec -it {podname} -- powershell

然后使用 powershell 请求一个站点:

调用-webrequest -uri www.google.com -outfile test.txt

获取内容 test.txt

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

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

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

4

2 回答 2

0

虽然我怀疑 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 问题有时会让您感觉自己快要发疯了(我仍然认为,根据我的经验,一个未解决的案例是某个地方的硬件损坏)。

于 2017-10-01T08:02:00.030 回答
0

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

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

Set-Service dnscache -StartupType disabled
Stop-Service dnscache

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

于 2017-11-01T21:10:38.107 回答