配置DNSmasq对不同子网提供不同域名扩展(expand-hosts)¶
我最初在构建 边缘云计算架构 (完全架构在 边缘计算树莓派 ),没有独立建立DNS,而是共用了 私有云架构 中 私有云DNS服务(dnsmasq)和共享因特网(ICS) 的DNSmasq提供的DNS解析。这个部署 部署DNSmasq 方法非常简便,通过 /etc/hosts
结合 DNSmasq 的 expand-hosts
功能(也就是自动添加 staging.huatai.me
域名后缀),为整个虚拟化集群提供DNS解析。
不过,随着我拆分集群,将 Raspberry Pi Atlas 设备构建成独立的 边缘云计算构建 ,采用2个网段:
192.168.6.x
- 私有云计算构建 : 域名staging.huatai.me
192.168.7.x
- 边缘云计算构建 : 域名edge.huatai.me
192.168.8.x
- Kubernetes集群(y-k8s) : 域名staging.cloud-atlas.io
这就带来一个问题:
虽然使用短域名,例如 x-k3s-m-1
直接 ping
或者 ssh
都能解析出 192.168.7.11
,但是主机的 FQDN 名字却被错误扩展成了 x-k3s-m-1.staging.huatai.me
而不是我期望的独立域名 egde.huatai.me
。
仔细阅读 /etc/dnsmasq.conf
配置文件中的注释,就可以看到:
所谓域名扩展
expand-hosts
是从/etc/hosts
读取主机名到IP的解析,然后默认添加的域名后缀DNSmasq支持根据不同子网(particular subnet)来提供不同的
expand-hosts
域名
所以,针对我的需求,可以如下配置DNSmasq:
# 本地默认域名
local=/staging.huatai.me/
# 转发上游域名解析服务器,请求DNS解析
server=8.8.8.8
# 监听DNS请求的网卡接口(br0上使用了IP Alias,但是ifconfig只看到一个br0,所以这里配置一个接口)
interface=br0,eno4
# 监听DNS请求的IP地址(注意eno4接口是DHCP动态获取IP,所以使用上面的interface配置)
listen-address=192.168.6.200,192.168.7.200,192.168.8.200,127.0.0.1
# 扩展主机域名,也就是请求 zcloud 默认扩展成 zcloud.staging.huatai.me
expand-hosts
# 服务器提供解析的域名,可以为多个网段提供不同的域名解析
domain=staging.huatai.me,192.168.6.0/24
domain=edge.cloud-atlas.io,192.168.7.0/24
domain=staging.cloud-atlas.io,192.168.8.0/24
# DNS解析缓存
cache-size=1000
# DHCP
dhcp-range=192.168.6.21,192.168.6.50,255.255.255.0,12h
dhcp-option=option:router,192.168.6.200
dhcp-option=option:dns-server,192.168.6.200
dhcp-authoritative
这样,DNSmasq读取 /etc/hosts
配置,例如:
192.168.6.253 z-dev
...
192.168.7.11 x-k3s-m-1
...
192.168.8.116 y-k8s-m-1
...
就会根据IP网段,分别扩展解析成:
192.168.6.253 z-dev.staging.huatai.me
192.168.7.11 x-k3s-m-1.edge.huatai.me
192.168.8.116 y-k8s-m-1.staging.cloud-atlas.io
验证(nslookup查询反向解析和正向解析):
# nslookup 192.168.6.253 Server: 192.168.7.200 Address: 192.168.7.200:53 253.6.168.192.in-addr.arpa name = z-dev.staging.huatai.me # nslookup 192.168.7.11 Server: 192.168.7.200 Address: 192.168.7.200:53 11.7.168.192.in-addr.arpa name = x-k3s-m-1.edge.huatai.me # nslookup 192.168.8.116 116.8.168.192.in-addr.arpaname = y-k8s-m-1. # nslookup z-dev.staging.huatai.me Server: 192.168.7.200 Address: 192.168.7.200:53 Name: z-dev.staging.huatai.me Address: 192.168.6.25 # nslookup x-k3s-m-1.edge.huatai.me Server: 192.168.7.200 Address: 192.168.7.200:53 Name: x-k3s-m-1.edge.huatai.me Address: 192.168.7.11 # nslookup y-k8s-m-1.staging.cloud-atlas.io Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: y-k8s-m-1.staging.cloud-atlas.io Address: 192.168.8.116