我遇到了一个问题,外部域的 DNS 条目损坏了。当时问题的性质尚不清楚。
当条目损坏时,该域从 Google Kubernetes Engine 中的 kubernetes 集群 pod 中被查询。从集群查询该域时,问题仍然存在(事件发生在 2 个月前)。
集群 DNS 解析器使用 metadata.google.internal 进行 DNS 解析,从集群中使用 dig 执行这些查询将:
dig problematic.external.domain @169.254.169.254
# does not resolve and takes over 2 seconds
dig problematic.external.domain @1.1.1.1
# resolves correctly under 200ms
在同一项目和区域中创建新虚拟机可正确解析有问题的域。这只会影响活动集群元数据服务器 DNS 解析器。
有没有办法清除 DNS 缓存或有其他建议?
一般来说,我试图避免编辑集群内的 DNS 设置,而希望采用其他方式来修复它。
编辑更多信息:
NodeLocal DNSCache
已在集群中处于活动状态并引用该文档https://cloud.google.com/kubernetes-engine/docs/how-to/nodelocal-dns-cache问题在于元数据 DNS 服务器。以下摘自优点列表:
DNS queries for external URLs (URLs that don't refer to cluster resources) are forwarded directly to the local Cloud DNS metadata server, bypassing kube-dns.
哪个是 ip 169.254.169.254
答案1
虽然没有特定的方法来刷新 Cloud DNS 的元数据服务器,但每个查询仍然有 TTL,并且大多数 GCE DNS 都尊重这一点,它会在一定时间后过期并且缓存无效。
尽管如此,如果问题出在缓存上,则应该通过使用kubectl cordon $NODENAME
命令封锁 GKE 节点来解决问题。
此外,你可以通过指定存根 DNS 配置来绕过 GCE DNS。查看此链接了解详情。
答案2
NodeLocal DNS 缓存插件可以帮助解决您提到的域,因为它将外部 URL 的 DNS 查询直接转发到本地云 DNS 元数据服务器,绕过 kube-dns,并且由于您的 Compute Engine VM 可以解析提到的 DNS(使用本地云 DNS),所以您的集群也可以这样做。
參閱本文档有关如何在 GKE 集群上配置 NodeLocal DNSCache 的详细说明。