【问题标题】:Kube-dns - Intermittent name resolution errorsKube-dns - 间歇性名称解析错误
【发布时间】: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


【解决方案1】:

您提供了很多集群域。每个集群域都会被插入到本地的/etc/resolv.conf 中并被使用。对于resolv.conf 中的每个域,都会有单独的 dns 请求。在您的情况下,每个 dns 查询都会有 10+ 个 dns 查询。

--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/

我的建议是将集群域的数量减少到仅cluster.local

您提供多个集群域的原因是什么?

【讨论】:

  • 我们只有 1 个本地集群域,即 cluster.local。 dnsmasq --address 标志用于短路查找不存在的名称。
  • 你能看一下容器内的/etc/resolv.conf吗?
  • 抱歉在写我的评论时被打断了。我们只有 1 个本地集群域,即 cluster.local。 dnsmasq --address 标志用于短路查找不存在的名称。来自 dnsmasq 手册页 --address=/example.com/ is equivalent to --server=/example.com/ and returns NXDOMAIN for example.com and all its subdomains. 因此,以 com.cluster.local 结尾的名称将立即获得 NXDOMAIN,而不是从 dnsmasq 转发到 kube-dns。此设置将消耗更少的资源并提供更快的查找,因为虚假名称不会传递给 kube-dns。
  • kubectl --namespace kube-system exec -it zipkin-538100312-3hb17 cat /etc/resolv.conf search kube-system.svc.cluster.local svc.cluster.local cluster.local ec2.internal nameserver 172.16.0.10 options ndots:5
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2015-10-18
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多