基于CoreDNS和etcd实现动态域名解析
在我开发的项目notr内网穿透当中引入DNS来解决一个问题:
-
动态配置*.notr.tech的A记录
每次客户端连接都会修改其A记录,解析到连接的服务器节点上。目前DNS版本还非常简单,已经开源成notrns项目。但是这个项目还有几个问题: -
数据存储在boltdb当中,只能本地用
-
如果流量比较大,需要部署多个dns节点,数据同步问题比较麻烦
-
性能有待测试,能工作,但是工作的极限还不知道
通过github了解到CoreDNS和etcd两个项目,就想着用CoreDNS代替notrns来做动态域名解析,使用etcd来做存储,使用etcd是基于以下考量: -
迁移方便
-
CoreDNS有etcd插件,不用额外开发
-
后续考虑引入etcd来做配置管理。
测试
1.启动etcd
2.启动coredns
CoreFile:
.:53 {
bind 192.168.44.218
errors
log
health {
lameduck 5s
}
hosts {
192.168.44.210 BETAWS26
192.168.44.203 BDSGATEWAY
192.168.1.21 HOSTBETAWS21
192.168.6.158 HOSTBETAAS21
192.168.6.159 HOSTBETAAS22
192.168.6.164 HOSTBETAWS22
192.168.44.201 HOSTBETAWS24
192.168.44.203 HOSTBETAWS25
192.168.44.204 HOSTBETADS21
192.168.1.21 HOSTMONGODB
192.168.44.201 HOSTMONGODBWS4
192.168.44.203 HOSTMONGODBWS5
192.168.44.204 HOSTREDIS
192.168.45.0 HOSTAUTH
192.168.44.210 HOSTBIGDATASERVICE
192.168.44.210 HOSTAUTOCOMPLETE
192.168.44.210 HOSTUSERSUBSCRIBE
192.168.44.210 abcba.com
192.168.45.0 w-1.betawm.com
192.168.45.0 w-2.betawm.com
192.168.45.0 HOSTTEST
ttl 50
reload 1m
fallthrough
}
etcd {
path /corednspre
endpoint http://192.168.44.218:2379 http://192.168.44.210:2379 http://192.168.6.166:2379
fallthrough
}
ready
prometheus :9153
forward . 100.100.2.136 100.100.2.138
cache 30
reload
}
常用参数说明:
- ZONES :经过授权的区域,可以为空
- stubzones:启用存根区域功能。stubzone仅在位于指定的第一个区域下方的etcd树中完成。
- fallthrough:如果区域匹配但不能生成记录,则将请求传递给下一个插件
- path:etcd里面的路径 默认为"/skydns",以后所有的dns记录就是存储在该存根路径底下
- endpoint:etcd访问地址,默认http://localhost:2397,多个空格分隔
1.使用etctrl设置域名解析
[root@BETAWS27 etcd-v3.5.0]# ./etcdctl put /corednspre/com/betawm/w-1/ '{"hostname":"192.168.45.0"}'
OK
[root@BETAWS27 etcd-v3.5.0]# nslookup w-1.betawm.com
Server: 192.168.44.201
Address: 192.168.44.201#53
Name: w-1.betawm.com
Address: 192.168.45.0
2.通过windows客户端工具连接设置
接下来只需要在registry将etcd client集成进去即可,改造完之后整个软件变成了下图所示的流程。
- 每次启动一个服务端节点之后,会往registry发送当前节点的信息,目的是让registry做负载均衡以及根据地理位置进行调度,同时服务端节点也可以随时插拔,随时都可以添加和删除节点。
- 把节点信息写入数据库,当前使用mongodb
- 步骤一和步骤二初始化完成之后,用户使用客户端,先和registry节点连接,获取接入的服务节点的信息
- registry从数据库中取出在步骤二中存储的节点信息,并根据节点当前连接的客户端数量和地理位置进行一轮选择,首选地理位置最近的,目前只划两个区,中国区和海外区,然后再根据客户端连接数量排序选择连接数最少的。
- 客户端拿到节点信息之后和server建立tcp长连接
- server节点需要从registry请求用户,限速等信息
- 从数据库取出数据
- 生成域名解析记录,将当前用户等域名映射到它当前连接到server的公网IP
- 每次需要域名解析时,由于配置了ns记录,用户的域名解析请求最终会到coredns,coredns再从etcd中取出