GKE集群内DNS解析停止工作

时间:2019-10-25 20:21:20

标签: kubernetes google-cloud-platform dns google-kubernetes-engine gke-networking

因此,它一直在起作用。我在GKE中运行了一些简单的服务,它们通过标准service.namespace DNS名称相互引用。

今天,所有DNS名称解析均停止工作。我没有做任何更改,尽管这可能是由主升级触发的。

/ambassador # nslookup ambassador-monitor.default
nslookup: can't resolve '(null)': Name does not resolve

nslookup: can't resolve 'ambassador-monitor.default': Try again


/ambassador # cat /etc/resolv.conf  
search default.svc.cluster.local svc.cluster.local cluster.local c.snowcloud-01.internal google.internal 
nameserver 10.207.0.10 
options ndots:5

主版本1.14.7-gke.14

我可以使用他们的IP地址来谈论跨服务,只是DNS无法正常工作。

不太确定要怎么做...

3 个答案:

答案 0 :(得分:1)

验证Kube DNS是否存在问题的最简单方法是查看日志StackDriver [https://cloud.google.com/logging/docs/view/overview]。

您应该能够使用以下过滤器在Pod的日志中找到DNS解析失败:

resource.type =“ container”

(“ UnknownHost”或“查找失败”或“ gaierror”)

确保检查每个容器的日志。因为容器的确切名称和数量可以随GKE版本而变化,所以可以这样找到它们:

kubectl get pod -n kube-system -l k8s-app = kube-dns -o \

jsonpath ='{range .items [*]。spec.containers [*]} {。name} {“ \ n”} {end}'| |排序-u kubectl获取容器-n kube-system -l k8s-app = kube-dns

吊舱是否经常重启?在节点控制台中查找OOM。每个pod的节点可以这样找到:

kubectl get pod -n kube-system -l k8s-app = kube-dns -o \

jsonpath ='{range .items [*]} {。spec.nodeName} pod = {。metadata.name} {“ \ n”} {end}'

kube-dns窗格包含四个容器:

  • kube-dns进程监视Kubernetes主服务器的服务和端点更改,并维护内存中查找结构以服务DNS请求,
  • dnsmasq添加了DNS缓存以提高性能,
  • sidecar在执行双重健康检查时(针对dnsmasqkubedns)提供单个健康检查端点。它还收集dnsmasq指标,并以Prometheus格式公开它们,
  • prometheus-to-sd刮除sidecar公开的指标并将其发送到Stackdriver。

默认情况下,dnsmasq容器接受150个并发请求。超出此范围的请求将被简单丢弃,并导致DNS解析失败,包括metadata的解析。要对此进行检查,请使用以下过滤器查看日志:

resource.type =“ container”
resource.labels.cluster_name =“
resource.labels.namespace_id =“ kube-system”
logName =“ projects / / logs / dnsmasq“
”已达到并发DNS查询的最大数量“

如果禁用了群集的旧式堆栈驱动程序日志记录,请使用以下过滤器:

resource.type =“ k8s_container”
resource.labels.cluster_name =“ <集群名称>”
resource.labels.namespace_name =“ kube-system”
resource.labels。 container_name =“ dnsmasq”
“已达到并发DNS查询的最大数量”

如果禁用了Stackdriver日志记录,请执行以下操作:

kubectl日志--tail = 1000 --namespace = kube-system -l k8s-app = kube-dns -c dnsmasq | grep'达到并发DNS查询的最大数量'

此外,您可以尝试从每个节点使用命令[dig ambassador-monitor.default @ 10.207.0.10]来验证这是否仅影响一个节点。如果是这样,您可以简单地重新创建受影响的节点。

答案 1 :(得分:0)

首先调试您的kubernetes服务[1]。这将告诉您是k8s资源问题还是kubernetes本身出现故障。了解这一点后,您可以继续进行修复。如果您想跟进,可以在这里发布结果。

[1] https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/

答案 2 :(得分:0)

看来我碰到了一个导致gke-元数据服务器启动崩溃池的错误(这反过来又使kube-dns无法工作)。

使用先前的版本(1.14.7-gke.10)创建一个新池并将其迁移到该池中,可以解决所有问题。

我被告知已经提交了修复程序。

谢谢您的建议。

相关问题