Nameserver limits exceeded" err="Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 114.114.114.114 114.114.114.114 114.114.114.114

what 发表于: 2023-11-14   最后更新时间: 2023-11-14 14:34:08   1,036 游览

我查看日志,发现一直在刷一下错误:

Nov 14 11:07:31 node02 kubelet[1543]: E1114 11:07:31.956476    1543 dns.go:157] "Nameserver limits exceeded" err="Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 114.114.114.114 114.114.114.114 114.114.114.114"

我是Ubuntu 22.04.3 LTS。

cat /run/systemd/resolve/resolv.conf | grep -v '#'

nameserver 114.114.114.114
nameserver 114.114.114.114
nameserver 114.114.114.114
nameserver 114.114.114.114
search .

我应该怎么解决?

发表于 2023-11-14

也可能是网卡配置多个了

sudo cat /etc/netplan/01-netcfg.yaml

将nameservers设置成[]

ens192:
  addresses:
  - 10.233.164.101/24
  nameservers:
    addresses: []

重启路由

sudo netplan apply

简单的说,就是/etc/resolv.conf中有太多的条目,默认最大是3个。

代码kubernetes/pkg/apis/core/validation /validation.go

const (
    // Limits on various DNS parameters. These are derived from
    // restrictions in Linux libc name resolution handling.
    // Max number of DNS name servers.
    MaxDNSNameservers = 3
    // Max number of domains in search path.
    MaxDNSSearchPaths = 6
    // Max number of characters in search path.
    MaxDNSSearchListChars = 256
)

这是一个已知的问题

有些 Linux 发行版本(比如 Ubuntu)默认使用一个本地的 DNS 解析器(systemd-resolved)。systemd-resolved 会用一个存根文件(Stub File)来覆盖 /etc/resolv.conf 内容,从而可能在上游服务器中解析域名产生转发环(forwarding loop)。 这个问题可以通过手动指定 kubelet 的 --resolv-conf 标志为正确的 resolv.conf(如果是 systemd-resolved,则这个文件路径为 /run/systemd/resolve/resolv.conf)来解决。kubeadm 会自动检测 systemd-resolved 并对应的更改 kubelet 的命令行标志。

Kubernetes 的安装并不会默认配置节点的 resolv.conf 文件来使用集群的 DNS 服务,因为这个配置对于不同的发行版本是不一样的。这个问题应该迟早会被解决的。

Linux 的 libc(又名 glibc)默认将 DNS nameserver 记录限制为 3,而 Kubernetes 需要使用 1 条 nameserver 记录。这意味着如果本地的安装已经使用了 3 个 nameserver,那么其中有些条目将会丢失。要解决此限制,节点可以运行 dnsmasq,以提供更多 nameserver 条目。可以使用 kubelet 的 --resolv-conf 标志来解决这个问题。

而且,/run/systemd/resolve/resolv.conf将在每次k8s重启后自动重新创建。

所以。你可以通过--resolv-conf指定/etc/resolv.conf,例如,在/var/lib/kubelet/kubeadm-flags.env中追加:

KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --resolv-conf=/etc/resolv.conf"

然后重启:

systemctl restart kubelet

错误就不见了。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题