DNS
此页面上列出的命令/步骤可用于检查集群中的名称解析问题。
确保您配置了正确的 kubeconfig(例如,使用 Rancher 高可用时,export KUBECONFIG=$PWD/kube_config_rancher-cluster.yml
) 或者通过 Rancher UI 使用内嵌 kubectl。
在运行 DNS 检查之前,请检查您集群中的默认 DNS 插件,并确保网络运行正常,因为这也可能是 DNS 解析失败的原因之一。
#
检查 DNS Pod 是否正在运行使用 CoreDNS 时的输出示例:
使用 Kube-dns 时的输出示例:
#
检查 DNS 服务是否存在正确的 cluster-ip#
检查是否能解析域名检查内部集群名称是否正在解析(在此示例中为 kubernetes.default
),在 server:
后面显示的 IP 应该与来自kube-dns
服务的CLUSTER-IP
相同。
输出示例:
检查外部名称是否解析(在此示例中为www.google.com
)
输出示例:
如果要检查所有主机上的域名解析,请执行以下步骤:
将以下文件另存为
ds-dnstest.yml
使用 kubectl 创建
kubectl create -f ds-dnstest.yml
等待启动,直到
kubectl rollout status ds/dnstest -w
返回:daemon set "dnstest" successfully rolled out
.将环境变量 DOMAIN 配置为主机应能够解析的标准域名(FQDN)(以 www.google.com 为例),并运行以下命令,让每个主机上的每个容器配置需要解析的的域名(这是一个单行命令)。
该命令运行完毕后,指示运行正常的输出为:
如果您在输出中看到错误,则表明所提到的主机无法解析给定的 FQDN。
IP 209.97.182.150 主机的 UDP 端口被阻止的情况的示例错误输出。
清理删除 alpine DaemonSet kubectl delete ds/dnstest
.
#
CoreDNS 的特别检查#
检查 CoreDNS 日志记录#
检查配置CoreDNS 配置存储在kube-system
命名空间中名称是coredns
的 configmap 中;
#
检查 resolv.conf 中的 nameserver 配置默认情况下,主机上的 nameserver 配置(在/etc/resolv.conf 中)将用作 CoreDNS 的 nameserver 配置。您可以在主机上检查该文件,或者将 dnsPolicy 设置为 Default 来运行以下 Pod,这将从其运行的主机继承/etc/resolv.conf。
#
启用查询日志记录可以通过在 configmapcoredns
的 Corefile 配置中启用日志插件来启用查询日志记录。您可以使用kubectl -n kube-system edit configmap coredns
或使用以下命令替换现有配置:
现在可以查询所有记录,并可以使用命令进行检查。
#
kube-dns 的特别检查#
检查 kubedns 容器中的 nameservers 配置默认情况下,主机上在/etc/resolv.conf 中配置的 nameserver 将用作 kube-dns 的 servername。有时主机会运行本地缓存 DNS 名称服务器,这意味着/etc/resolv.conf
中的地址将指向容器无法访问的环回范围(127.0.0.0/8
)中的地址。对于 Ubuntu 18.04,这是通过systemd-resolved
完成的。从 Rancher v2.0.7 开始,我们将检测systemd-resolved
是否正在运行,并将自动将/etc/resolv.conf
文件用于正确的 nameserver(位于/run/systemd/resolve/resolv.conf
)。
使用以下命令来检查 kubedns 容器使用的 nameserver:
输出示例:
如果输出显示的是环回范围的地址(127.0.0.0/8
),则可以通过两种方式更正此地址:
- 确保集群中节点上的
/etc/resolv.conf
中列出了正确的名称服务器,请参阅操作系统文档以了解如何执行此操作。确保在配置集群之前执行此操作,或者在进行修改后重新启动节点。 - 如下所示,通过添加
extra_args
,将kubelet
配置为使用其他文件来解析名称(其中/run /resolvconf/resolv.conf
是具有正确 nameserver 配置的文件):
注意: 由于 kubelet 在容器中运行,因此/etc 和/usr 中的文件的路径位于 kubelet 容器中的/host/etc 和/host/usr 中。
查看集群 YAML可以看到如何更改这个配置。集群的配置完成后,您必须删除 kube-dns pod 才能使用 pod 中的新设置:
尝试再次解析 domain,检查是否能解析域名.
如果要检查集群中的 kube-dns 配置(例如,检查是否配置了其他 nameserver),则可以运行以下命令列出 kube-dns 配置:
示例输出: