主题
内网静态 DNS 解析方案:libvirt dnsmasq 集中下发(ai-ear.cn → 集群节点)
- 日期:2026-07-30
- 场景:libvirt NAT 网络(192.168.122.0/24,网关 192.168.122.1,宿主机 yu)上的 K8s/RKE2 虚拟机,需要用内网域名
ai-ear.cn直连集群 ingress(Rancher server-url、agent 回连、节点注册),同时不影响公网对ai-ear.cn的正常访问。
1. 需求与方案对比
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
逐台 VM 改 /etc/hosts | 简单直接 | 每台都要改、新 VM 要重复、容易遗漏 | 弃用(已清理) |
| libvirt dnsmasq 静态记录 | 集中配置一次、所有 VM(含新建)自动生效、支持同名多 IP 轮询 | 对宿主机本机也生效(需额外处理,见 §4) | 采用 |
2. 原理
- libvirt NAT 网络自带的 dnsmasq(监听 192.168.122.1:53)是网络内所有 VM 的默认 DNS(由 DHCP 下发
nameserver 192.168.122.1)。 - dnsmasq 中的
<host>静态记录优先于上游转发:匹配域名直接返回内网 IP,其他域名正常转发公网解析。 virsh net-update支持热更新(--live)+ 持久化(--config),无需重启虚拟网络(net-destroy/net-start会中断所有 VM 网络,务必避免)。
3. 实施步骤
bash
# 在宿主机执行:ai-ear.cn → 3 个 control-plane 节点(ingress-nginx 全节点监听 443)
for ip in 192.168.122.20 192.168.122.21 192.168.122.22; do
virsh -c qemu:///system net-update default add dns-host \
"<host ip='$ip'><hostname>ai-ear.cn</hostname></host>" --live --config
done
# 查看已配置记录
virsh -c qemu:///system net-dumpxml default | grep -A3 "<dns>"dnsmasq 对同名多条记录轮询返回全部 IP,具备基础容错。
删除/修改记录:
bash
virsh -c qemu:///system net-update default delete dns-host \
"<host ip='192.168.122.20'><hostname>ai-ear.cn</hostname></host>" --live --config4. 关键坑:静态解析对宿主机本机同样生效
宿主机使用 systemd-resolved(127.0.0.53),其域名查询会被转发到 virbr0 的 DNS(192.168.122.1),因此宿主机访问 ai-ear.cn 也会解析到内网——表现为:
- 宿主机浏览器/curl 访问
https://ai-ear.cn(公网文档站)打到内网集群 ingress,返回 404; https://ai-ear.cn:30443打到内网 NodePort,出示CN=dynamic动态证书,Chrome 报证书错误。
修复:宿主机 /etc/hosts 固定公网 IP(nsswitch files 优先级高于 DNS,不影响 VM):
bash
sudo sh -c 'grep -q "^8.153.84.140 ai-ear.cn" /etc/hosts || echo "8.153.84.140 ai-ear.cn" >> /etc/hosts'效果:宿主机走公网(文档站、Rancher UI :30443 均正常),VM 走内网。
5. 验证
bash
# VM 内:应解析到 192.168.122.20/21/22(轮询)
ssh root@192.168.122.20 'getent hosts ai-ear.cn'
# VM 内:内网直连健康检查
ssh root@192.168.122.20 'curl -s --cacert /root/rancher-root-ca.crt -o /dev/null -w "%{http_code}\n" https://ai-ear.cn/healthz'
# 预期 HTTP 200,remote_ip 为集群节点
# 宿主机:应解析到公网 IP
getent hosts ai-ear.cn # 预期 8.153.84.140
curl -s -o /dev/null -w "%{http_code}\n" https://ai-ear.cn/ # 文档站 2006. 运维备查
| 操作 | 命令 |
|---|---|
| 查看网络列表 | virsh -c qemu:///system net-list |
| 查看 DNS 记录 | virsh -c qemu:///system net-dumpxml default | grep -A10 "<dns>" |
| 添加记录 | virsh net-update default add dns-host "<host ip='IP'><hostname>NAME</hostname></host>" --live --config |
| 删除记录 | virsh net-update default delete dns-host "<host ip='IP'><hostname>NAME</hostname></host>" --live --config |
| 仅临时生效(重启失效) | 去掉 --config |
| 仅写入配置(重启生效) | 去掉 --live |
7. 关联
- Rancher
server-url=https://ai-ear.cn(内网),外网 UIhttps://ai-ear.cn:30443(frp 隧道),见《rancher-new-cluster-join-fix-192.168.122.31.md》附录三。