0

所以这一直有效。我在 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 不起作用。

真的不知道该怎么办...

4

3 回答 3

3

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

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

资源类型=“容器”

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

 

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

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

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

 

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

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

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

 

kube-dns pod 包含四个容器: 

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

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

resource.type="container"
resource.labels.cluster_name="<cluster-name>"
resource.labels.namespace_id="kube-system"
logName="projects/<project-id>/logs/dnsmasq"
"最大数量达到并发 DNS 查询”

 

如果禁用了集群的旧版 stackdriver 日志记录,请使用以下过滤器:

resource.type="k8s_container"
resource.labels.cluster_name="<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] 来验证这是否仅影响一个节点。如果是,您可以简单地重新创建受影响的节点。

于 2019-10-26T03:48:30.293 回答
1

看来我遇到了一个错误,导致 gke-metadata 服务器开始崩溃池(这反过来又阻止了 kube-dns 工作)。

使用以前的版本 (1.14.7-gke.10) 创建一个新池并迁移到它修复了所有问题。

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

谢谢你的建议。

于 2019-10-27T13:19:24.320 回答
0

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

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

于 2019-10-26T03:15:54.033 回答