Kubernetes Kube dns-间歇性名称解析错误

Kubernetes Kube dns-间歇性名称解析错误,kubernetes,Kubernetes,我们正在AWS的CoreOS上运行kubernetes 1.5.7。我们的kube dns映像版本是 gcr.io/google_containers/kubedns-amd64:1.9 gcr.io/google_容器/kube-dnsmasq-amd64:1.4.1 我们传递给dnsmasq的参数是 --cache-size=1000 --no-resolv --server=/in-addr.arpa/ip6.arpa/cluster.local/ec2.internal/12

我们正在AWS的CoreOS上运行kubernetes 1.5.7。我们的kube dns映像版本是

gcr.io/google_containers/kubedns-amd64:1.9 gcr.io/google_容器/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/
--缓存大小=1000
--无决议
--server=/in addr.arpa/ip6.arpa/cluster.local/ec2.internal/127.0.0.1#10053
--服务器=169.254.169.253
--服务器=8.8.8.8
--伐木设施=-
--日志异步
--地址=/com.cluster.local/com.svc.cluster.local/com.kube system.svc.cluster.local/.com.svc.cluster.local/.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。在过去的几个月里,我们一直在经历DNS故障,从一个5-10分钟的事件,使我们的服务几乎无法使用,因为名称解析是失败的大多数名称查找。在这些活动中,我们运行了3-6个kube dns吊舱。从那时起,我们已经将我们的kube dns吊舱大幅过度配置为每个节点1个,并且没有看到任何5-10分钟的长dns故障事件。然而,现在我们仍然看到较小的DNS故障事件,范围为1-30秒。在调查这些问题的过程中,我们在日志中注意到来自dnsmasq度量容器的以下错误

错误:在标记之前记录。解析:W0517 03:19:50.139060 1服务器。转到:53]从dnsmasq获取度量时出错:读取udp 127.0.0.1:36181->127.0.0.1:53:i/o超时

当我们有一个较小的DNS事件持续1-30秒时,我们会从kube DNS吊舱中找到这些日志。有一段时间,我们怀疑我们遇到了一个iptables/conntrack问题,无法连接到命中kube dns服务的吊舱。但基于这些与dnsmasq相关的错误,我们认为dnsmasq在一段时间内拒绝连接,导致了我们所经历的DNS故障。对于不熟悉dnsmasq metrics容器的人,它正在同一个pod中对dnsmasq容器执行DNS查找,以获取dnsmasq统计数据。如果无法通过DNS查找检索dnsmasq统计数据,那么认为执行DNS查找的服务可能会遇到相同的问题似乎是合乎逻辑的

值得注意的是,在这些问题中,我们没有看到来自dnsmasq的以下日志,这使我相信我们没有达到这个阈值

dnsmasq:已达到最大并发DNS查询数(最大:150)

我非常确信,我们当前的DNS错误与dnsmasq间歇性拒绝连接有关。我很好奇,如果其他用户看到kube dns pod记录来自dnsmasq度量的错误,并且在同一时间段内,从集群中的应用程序记录dns错误,是否也会出现同样的问题


此外,如果任何人对下一步要做什么有任何想法,以了解到底发生了什么,请使用dnsmasq拒绝连接。我正在考虑在调试模式下运行dnsmasq是否有用,但也担心这会带来与在调试模式下运行相关的其他问题。我们正在考虑的其他选择是慢慢推出CoreDNS()。

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

--address=/com.cluster.local/com.svc.cluster.local/com.cluster.local/.com.cluster.local/.com.svc.cluster.local/.com.kube-system.svc.cluster.local/com.ec2.internal/ec2.kube-system.svc.cluster.local/ec2.internal.svc.cluster.local/ec2.internal.cluster.local/

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


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

您是否测试了您是否正在断开与上游dns服务器的连接或从上游dns服务器超时?dnsmasq的DNS查询限制可能已达到,因为所有这些请求都在等待上游服务器的答复。@LukasEichler-kube DNS与AWS vpc名称服务器的对话中偶尔会出现错误。但是,我们的配置中有多个名称服务器,无法解析的名称不会由kube dns容器处理。此外,当我们达到连接限制但没有任何记录时,我希望从dnsmasq获得日志消息。我们将限制降低到1,并验证当达到此限制时它将记录。我很想知道,这并不总是有效的,我们应该将我们的限制从150提高到300左右:)我们只有1个本地群集域,即cluster.local。dnsmasq--address标志用于对不存在的名称进行短路查找。您可以查看容器中的
/etc/resolv.conf
吗?很抱歉,在写我的评论时被切断了。我们只有1个本地群集域,即cluster.local。dnsmasq--address标志用于短路查找不存在的名称。从dnsmasq手册页中,
——address=/example.com/相当于--server=/example.com/,并返回example.com的NXDOMAIN及其所有子域。
因此,以com.cluster.local结尾的名称将立即获得NXDOMAIN,而不是从dnsmasq转发到kube dns。此设置将消耗更少的资源并提供更快的查找,因为伪名称不会传递给kube dns。
kubectl-名称空间kube system exec-it zipkin-538100312-3hb17 cat/etc/resolv.conf search kube-system.svc.cluster.local svc.cluster.local ec2.internal nameserver 172.16.0.10选项ndots:5