通过Etcd动态修改CoreDNS数据

上一篇介绍了如何通过CoreDNS来解析我们自己的域名请求,当时是通过配置文件的形式来配置DNS数据的。这篇我们来看如何通过Etcd来完成同样的工作。

如果能使用Etcd来配置数据,好处就特别多了,例如可以动态修改,可以做成分布式DNS,可以做到高可用等等。下面就是配置步骤。

首先需要搭建一个Etcd集群,这里因为是实验性质,所以我们只搭建个单节点的Etcd。推荐搭建使用coreos操作系统,因为etcd是coreos的产品,所以支持最高,使用最简单。下面是etcd的service文件,在/etc/systemd/system/目录中编辑一个etcd.service,然后粘贴下面内容:

[Unit]
Description=etcd service  
After=docker.service  
Requires=docker.service

[Service]
TimeoutStartSec=0  
ExecStartPre=-/usr/bin/docker pull quay.io/coreos/etcd  
ExecStartPre=-/usr/bin/docker rm -f etcd  
ExecStart=/usr/bin/docker run --name etcd \  
                -v /usr/share/ca-certificates/:/etc/ssl/certs \
                -p 4001:4001 \
                -p 2380:2380 \
                -p 2379:2379 \
                -v /root/etcd:/data \ (如果不需要持久化数据,可以省略此挂载)
                -e ETCD_DATA_DIR=/data \(指定存储目录,不需要可以省略)
                -e ETCDCTL_API=3 \
                quay.io/coreos/etcd \
                /usr/local/bin/etcd -name etcd0 \
                 -advertise-client-urls http://<当前IP或者域名>:2379,http://<当前IP或者域名>:4001 \
                -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \
                -initial-advertise-peer-urls http://<当前IP或者域名>:2380 \
                -listen-peer-urls http://0.0.0.0:2380 \
                 -initial-cluster-token etcd-cluster-1 \
                -initial-cluster etcd0=http://<当前IP或者域名>:2380 \
                -initial-cluster-state new
ExecStop=/usr/bin/docker kill etcd  
ExecStopPost=-/usr/bin/docker rm etcd  
Restart=always  
RestartSec=1

[Install]
WantedBy=multi-user.target  

然后编辑CoreDNS配置文件,这次就单独使用配置文件来加载数据了,直接从Etcd中读取数据.

 {
    debug
    errors
    whoami
    log
    proxy . /etc/resolv.conf {
            except mydomain.com
        }
    etcd mydomain.com {
        stubzones
        path /mydomain
        endpoint http://172.26.60.211:2379
    }

}

同样除了mydomain.com需要单独解析,其它域名都交给上层DNS来解析。 etcd mydomain.com表示mydomain.com的数据都从etcd中读取。stubzones表示支持子域名,例如www.mydomain.com,或者blog.mydomain.com之类的数据。

path /mydomain表示mydomain的数据存储在etcd中的/mydomain路径下,最后的endpoint http://172.26.60.211:2379就是etcd的链接信息。

启动CoreDNS,执行dig @localhost www.mydomain.com,此时不会返回任何数据。调用API来往etcd中插入几条数据,

etcdctl set /mydomain/com/mydomain/blog '{"host":"10.0.1.200"}'  
etcdctl set /mydomain/com/mydomain/www '{"host":"10.0.1.100"}'  

在dig一下:

dig @localhost www.mydomain.com +short  
10.0.1.100  
dig @localhost blog.mydomain.com +short  
10.0.1.200  

可以看到瞬间就返回了刚才所设置的A记录。因为时间关系,我还没有研究如何在etcd中配置CNAME数据,等我搞明白之后,在往下补充如何配置CNAME。