我有一个 Azure Kubernetes 集群,其中所有 Pod 和服务都处于运行状态。我遇到的问题是,当我从 pod1 到 pod2 的服务 url 进行 curl 时,它会间歇性失败,并出现“无法解析主机”错误。
为了说明这一点,我有 3 个 pod - pod1、pod2、pod3 当我使用
进入 pod1 时kubectl exec -it pod1
我使用 pod2 的服务 url 运行curl:
该命令大约每 6/10 次成功,其余 4/10 次失败,并出现错误“curl: (6) 无法解析主机:api-batchprocessing
”。
当我尝试使用curl调用在pod3上运行的另一个服务时,我遇到了同样的问题。
我尝试过以下方法但没有成功: - 删除 kube 系统中的 coredns pod - 删除并重新创建 azure kubernetes 集群。 上面似乎暂时解决了这个问题,但在几次尝试中我遇到了同样的间歇性“无法解析主机:”问题。
有关此问题的任何帮助/指示将不胜感激。
最佳答案
问题可能出在 DNS配置。 看起来 coredns 使用 DNS 服务器列表的方式与 kube-dns 不同。 如果您必须解析公共(public)和私有(private)主机名,请始终检查列表中是否只有私有(private) DNS 服务器,或者找到正确的配置来针对您的私有(private)场所路由私有(private) DNS 查询。
查找并解决问题的可能步骤:
- 打开 coredns 日志。
你唯一需要的是这个YAML文件:
apiVersion: v1
data:
log.override: |
log
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
name: coredns-custom
namespace: kube-system
使用 kubectl log 或 VSCode Kubernetes 扩展打开/查看您的 coredns 日志。
附加到我们的环境 Pod 之一并执行一些 DNS 解析操作,包括 nslookup 和 curl。 一些循环查询对 DNS 和网络组件施加压力的执行:
查看 coredns 日志。
您之前会看到,curl 正在尝试通过尝试 A 和 AAAA 条目来解析我们 pod 中定义的所有搜索域的 DNS。换句话说,为了解析“api-batchprocessing”,curl 正在对 coredns 进行 DNS 查询。然而,coredns 正确响应“NXDOMAIN”(不存在)或“NOERROR”(找到记录)。所以问题出在其他地方。
- 在 VNET 级别配置 DNS 服务器
对此随机 DNS 解析错误的可能解释是,在高负载情况下,coredns 正在 VNET 级别定义的所有 DNS 服务器上使用。 一些查询可能会发送到本地服务器。其他人,到谷歌。 Google 不知道如何解析您的私有(private)主机名。
- 从 VNET 中删除 Google DNS 服务器,重新启动集群并运行检查。
在这里您可以找到更多信息:random-dns-error .
希望对您有所帮助。
关于kubernetes - 间歇性 Pod 通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130676/