基於CoreDNS和etcd實現動態域名解析

在我開發的項目notr內網穿透當中引入DNS來解決一個問題:git

  • 動態配置*.notr.tech的A記錄

每次客戶端鏈接都會修改其A記錄,解析到鏈接的服務器節點上。目前DNS版本還很是簡單,已經開源成notrns項目。可是這個項目還有幾個問題:github

  • 數據存儲在boltdb當中,只能本地用
  • 若是流量比較大,須要部署多個dns節點,數據同步問題比較麻煩
  • 性能有待測試,能工做,可是工做的極限還不知道

經過github瞭解到CoreDNSetcd兩個項目,就想着用CoreDNS代替notrns來作動態域名解析,使用etcd來作存儲,使用etcd是基於如下考量:mongodb

  • 遷移方便
  • CoreDNS有etcd插件,不用額外開發
  • 後續考慮引入etcd來作配置管理。

測試

  1. 啓動etcd
  2. 啓動coredns

CoreFile:數據庫

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

複製代碼
  1. 使用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集成進去便可,改造完以後整個軟件變成了下圖所示的流程。bash

notr架構

  1. 每次啓動一個服務端節點以後,會往registry發送當前節點的信息,目的是讓registry作負載均衡以及根據地理位置進行調度,同時服務端節點也能夠隨時插拔,隨時均可以添加和刪除節點。
  2. 把節點信息寫入數據庫,當前使用mongodb
  3. 步驟一和步驟二初始化完成以後,用戶使用客戶端,先和registry節點鏈接,獲取接入的服務節點的信息
  4. registry從數據庫中取出在步驟二中存儲的節點信息,並根據節點當前鏈接的客戶端數量和地理位置進行一輪選擇,首選地理位置最近的,目前只劃兩個區,中國區和海外區,而後再根據客戶端鏈接數量排序選擇鏈接數最少的。
  5. 客戶端拿到節點信息以後和server創建tcp長鏈接
  6. server節點須要從registry請求用戶,限速等信息
  7. 從數據庫取出數據
  8. 生成域名解析記錄,將當前用戶等域名映射到它當前鏈接到server的公網IP
  9. 每次須要域名解析時,因爲配置了ns記錄,用戶的域名解析請求最終會到coredns,coredns再從etcd中取出
相關文章
相關標籤/搜索