验证您的 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 缓存以提高性能,
sidecar
dnsmasq
在执行双重健康检查(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] 来验证这是否仅影响一个节点。如果是,您可以简单地重新创建受影响的节点。