Skip to content

内网静态 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 --config

4. 关键坑:静态解析对宿主机本机同样生效

宿主机使用 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/            # 文档站 200

6. 运维备查

操作命令
查看网络列表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(内网),外网 UI https://ai-ear.cn:30443(frp 隧道),见《rancher-new-cluster-join-fix-192.168.122.31.md》附录三。