Kubernetes DNS 间歇性失败,kube-dns 服务和 CoreDNS pod 似乎正常

标签 kubernetes kube-dns coredns

我们有一个由 kops 管理的 1 个主节点和 3 个节点的 Kubernetes 集群,用于我们的应用程序部署。我们有最少的 pod 到 pod 连接,但喜欢 Kubernetes 中的自动缩放功能。过去几个月我们一直在使用它,但最近开始出现问题,我们的 pod 随机无法连接到我们的 redis 或数据库,错误如下:

Set state pending error: dial tcp: lookup redis.id.0001.use1.cache.amazonaws.com on 100.64.0.10:53: read udp 100.126.88.186:35730->100.64.0.10:53: i/o timeout

或者
OperationalError: (psycopg2.OperationalError) could not translate host name “postgres.id.us-east-1.rds.amazonaws.com” to address: Temporary failure in name resolution

奇怪的是这只会在某些时候发生,然后当一个 pod 被重新创建时,它会再次工作,不久之后它就会被绊倒。

我们尝试遵循 Kube 的所有 kube-dns 调试说明但无济于事,尝试了无数解决方案,例如更改 ndots 配置,甚至尝试迁移到 CoreDNS,但仍然存在完全相同的间歇性问题。我们使用 Calico 进行网络连接,但很难说它是否发生在网络级别,因为我们没有看到任何其他服务的问题。

有没有人知道在哪里可以找到可能导致这种行为的原因,或者如果您在自己之前经历过这种行为,请分享您是如何解决它的?

谢谢

CoreDNS 的 pods 看起来不错
⇒  kubectl get pods --namespace=kube-system
NAME                                                    READY     STATUS    RESTARTS   AGE
...
coredns-784bfc9fbd-xwq4x                                1/1       Running   0          3h
coredns-784bfc9fbd-zpxhg                                1/1       Running   0          3h
...

我们已经启用了 CoreDNS 的日志记录,并看到了实际通过的请求:
⇒  kubectl logs coredns-784bfc9fbd-xwq4x --namespace=kube-system
.:53
2019-04-09T00:26:03.363Z [INFO] CoreDNS-1.2.6
2019-04-09T00:26:03.364Z [INFO] linux/amd64, go1.11.2, 756749c
CoreDNS-1.2.6
linux/amd64, go1.11.2, 756749c
 [INFO] plugin/reload: Running configuration MD5 = 7f2aea8cc82e8ebb0a62ee83a9771ab8
[INFO] Reloading
 [INFO] plugin/reload: Running configuration MD5 = 73a93c15a3b7843ba101ff3f54ad8327
[INFO] Reloading complete
...
2019-04-09T02:41:08.412Z [INFO] 100.126.88.129:34958 - 18745 "AAAA IN sqs.us-east-1.amazonaws.com.cluster.local. udp 59 false 512" NXDOMAIN qr,aa,rd,ra 152 0.000182646s
2019-04-09T02:41:08.412Z [INFO] 100.126.88.129:51735 - 62992 "A IN sqs.us-east-1.amazonaws.com.cluster.local. udp 59 false 512" NXDOMAIN qr,aa,rd,ra 152 0.000203112s
2019-04-09T02:41:13.414Z [INFO] 100.126.88.129:33525 - 52399 "A IN sqs.us-east-1.amazonaws.com.ec2.internal. udp 58 false 512" NXDOMAIN qr,rd,ra 58 0.001017774s
2019-04-09T02:41:18.414Z [INFO] 100.126.88.129:44066 - 47308 "A IN sqs.us-east-1.amazonaws.com. udp 45 false 512" NOERROR qr,rd,ra 140 0.000983118s
...

服务和端点看起来没问题
⇒  kubectl get svc --namespace=kube-system
NAME                                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kube-dns                                             ClusterIP   100.64.0.10      <none>        53/UDP,53/TCP   63d
...

⇒  kubectl get ep kube-dns --namespace=kube-system
NAME       ENDPOINTS                                                          AGE
kube-dns   100.105.44.88:53,100.127.167.160:53,100.105.44.88:53 + 1 more...   63d
...

最佳答案

我们也遇到了这个问题,但问题是查询超时。

测试后最好的方法是在所有节点和所有 POD 上运行 dns 引用它们自己的节点 DNS。它将节省到其他节点 pod 的往返行程,因为您可能会为 DNS 运行多个 pod,但 dns 服务将以某种方式分配流量,并且 POD 最终将在节点之间拥有更多的网络流量。不确定是否可以在亚马逊 eks 上使用。

关于Kubernetes DNS 间歇性失败,kube-dns 服务和 CoreDNS pod 似乎正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584935/

相关文章:

docker - 在注册表/kubernetes 中更新时强制刷新 docker 镜像

redis - Kubernetes集群中如何连接redis-ha集群?

linux - 错误 CoreDNS 所需的最低内核版本为 4.14.35 (UEKR5)

Kubernetes:CoreDNS 和解析主机名的问题

docker - 无法在 Kubernetes 部署中查询 Kafka

go - 如何从我的 Controller 文件向本地 Kubernetes 部署的服务提供静态文件?

Kubernetes,自动服务回退到另一个命名空间

node.js - Kubernetes LoadBalancer 服务返回空响应

azure - 从其他虚拟机检查 kubernetes pod 名称