介绍
CoreDNS是一款Go语言编写的开源DNS服务器。作为CNCF毕业项目,目前已经成为kubernetes环境中的DNS服务器的标准配置。其快速,简单,可扩展等特性也非常受人欢迎。
官网: https://coredns.io/
Github: https://github.com/coredns/coredns
安装
本文主要介绍安装独立运行的coredns,所以不会尝试在kuberentes上安装。大多数的发行版本kubernets都会自带Coredns,所以本文并不涉及此处。
CoreDNS需要Go的环境去编译和运行。如果你不希望在你的环境中安装go环境,或者安装go的环境有障碍,Docker的安装方式更加适合你。
从dockerhub上可以看到最新的coredns的版本是1.6.9,我们以此为版本进行安装
从Dockerfile来看,其应用入口即coredns命令,所以我们配置如下docker命令启动coredns
首先,我们编写一个CoreDns的配置文件Corefile,这里我们使用最简单的配置进行测试。
.:53 {
forward . 8.8.8.8:53
log
}
以上配置是指将DNS请求转发到8.8.8.8进行解析。
将该文件放到一个文件路径下,例如,本文使用/data/coredns/Corefile
运行docker 命令启动CoreDNS
# docker run -it -d --net=host \
--name=coredns --restart=always \
-v /data/coredns:/etc/coredns/ \
coredns/coredns:1.6.9 \
-conf /etc/coredns/Corefile
几个注意的点:
--net=host
要指定,如果不指定,在同宿主机的容器中无法查询DNS。如果指定了该项,则无须指定-p选项。默认使用宿主机的端口。例如端口53。
在容器中使用dig
命令的报错信息:
[root@f83bb3a439bb /]# dig 192.168.100.3 -p 53 a whoami.example.org
;; reply from unexpected source: 172.17.0.1#53, expected 192.168.100.3#53
;; reply from unexpected source: 172.17.0.1#53, expected 192.168.100.3#53
--restart=always
在docker服务重启后可以自动启动该容器。-v
指定volume挂载地址,可以在容器之外修改coredns的配置- 命令参数中显式指定Corefile的位置。
启动之后我们在另外一个容器中测试该配置,docker run
命令可以指定覆盖dns的服务器地址:
# docker run -it --rm --dns=192.168.100.3 centos:latest /bin/bash
# cat /etc/resolv.conf
search centos
nameserver 192.168.100.3
# ping www.baidu.com
PING www.wshifen.com (104.193.88.123) 56(84) bytes of data.
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=1 ttl=47 time=152 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=2 ttl=47 time=153 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=3 ttl=47 time=151 ms
[root@f83bb3a439bb /]# nslookup www.baidu.com
Server: 192.168.100.3
Address: 192.168.100.3#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
www.a.shifen.com canonical name = www.wshifen.com.
Name: www.wshifen.com
Address: 104.193.88.77
Name: www.wshifen.com
Address: 104.193.88.123
resolve.conf已经配置成我们的服务器宿主机地址,运行ping
和nslookup
命令可以看到成功解析www.baidu.com
的地址。 证明我们的配置已经可以正常运行。
配置
下面我们可以尝试自己添加一些自定义的域名。 CoreDNS使用插件的方式实现一系列的功能。 例如上面例子中的forward插件,实现了DNS转发的功能。如果我们只是想添加一个域名,能够解析成我们指定的IP,可以尝试使用host插件。
我们将上面的Corefile修改一下:
.:53 {
hosts {
10.0.0.1 example.org
fallthrough
}
forward . 8.8.8.8:53
log
}
然后重启我们的CoreDNS的容器,重新加载Corefile
此时我们再次在另外一个容器中测试就能看到添加的A记录可以正常解析了:
[root@f83bb3a439bb /]# nslookup example.org
Server: 192.168.100.3
Address: 192.168.100.3#53
Name: example.org
Address: 10.0.0.1
[aiops@3 coredns]$ dig 192.168.100.3 -p 53 a example.org
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @localhost -p 53 a example.org
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10522
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.org. IN A
;; ANSWER SECTION:
example.org. 3600 IN A 10.0.0.1
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: 三 4月 08 14:51:14 CST 2020
;; MSG SIZE rcvd: 67
我们也可以使用文件的形式去保存和管理hosts,这样更加方便。
# ls
Corefile hostsfile
# cat Corefile
.:53 {
hosts /etc/coredns/hostsfile {
fallthrough
}
forward . 8.8.8.8:53
log
}
# cat hostsfile
10.0.0.1 example1.org
更多的插件请移步官网: https://coredns.io/plugins/
总结
如果你需要独立安装一款DNS服务器,CoreDNS也可以作为你的选择。
配置简单,操作方便,插件丰富。
CoreDNS之所以在kubernetes中已经成为标配,是因为其提供的插件的能力,同时可以对外提供metrics。
以后我们有时间可以深入了解一下kubernets中CoreDNS的运作方式。