基于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:

notr.tech {      etcd  {          path /skydns          endpoint http://localhost:2379          upstream      }      log  }  

3.使用etctrl设置域名解析

➜  bin git:(master) ./etcdctl put /skydns/tech/notr/yingjiu/ '{"host":"192.168.1.2"}'    OK  ➜  bin git:(master) nslookup yingjiu.notr.tech 127.0.0.1  Server:     127.0.0.1  Address:    127.0.0.1#53    Name:   yingjiu.notr.tech  Address: 192.168.1.2    ➜  bin git:(master) ./etcdctl put /skydns/tech/notr/yingjiu/ '{"host":"192.168.1.3"}'    OK  ➜  bin git:(master) nslookup yingjiu.notr.tech 127.0.0.1  Server:     127.0.0.1  Address:    127.0.0.1#53    Name:   yingjiu.notr.tech  Address: 192.168.1.3    ➜  bin git:(master)  

接下来只需要在registry将etcd client集成进去即可,改造完之后整个软件变成了下图所示的流程。

1.每次启动一个服务端节点之后,会往registry发送当前节点的信息,目的是让registry做负载均衡以及根据地理位置进行调度,同时服务端节点也可以随时插拔,随时都可以添加和删除节点。
2.把节点信息写入数据库,当前使用mongodb
3.步骤一和步骤二初始化完成之后,用户使用客户端,先和registry节点连接,获取接入的服务节点的信息
4.registry从数据库中取出在步骤二中存储的节点信息,并根据节点当前连接的客户端数量和地理位置进行一轮选择,首选地理位置最近的,目前只划两个区,中国区和海外区,然后再根据客户端连接数量排序选择连接数最少的。
5.客户端拿到节点信息之后和server建立tcp长连接
6.server节点需要从registry请求用户,限速等信息
7.从数据库取出数据
8.生成域名解析记录,将当前用户等域名映射到它当前连接到server的公网IP
9.每次需要域名解析时,由于配置了ns记录,用户的域名解析请求最终会到coredns,coredns再从etcd中取出

原文出处:juejin -> https://juejin.im/post/5d0b844df265da1bb277376d

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » 基于CoreDNS和etcd实现动态域名解析