使用Kubespray部署K8s时DNS服务器数量超限报错排查
我来帮你排查这个问题,之前在部署K8s集群时也碰到过类似的情况,咱们一步步梳理可能遗漏的配置点:
确认变量配置的正确层级
你提到在cluster.yml的-hosts节点下配置了docker_dns_servers_strict: no,但这个变量是全局生效的配置,应该放在all变量节点下,而非针对单个host的配置里。正确的配置位置有两种:- 在
cluster.yml中:all: vars: docker_dns_servers_strict: no - 或者直接编辑
group_vars/all/docker.yml文件,在里面添加docker_dns_servers_strict: no——这是Kubespray官方推荐的配置方式,因为这类Docker相关的全局变量通常放在这个文件里。
- 在
检查是否存在变量覆盖
Kubespray的变量有优先级顺序,如果你在其他配置文件(比如group_vars/k8s-cluster/k8s-cluster.yml,或者某个节点的host_vars文件)里设置了docker_dns_servers_strict: yes,会覆盖你之前的配置。可以用这条Ansible命令检查每个节点的实际变量值:ansible -i inventory/mycluster/inventory.ini all -m debug -a "var=docker_dns_servers_strict"如果输出结果不是
no,就说明有其他配置覆盖了你的设置。手动指定Docker DNS服务器(可选但推荐)
即使开启了docker_dns_servers_strict: no,Kubespray还是会只取前3个DNS服务器。如果你的节点系统默认的DNS服务器数量超过3个,建议直接指定Docker要使用的DNS,避免依赖系统配置。可以在上述配置文件中添加:docker_dns_servers: - 8.8.8.8 - 8.8.4.4 - 1.1.1.1这样Docker会直接使用你指定的这3个DNS服务器,从根源上避免“数量过多”的问题。
清理部署残留后重新执行
如果之前已经尝试过部署,节点上可能已经生成了Docker的配置文件(比如/etc/docker/daemon.json),旧的配置可能没有被更新。你可以在所有节点上执行以下操作:sudo rm -f /etc/docker/daemon.json sudo systemctl restart docker然后重新运行Kubespray的部署命令。
检查Kubespray版本兼容性
部分旧版本的Kubespray对docker_dns_servers_strict变量的支持可能有bug,比如变量名称错误或者逻辑问题。建议升级到较新的稳定版本(比如v2.22.x及以上),再尝试部署。
内容的提问来源于stack exchange,提问作者curiousengineer

