【发布时间】:2017-10-17 05:31:00
【问题描述】:
我们在 AWS 的 CoreOS 上运行 kubernetes 1.5.7。我们的 kube-dns 镜像版本是
gcr.io/google_containers/kubedns-amd64:1.9 gcr.io/google_containers/kube-dnsmasq-amd64:1.4.1
我们传递给 dnsmasq 的参数是
--cache-size=1000
--no-resolv
--server=/in-addr.arpa/ip6.arpa/cluster.local/ec2.internal/127.0.0.1#10053
--server=169.254.169.253
--server=8.8.8.8
--log-facility=-
--log-async
--address=/com.cluster.local/com.svc.cluster.local/com.kube-system.svc.cluster.local/<ourdomain>.com.cluster.local/<ourdomain>.com.svc.cluster.local/<ourdomain>.com.kube-system.svc.cluster.local/com.ec2.internal/ec2.internal.kube-system.svc.cluster.local/ec2.internal.svc.cluster.local/ec2.internal.cluster.local/
我们在 20 个节点集群中每个节点运行 1 个 kube-dns pod。在过去的几个月里,我们一直在经历从 5 到 10 分钟不等的 DNS 故障,这导致我们的服务几乎无法使用,因为大多数名称查找的名称解析都失败了。在这些活动中,我们运行了 3 - 6 个 kube-dns pod。从那时起,我们已经将我们的 kube-dns pod 大幅过度配置为每个节点 1 个,并且没有看到任何长达 5 到 10 分钟的 DNS 故障事件。然而,现在我们仍然看到较小的 DNS 故障事件,范围从 1 到 30 秒。在调查这些问题的过程中,我们在日志中注意到来自 dnsmasq-metrics 容器的以下错误
错误:在 flag.Parse 之前记录:W0517 03:19:50.139060 1 server.go:53] 从 dnsmasq 获取指标时出错:读取 udp 127.0.0.1:36181->127.0.0.1:53:i/o 超时
当我们有一个持续 1 到 30 秒的较小 DNS 事件时,我们会从 kube-dns pod 中找到这些日志。有一段时间,我们怀疑我们遇到了 iptables/conntrack 问题,原因是 pod 访问了 kube-dns 服务。但基于这些与 dnsmasq 相关的错误,我们认为 dnsmasq 在一段时间内拒绝连接,导致我们遇到的 DNS 故障。对于不熟悉 dnsmasq-metrics 容器的人,它正在对同一 pod 中的 dnsmasq 容器执行 DNS 查找以获取 dnsmasq 统计信息。如果无法通过 DNS 查找检索 dnsmasq 统计信息,那么认为执行 DNS 查找的服务可能会遇到同样的问题似乎是合乎逻辑的。
值得注意的是,在这些问题中,我们没有看到来自 dnsmasq 的以下日志,这让我相信我们没有达到这个阈值。
dnsmasq:达到最大并发 DNS 查询数(最大值:150)
我确信我们当前的 DNS 错误与 dnsmasq 间歇性拒绝连接有关。我很好奇其他用户是否看到 kube-dns pod 从 dnsmasq-metrics 记录错误并且在同一时间范围内从集群中的应用程序记录 DNS 错误的相同问题。
此外,如果有人对下一步做什么有任何想法,以找出 dnsmasq 拒绝连接时到底发生了什么。我正在考虑在调试模式下运行 dnsmasq 是否有用,但也担心会引入与在调试模式下运行相关的其他问题。我们正在考虑的其他选项正在慢慢推出 CoreDNS (https://github.com/coredns/coredns)。
【问题讨论】:
-
您是否测试过与上游 dns 服务器的连接是否丢失或超时?可能会达到来自 dnsmasq 的 DNS 查询限制,因为所有这些请求都在等待来自上游服务器的答复。
-
@LukasEichler - 我们偶尔会从 kube-dns 与 AWS vpc 名称服务器通信中得到错误。但是,我们的配置中有多个名称服务器,我们无法解析的名称不会由 kube-dns 容器处理。此外,当我们达到连接限制但没有记录任何内容时,我希望从 dnsmasq 获取日志消息。我们将限制降低到 1,并验证它会在达到此限制时记录。我很想知道这并不总是有效,我们应该将我们的限制从 150 提高到 300 或其他东西:)
标签: kubernetes