发现实验室留着5台主机没人用,反正闲着也是闲着,于是琢磨着部署个集群玩玩,貌似有很多东西并没有亲自体验过,如ceph,mesos,kubernetes等,之后应该会贴出相关的笔记。
无论部署什么服务,只要是分布式的,基本离不开域名解析,因为我基本记不住IP,所以DNS服务就很必要了。
本文为我在ubuntu上配置DNS服务的笔记,这里ubuntu的版本为16.04,DNS程序为DNSmasq。
按照DNSmasq的官方描述,这是一个能够为小型网络设施提供DNS和DHCP服务的服务器程序,基本上各大发行版基本都有对应的包,总体而言它很“轻”。而我只需要为5台主机提供服务,完全够用,当然本文只涉及DNSmasq的DNS功能。
如下为5台服务器的IP和域名:
域名 | IP |
---|---|
node0.cpv.org | 192.168.1.230 |
node1.cpv.org | 192.168.1.231 |
node2.cpv.org | 192.168.1.232 |
node3.cpv.org | 192.168.1.233 |
node4.cpv.org | 192.168.1.234 |
ubuntu的源里就有DNSmasq的包,因此我们就不必大费周章地编译了。
sudo apt install dnsmasq
DNSmasq的配置文件主要为:
- /etc/dnsmasq.conf文件
- /etc/dnsmasq.d文件夹内的其他配置文件
从优先级来看,后者更高。如今的很多服务器程序都采用类似的配置策略,比如Nginx,只不过DNSmasq是自动加载后者的罢了。之后我们会在dnsmasq.d文件夹内添加本地命名解析表,而dnsmasq.conf则是关于服务器本身的配置信息。
在进行配置前,首先我们需要修改本机的nameserver,这里推荐直接修改/etc/network/interface文件,将dns-nameservers一项设置为127.0.0.1即可。
DNSmasq位于node0,它需要为node0和集群之外的主机提供DNS服务,因此在它监听的地址应该分别为:
- 127.0.0.1
- 192.168.1.230
只需要修改配置文件dnsmasq.conf中的listen-address即可,将其修改为
listen-address=127.0.0.1,192.168.1.230
DNSmasq处理DNS查询请求的流程如下:
- 查看DNS缓存
- 如1失败,则查看本地记录(包括hosts内的记录)
- 如2失败,则向上一级DNS服务转发查询请求
因此必须为DNSmasq提供上一级DNS服务器的信息,具体的做法是为DNSmasq提供一个resolv,其对应的文件为/etc/resolv.dnsmasq,该文件的格式和resolv.con一样,例如:
nameserver 202.102.93.153
nameserver 8.8.4.4
只需按照如下命令运行即可:
dnsmasq -r /etc/resolv.dnsmasq
这里必须要提供绝对路径,一般而言相对路径对于daemon进程并没有什么意义。
不过很明显,我们应该让systemd来协助管理服务,并且并没有理由去修改dnsmasq.service,毕竟有配置文件。修改前面提到的dnsmasq.conf,添加
resolv-file=/etc/resolv.dnsmasq
为了使上述配置生效,需要重启DNSmasq(如果你之前已经启动过了的话)
sudo systemctl restart dnsmasq
此时,配置应该已经生效了,让我们来测试一下,祭出网络测试专用域名
root@cluster-0:/etc# dig baidu.com
; <<>> DiG 9.10.3-P4-Ubuntu <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 47004
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;baidu.com. IN A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Aug 10 21:58:14 CST 2016
;; MSG SIZE rcvd: 27
然而并没有查到A类记录,ping的结果也是unknow host,似乎配置文件并没有生效啊。
先查看下DNSmasq进程的信息吧。
root@cluster-0:/etc# ps -ax | grep dnsmasq
17218 ? S 0:00 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
怎么加载的是/var/run/dnsmasq/resolv.conf?一定是哪里出了问题,既然是systemd管理的服务,那么就从service文件入手,打开/etc/systemd/system/multi-user.target.wants/dnsmasq.service,发现了如下信息:
ExecStart=/etc/init.d/dnsmasq systemd-exec
So,虽然切换到了systemd,但依旧是initrc的那一套?不管了,打开探探究竟。
发现了如下内容:
\# Note that if the resolvconf package is installed it is not possible to
\# override it just by configuration in /etc/dnsmasq.conf, it is necessary
\# to set IGNORE_RESOLVCONF=yes in /etc/default/dnsmasq.
也就是说如果系统安装了resolvconf,那么默认情况下修改/etc/dnsmasq.conf是没有用的,那么就按照注释所说,将/etc/default/dnsmasq中的相关项加上即可(其实就是去掉最后一行的'#')。
然后再次重启dnsmasq服务,此时我们应该就能够获得baidu域名的A类记录了。
好,接下来就是添加本地的记录了,这里可以采用2种方式:
- 直接修改hosts文件,dnsmasq在启动时会自动加载
- 在dnsmasq.d中添加相关配置
这里采用的是后者,/etc/dnsmasq.d/cluster.conf的内容如下:
address=/node0.cpv.org/192.168.1.230
address=/node1.cpv.org/192.168.1.231
address=/node2.cpv.org/192.168.1.232
address=/node3.cpv.org/192.168.1.233
address=/node4.cpv.org/192.168.1.234
表达的意思即为如果有host查询nodeX.cpv.org的记录,即强制返回对应的静态IP,不在继续向上发送请求。
除此之外,可能还会用到如下写法:
server=/google.com/10.25.3.4
如果host查询的域名为*.google.com则将请求转发给对应IP的DNS服务器。此处的IP地址为随便指定的,只用来作个示例。
重启服务后,就能用ping或者dig来验证结果了,应该不会再有什么问题,至少我这里是这样的。
关于更加深入的内容,暂时并没有涉及,如果未来有需要,会更新本文,并在ChangeLog处给出提示。