DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。
安装
在rhel7.4
上的安装yum install -y dnsmasq
, 完成dnsmasq的安装同时也推荐安装bind-utils
,这个包提供很多dns测试相关工具yum install -y bind-utils
, 如dig
、nslookup
配置启动
创建两个dnsmasq节点,一个做base dns
,一个做upper dns
base dns
的dnsmasq.conf
配置:
1 2 3 4 5 6 7
| listen-address=172.17.0.2,127.0.0.1
# 配置上游DNS服务器 server=/dockxen.mydns/172.17.0.3
# 配置别名 cname=web.dockxen.dns,rhel82
|
*** 在使用CNAME时,<target>
必须本机可访问对象,所以此处我将rhel82
放到/etc/hosts
中 ***
base dns
的/etc/hosts
配置:
1 2 3 4
| 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback 172.17.0.2 dnsbase 192.168.1.82 rhel82
|
upper dns
配置:
1 2 3 4 5 6
| address=/myweb.dockxen.mydns/192.168.1.82
listen-address=172.17.0.3,127.0.0.1
# The fields are <name>,<target>,<port>,<priority>,<weight> srv-host=_ldap._tcp.dockxen.mydns,myweb.dockxen.mydns,8000,0,100
|
完成base dns
和upper dns
的配置后使用dnsmasq -d
debug模式启动,可以看到部分调试信息
测试验证
测试验证需要安装bind-utils
,测试中会用到其中的dig
和nslookup
,开始测试前修改/etc/resolv.conf
中的nameserver 172.17.0.2
验证A
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| [root@dnclient /]# dig myweb.dockxen.mydns
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> myweb.dockxen.mydns ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22751 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION: ;myweb.dockxen.mydns. IN A
;; ANSWER SECTION: myweb.dockxen.mydns. 0 IN A 192.168.1.82
;; Query time: 0 msec ;; SERVER: 172.17.0.2#53(172.17.0.2) ;; WHEN: Mon Nov 20 09:29:48 UTC 2017 ;; MSG SIZE rcvd: 53
[root@dnclient /]# nslookup myweb.dockxen.mydns Server: 172.17.0.2 Address: 172.17.0.2#53
Name: myweb.dockxen.mydns Address: 192.168.1.82
|
验证CNAME
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| [root@dnclient /]# dig web.dockxen.dns
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> web.dockxen.dns ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55429 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;web.dockxen.dns. IN A
;; ANSWER SECTION: web.dockxen.dns. 0 IN CNAME rhel82. rhel82. 0 IN A 192.168.1.82
;; Query time: 0 msec ;; SERVER: 172.17.0.2#53(172.17.0.2) ;; WHEN: Mon Nov 20 09:30:59 UTC 2017 ;; MSG SIZE rcvd: 80
[root@dnclient /]# nslookup web.dockxen.dns Server: 172.17.0.2 Address: 172.17.0.2#53
web.dockxen.dns canonical name = rhel82. Name: rhel82 Address: 192.168.1.82
|
验证SRV
1 2 3 4 5 6 7
| [root@dnclient /]# dig +noall +answer SRV _ldap._tcp.dockxen.mydns _ldap._tcp.dockxen.mydns. 0 IN SRV 0 100 8000 myweb.dockxen.mydns. [root@dnclient /]# nslookup -type=srv _ldap._tcp.dockxen.mydns Server: 172.17.0.2 Address: 172.17.0.2#53
_ldap._tcp.dockxen.mydns service = 0 100 8000 myweb.dockxen.mydns.
|
应用
etcd的服务发现
etcd各个节点之间的通讯使用域名方式访问,由于etcd节点ip地址可以以dhcp方式获取,每次etcd节点重启都有可能导致访问地址发生变化。若使用/etc/hosts
文件进行“域名-ip”映射涉及到/etc/hosts
文件同步分发问题,所以使用dnsmasq来完成“域名-ip”的映射。
关于etcd的服务发现配置请见参考&鸣谢
kube-dns的服务发现
请见《K8s服务发现分析》
参考&鸣谢