基於騰訊雲自建高可用DNS方案實踐

語言: CN / TW / HK

導語 |  本文推選自騰訊雲開發者社群-【技思廣益 · 騰訊技術人原創集】專欄。該專欄是騰訊雲開發者社群為騰訊技術人與廣泛開發者打造的分享交流視窗。欄目邀約騰訊技術人分享原創的技術積澱,與廣泛開發者互啟迪共成長。本文作者是騰訊雲開發者社群的作者羅俊。

本文主要介紹如何在騰訊雲平臺下自建高可用DNS環境,來滿足企業在雲上的內外網域名解析的需求。這裡主要介紹兩種方案的實現方式,方案一: 基於Centos 系統自帶的Bind軟體構建智慧解析方案;方案二:基於CoreDNS與ETCD來構建CoreDNS高可用方案,在闡述兩個方案實現的前,咱們一起回顧下DNS的基礎概念及原理。

DNS基礎概念

(一)DNS概述

DNS是一個層次化的分散式資料庫,其全稱為域名系統(Domain Name System),它儲存用於網際網路主機名與IP地址相互對映的資訊,及其它網際網路所用到的資料。DNS系統是由柏克大學發展的BIND軟體(Berkeley Internet Name Domain)所提供。現目前的BIND的為9.x,現網上大多數都簡稱叫BIND9 ;BIND9 軟體分發包括了一個名字伺服器,named,和量和解析庫,liblwres和libbind。如果想了解更多或下載更高的版本,可到此站點去查詢與下載: http://www.isc.org/software/bind

BIND與DNS區別:DNS是一種因特網的通訊協議名稱,BIND這是提供這個DNS服務的軟體;在TCP/IP網路中有非常重要的地位,能夠提供域名與IP地址的解析服務。

(二)DNS工作原理

域名系統DNS是類似於一個樹狀資料結構,樹中的每個節點實質都是負責某個特定區域的一臺伺服器,通過這些節點,對整個域名空間進行劃分,成為一個層次結構,這種結構類似與UNIX檔案系統的層次結構,根的名字“.”來表示,並稱之為根域名(root domain)根域的下一級是頂級域名,頂級域名又分為兩種劃分方法,地理域和通用域,地理域則是為了世界上每個國家或地區等設定的,如中國是cn,日本jp,美國us,臺灣tw。等等。通用域則是通過不同的機構類別設定的頂級域名,如org、edu 等等。如下圖:

(三)常見的頂級域名列表

隨著網路快速增長,後來就出現了,以國家或地區區分的Domain name。

(四)域名服務的解析原理和過程

  • Step-1:使用者提出域名請求,並將請求傳送給本地域名伺服器。

  • Step-2:當本地域名伺服器收到請求後,先查詢本地的快取,如果有該記錄資訊,則本地的域名伺服器就直接把查詢的結果返回給使用者端。

  • Step-3:如果本地的快取中沒有該記錄,則本地域名伺服器就直接把請求發給根域名伺服器,然後讓根域名伺服器返回給本地域名伺服器一個所查詢域(根的子域,如cn)的主域名伺服器的地址。

  • Step-4:本地伺服器再向上一步驟中所返回的域名伺服器傳送請求,然後收到該請求的域名伺服器查詢其快取,返回與此請求所對應的記錄或相關的夏季的域名股武器的地址,本地域名伺服器將返回的結果儲存到快取。

  • Step-5:重複第4步,直到找到正確的記錄。

  • Step-6:本地域名伺服器把返回的結果儲存到快取,以備下一次使用,同時還將結果返回客戶端。

DNS解析示例:

  • Step-1:客戶端請求解析 www.sina.com.cn 的報文。

  • Step-2:本地的域名伺服器收到請求後,檢視本地快取是否有該 www.sina.com.cn 的解析記 錄,若有則反饋給客戶端,若沒有,就像上圖一樣,從根域名伺服器進行查詢。

  • Step-3: “.”根域名伺服器收到請求後,判斷此域名屬於.cn域,查詢到NS記錄及相應的A記錄告。

  • Step-4:本地DNS伺服器收到相關資訊後,先快取起來,再向其.cn的域名之一的DNS服務 器傳送請求解析域名 www.sina.com.cn 的報文。

  • Step-5:.cn域名伺服器收到請求後,判斷該域名屬於.com.cn域,開始查詢本地的記錄,找到6條NS記錄及相應的A記錄後,將其結果反饋給本地DNS伺服器。

  • Step-6:本地DNS伺服器收到反饋資訊後,先快取起來,再向其.com.cn域名伺服器進行查 詢,請求解析域名 www.sina.com.cn 的報文。

  • Step-7:.com.cn域名伺服器收到請求後,判斷該域屬於.sina.com.cn域,開始查詢本地的記錄找到NS記錄及對應的A記錄,然後將查詢的結果返回給本地DNS伺服器。

  • Step-8:本地DNS伺服器收到請求後,先快取以上查詢結果,再次向.sina.com.cn域名伺服器進行查詢,請求解析域名 www.sina.com.cn 的報文。

  • Step-9:域名伺服器ns1.sina.com.cn收到請求後,開始查詢本地快取,同時其解析的結果反饋給本地DNS伺服器。

  • Step-10:本地DNS伺服器收到 www.sina.com.cn 的解析後,先本地快取一份,同時將其結果返回給客戶機,這樣就完成一次域名解析過程。

(五)DNS服務的相關記錄說明

  • NS:域名伺服器記錄成為NS記錄。

  • A :地址記錄用於設定主機名對應ip地址關係。

  • CNAME:別名記錄。

  • MX記錄:設定當前域中提供郵件伺服器名稱。

DNS高可用智慧解析方案

本DNS高可用方案基於基於CVM雲伺服器,在VPC內網的進行DNS伺服器的構建,可實現內網域名解析的需求。同時本方案設計結合了騰訊雲CLB產品提供了負載均衡能力,也可通過多個CLB實現對接多臺RS接節點,分擔前端解析壓力,同時支援多可用區部署。

(一)方案特點

  • 同地域,多可用區 進行DNS高可用構建。

  • 全部部署在內網環境,無 公網IP 暴露。

  • 內網、外網域名請求分離,減小故障影響。

  • 內網LB對接多臺RS節點,承載前端解析訪問請求。

(二)方案實現功能

  • 支援騰訊雲平臺內網保留域名解析 如:*.tencentyun.com。

  • 支援使用者定義自己業務域名內網解析 如: www.rocky.com。

  • 支援訪問外網域名解析 如:www.baidu.com。

  • 支援分域名轉發到不同的DNS伺服器。

(三)解析流程路徑

1)客戶端訪問企業內部域名

  • Client => CLB => 自建DNS1 /自建DNS2

2)客戶端訪問騰訊雲內網域名

  • Client => CLB => 自建DNS1 =>轉發至183 DNS => UnbondDNS

3)客戶端訪問外網域名

  • Client => CLB=>自建DNS1 =>轉發至183 DNS => Private DNS =>公網遞迴DNS

注意

  • 若客戶在騰訊雲的UIN賬號是非頻寬上移使用者(傳統使用者),則CLB不支援跨可用區掛在RS節點。

  • 按照相關規定,沒有相關資質是不允許開啟53埠的。若內部使用,需限制訪問來源。

詳情參考騰訊雲官網文件《關於安全組53埠配置的公告》

http://cloud.tencent.com/document/product/213/35533

DNS高可用智慧解析方案實現

本次方案採用了兩臺節點進行此方案的實踐。若在雲上的生成環境需結合客戶業務的詳細需求進行節點數量,CLB數量,不同的地域調整即可。

(一)設定主機名

[root@VM-2-15-centos ~] hostnamectl set-hostname node4.rocky.com
[root@VM-2-16-centos ~] hostnamectl set-hostname node5.rocky.com

(二)配置/etc/hosts

[root@node4 ~]# cat /etc/hosts
127.0.0.1 VM-6-15-centos VM-6-15-centos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
10.0.6.15 node4 node4.rocky.com
10.0.6.16 node5 node5.rocky.com

(三)安裝DNS軟體

[root@node4 ~]# yum -y install bind
[root@node5 ~]# yum -y install bind

(四)DNS主配置檔案

[root@node4 ~]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
acl "trusted-recursion" { # 設定acl
localhost;
10.0.0.0/16;
};
options {
listen-on port 53 { any; }; #設定監聽埠,也可寫具體的網段
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #開放查詢
allow-recursion { trusted-recursion; }; #指定允許哪些主機可以從快取中獲取答案。
allow-query-cache { trusted-recursion; }; # 指定允許那些主機可以通過本伺服器進行遞迴查詢。
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable no;
dnssec-validation no; # 關閉dnssec安全驗證
/* Path to ISC DLV key */
#bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
forwarders {
183.60.83.19; # 騰訊雲VPCGW DNS地址
183.60.82.98; # 騰訊雲VPCGW DNS地址
};
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
#include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
zone "rocky.com" { # 域名
type master; #主DNS
file "dynamic/rocky.com.zone"; # zone file path #正向區域檔案
notify yes;
};
zone "6.0.10.in-addr.arpa" in {
type master;
file "dynamic/6.0.10.in-addr.arpa.zone"; #反向區域檔案
notify yes;
};

(五)DNS區域檔案配置

  • 正向區域配置檔案

  • 反向區域配置檔案

  • 區域配置檔案引數說明

  • 啟動DNS服務

分別在node4和node5進行服務啟動及檢查服務狀態是否正常。

  • DNS服務解析驗證

#客戶端訪問企業內部域名
[root@node4 ~]# nslookup www.rocky.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Name: www.rocky.com
Address: 10.0.6.100


[root@node4 ~]# nslookup 10.0.6.100
100.6.0.10.in-addr.arpa name = www.rocky.com.


#客戶端訪問外網域名
[root@node4 ~]# nslookup www.baidu.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.68.3
Name: www.a.shifen.com
Address: 110.242.68.4
#客戶端訪問騰訊雲內網服務域名
[root@node4 ~]# nslookup mirrors.tencent.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Non-authoritative answer:
mirrors.tencent.com canonical name = mirrors.cloud.tencent.com.
mirrors.cloud.tencent.com canonical name = mirrors.cloud.tencent.com.cdn.dnsv1.com.
mirrors.cloud.tencent.com.cdn.dnsv1.com canonical name = 14io0gsu.sched.dma.tdnsv5.com.
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.235
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.180
[root@node4 ~]#

服務驗證通過,符合預期,node5分別也進行相關解析驗證。

(七)LB配置

  • 新建內網LB

新建內網LB,配置監聽埠為UDP:53,加權輪詢。

  • 配置LB

選擇板繫結的RS節點,確認即可

(八)客戶端驗證

[root@node6 ~]# cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
#nameserver 183.60.83.19
#nameserver 183.60.82.98
nameserver 10.0.2.2 #內網LB地址
#解析業務域名
[root@node6 ~]# nslookup www.rocky.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Name: www.rocky.com
Address: 10.0.6.100
#解析騰訊內網域名
[root@node6 ~]# nslookup mirrors.tencent.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
mirrors.tencent.com canonical name = mirrors.cloud.tencent.com.
mirrors.cloud.tencent.com canonical name = mirrors.cloud.tencent.com.cdn.dnsv1.com.
mirrors.cloud.tencent.com.cdn.dnsv1.com canonical name = 14io0gsu.sched.dma.tdnsv5.com.
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.180
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.235
[root@node6 ~]# nslookup myqcloud.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
Name: myqcloud.com
Address: 0.0.0.1
#解析外網域名
[root@node6 ~]# nslookup www.jd.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
www.jd.com canonical name = www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com canonical name = jd-abroad.cdn20.com.
Name: jd-abroad.cdn20.com
Address: 121.57.82.89
Name: jd-abroad.cdn20.com
Address: 36.111.141.54
Name: jd-abroad.cdn20.com
Address: 121.57.82.88
Name: jd-abroad.cdn20.com
Address: 121.57.82.17
Name: jd-abroad.cdn20.com
Address: 42.81.145.189
Name: jd-abroad.cdn20.com
Address: 113.24.194.72
Name: jd-abroad.cdn20.com
Address: 240e:918:1a00:201::33
Name: jd-abroad.cdn20.com
Address: 240e:928:101::1e
Name: jd-abroad.cdn20.com
Address: 240e:918:1a00:201::15
Name: jd-abroad.cdn20.com
Address: 240e:925:2:101::6

驗證通過, 符合預期。

(九)DNS高可用智慧解析方案總結

本方案採用Linux系統自帶的DNS軟體進行DNS高可用環境的構建,結合了內網CLB使其解析排程RS更加靈活。同時實現了客戶端對企業內網域名,騰訊雲內外網域名的解析需求。另外這裡務必注意RS在內網進行構建,安全組限制53埠的來源IP。

CoreDNS高可用方案

本篇主要介紹通過自建CoreDNS叢集來提供DNS內外域名解析,及騰訊內網DNS功能,這裡採用CoreDNS+ETCD叢集方式來實現。方案特點:

  • 多臺自建的CoreDNS節點,規避了單臺無法使用的情況,提升可用性。

  • 多可用區部署,具備高可用性,避免單可用區故障現象(雖說概率較小)

  • 全部部署在內網環境,無公網IP暴露。

  • 內網、外網域名請求分離,減少故障爆炸半徑。

(一)CoreDNS

CoreDNS基於用Go編寫的是一個DNS伺服器,連結外掛,每個外掛執行一個(DNS)功能。相對於其他DNS如:BIND、Knot、PowerDNS和Unbound不同之處,在於它非常靈活,幾乎所有功能都外包到外掛中 ,外掛也可以是獨立的,也能協同工作。可以利用外掛對你的DNS資料做你想做的事情。如果有些功能不是現成的,你可以通過編寫外掛來新增,和Caddy Server具有相同的模型:連結外掛。

  • CoreDNS特點

外掛化(Plugins):基於Caddy伺服器框架,CoreDNS實現了一個外掛鏈的架構,將大量應用端的邏輯抽象成外掛形式暴露給使用者。CoreDNS以預配置的方式將不同的外掛串成一條鏈,按序執行外掛鏈上的邏輯。

配置簡單:引入表達力更強的DSL,即Corefile形式的配置檔案。

  • CoreDNS架構

  • CoreDNS解析方式

注意這裡有兩個不同的埠:5300和53。在內部,每個埠都會生成一個dnsserver.Server。即使有四個伺服器塊,我們也只能得到兩個實際的伺服器。CoreDNS會將所有與同一埠相關的伺服器塊收集起來,並將它們合併到相同的dnsserver.Server中。伺服器將在埠上多重查詢,根據區域將它們傳遞到不同的外掛鏈。它為區域選擇最特定的匹配伺服器塊。如果沒有匹配的伺服器塊,則返回SERVFAIL。

coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}
example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}
example.net:53 {
file /etc/coredns/zones/example.net.db
}
.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
}

(二)ETCD

ETCD是一種高度一致的分散式鍵值儲存,它提供了一種可靠的方式來儲存需要由分散式系統或機器叢集訪問的資料。它在網路分割槽期間優雅地處理領導選舉,並能夠容忍機器故障。

  • 簡單:安裝配置簡單,支援HTTP API進行互動。

  • 安全:支援 SSL證書 驗證。

  • 快速:根據官方提供的benchmark資料,單例項支援每秒2k+讀操作。

  • 可靠:採用raft演算法,實現分散式系統資料的可用性和一致性。

從上面架構圖中我們可以看到,ETCD主要分為四個部分。

HTTP Server:用於處理使用者傳送的API請求以及其它etcd節點的同步與心跳資訊請求。

Store:用於處理etcd支援的各類功能的事務,包括資料索引、節點狀態變更、監控與反饋、事件處理與執行等等,是etcd對使用者提供的大多數API功能的具體實現。

Raft:Raft強一致性演算法的具體實現,是etcd的核心。

WAL:Write Ahead Log(預寫式日誌)是etcd的資料儲存方式。除了在記憶體中存有所有資料的狀態以及節點的索引外,etcd就通過WAL進行持久化儲存。在WAL中所有的資料提交前都會事先記錄日誌,Snapshot是為了防止資料過多而進行的狀態快照,Entry表示儲存的具體日誌內容。

(三)配置ETCD叢集

這裡採用三臺雲伺服器作為CoreDNS節點的後端資料庫,ETCD架構邏輯具備選舉master機制,分別為node1~node3。

  • 安裝ETCD及開機啟動

[root@node1~]# yum -y install etcd
[root@node11 ~]# systemctl enable etcd; systemctl start etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
  • node1 etcd配置

[root@node1 etcd]# egrep ^[A-Z] etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node1.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.4:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.4:2379,http://127.0.0.1:2379"
ETCD_NAME="node1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.4:2380"
ETCD_ADVERTISE_CLIENT_URLS="node1=http://10.0.2.4:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2379,node2=http://10.0.2.8:2379,node3=http://10.0.2.15:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  • node2 etcd配置

[root@node2 ~]# egrep ^[A-Z] /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node2.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.8:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.8:2379,http://127.0.0.1:2379"
ETCD_NAME="node2"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.8:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.2.8:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2380,node2=http://10.0.2.8:2380,node3=http://10.0.2.15:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@node2 ~]#
  • node3 etcd配置

[root@node3 ~]# egrep ^[A-Z] /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node3.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.15:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.15:2379,http://127.0.0.1:2379"
ETCD_NAME="node3"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.15:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.2.15:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2380,node2=http://10.0.2.8:2380,node3=http://10.0.2.15:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

啟動與驗證etcd服務

[root@node1 ~]# systemctl start etcd.service
[root@node1 ~]# systemctl status etcd.service
etcd.service - Etcd Server
Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-02-15 13:50:16 CST; 10h ago
Main PID: 10451 (etcd)
CGroup: /system.slice/etcd.service
└─10451 /usr/bin/etcd --name=node1 --data-dir=/var/lib/etcd/node1.etcd --listen-client-urls=http://10.0.2.4:2379,http://127.0.0.1:2379
  • etcd叢集健康

[root@node1 ~]# etcdctl member list
5432b0f7395992d2: name=node1 peerURLs=http://10.0.2.4:2380 clientURLs=http://10.0.2.4:2379 isLeader=true
589358f881fe72a1: name=node2 peerURLs=http://10.0.2.8:2380 clientURLs=http://10.0.2.8:2379 isLeader=false
bb72602d9eb35069: name=node3 peerURLs=http://10.0.2.15:2380 clientURLs=http://10.0.2.15:2379 isLeader=false


[root@node1 ~]# etcdctl cluster-health
member 5432b0f7395992d2 is healthy: got healthy result from http://10.0.2.4:2379
member 589358f881fe72a1 is healthy: got healthy result from http://10.0.2.8:2379
member bb72602d9eb35069 is healthy: got healthy result from http://10.0.2.15:2379
cluster is healthy

(四)多節點CoreDNS部署

  • 安裝c oredns 

這裡面可結合客戶業務需要進行CoreDNS伺服器的環境構建,這裡採用的coredns1.6.4 版本,官網最新1.9.x

[root@dns1 ~]# tar zxvf coredns_1.6.4_linux_amd64.tgz
[root@dns1 ~]# mv coredns /usr/bin/
[root@dns1 ~]# mkdir /etc/coredns
  • coredns核心配置檔案

[root@node1 ~]# cat /etc/coredns/Corefile
. { # 監聽tcp和udp的53埠
etcd node1.rocky.com node2.rocky.com node3.rocky.com 10.in-addr.arpa { # 配置啟用etcd外掛,後面可以指定域名
stubzones # 啟用存根區域功能
path /skydns # etcd裡面的路徑 預設為/skydns,以後所有的dns記錄就是儲存在該存根路徑底下
endpoint http://10.0.2.4:2379 http://10.0.2.8:2379 http://10.0.2.15:2379 # etcd訪問地址,多個空格分開
upstream 183.60.83.19:53 183.60.82.98:53 # 設定要使用的上游解析程式解決指向外部域名的在etcd(認為CNAME)中找到的外部域名。
}
cache 600 # 快取600秒
loadbalance # 負載均衡,開啟DNS記錄輪詢策略
forward . 183.60.82.98:53 183.60.83.19:53 # 上面etcd未查詢到的請求轉發給設定的DNS伺服器解析
}


myqcloud.com {
cache 600 myqcloud.com
loadbalance
forward . 119.29.29.29:53
}


tencent-cloud.com {
hosts {
10.210.104.113 cls-i0fxloot.ccs.tencent-cloud.com
10.210.49.4 cls-88b89rhb.ccs.tencent-cloud.com
10.210.104.35 cls-o4rn1235.ccs.tencent-cloud.com
fallthrough
}
}
  • 配置systemd管理coredns服務

[root@node1 ~]# cat /usr/lib/systemd/system/coredns.service
[Unit]
Description=CoreDNS DNS server
Documentation=http://coredns.io
After=network.target


[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=~
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure


[Install]
WantedBy=multi-user.target
[root@node1 ~]#
  • 啟動coredns

[root@node1 ~]# systemctl status coredns
coredns.service - CoreDNS DNS server
Loaded: loaded (/usr/lib/systemd/system/coredns.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-02-15 16:13:43 CST; 4s ago
Docs: http://coredns.io
Main PID: 30288 (coredns)
CGroup: /system.slice/coredns.service
└─30288 /usr/bin/coredns -conf=/etc/coredns/Corefile


Feb 15 16:13:43 node1.rocky.com systemd[1]: Started CoreDNS DNS server.
Feb 15 16:13:43 node1.rocky.com coredns[30288]: .:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: myqcloud.com.:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: tencent-cloud.com.:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: ______ ____ _ _______
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / ____/___ ________ / __ \/ | / / ___/ ~ CoreDNS-1.6.4
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / / / __ \/ ___/ _ \/ / / / |/ /\__ \ ~ linux/amd64, ...dirty
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / /___/ /_/ / / / __/ /_/ / /| /___/ /
Feb 15 16:13:43 node1.rocky.com coredns[30288]: \____/\____/_/ \___/_____/_/ |_//____/
Hint: Some lines were ellipsized, use -l to show in full.
[root@node1 ~]# ^C
[root@node1 ~]# systemctl enable coredns
Created symlink from /etc/systemd/system/multi-user.target.wants/coredns.service to /usr/lib/systemd/system/coredns.service.
  • coredns配置解析記錄

root@node1 ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"10.0.2.4","ttl":10}'
No help topic for 'put'
[root@node1 ~]# export ETCDCTL_API=3
[root@node1 ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"10.0.2.4","ttl":10}'
OK
[root@node1 ~]# vim .bashrc
[root@node1 ~]#
[root@node1 ~]#
[root@node1 ~]# etcdctl put /skydns/com/rocky/node2 '{"host":"10.0.2.8","ttl":10}'
OK
[root@node1 ~]# etcdctl put /skydns/com/rocky/node3 '{"host":"10.0.2.15","ttl":10}'
OK
[root@node1 ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"www.tam3.com","ttl":10}'
OK
[root@node1 ~]#

由於這裡採用的測試環境, 需要結合具體業務進行相關設定。

(五)coredns驗證

[root@node1 ~]# dig @node1 www.tam3.com


; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> @node1 www.tam3.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1734
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1


;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.tam3.com. IN A


;; ANSWER SECTION:
www.tam3.com. 160 IN CNAME tam3.com.
tam3.com. 160 IN A 3.33.152.147
tam3.com. 160 IN A 15.197.142.173


;; Query time: 622 msec
;; SERVER: 10.0.2.4#53(10.0.2.4)
;; WHEN: Tue Feb 15 16:25:24 CST 2022
;; MSG SIZE rcvd: 123

驗證符合預期。

總結

本篇通過兩種不同的形式在雲上實現自建高可用DNS環境來解決企業在雲上的內外網域名解析的需求。以上兩個方案僅供參考,生產環境採用,需結合業務具體需求進行相關配置的調整。同時這裡優先推薦採用騰訊雲的DNS託管服務,有特殊業務需求可參考以上兩個方案結合託管的DNS服務協同來處理。

附錄

(一)DNS常用工具

  • dig用法

dig域名資訊探索者(domain information groper,dig)是查詢工具中最多功能的。常使用的dig的簡單形式如:

  • dig@server domain query-type query-class。

  • dig@dns域名或ip區域記錄型別。

  • nslookup用法

nslookup有兩種模式:互動是和非互動式;互動模式允許使用者向名字伺服器發出對各種主機和域名資訊的查詢請求,或者打印出一個域下面的主機列表.非互動模式只能用於列印所查詢的某個主機或域的名字和請求資訊, 如文章上述測試方法。

  • whois工具

  • http://www.internic.net/whois.html

  • http://whois.cloud.tencent.com/

  • 撥測工具

  • 17ce.com

  • mdig.com

(二)其他參考資料

1.http://www.isc.org/bind/

2.http://coredns.io/

3.http://etcd.io/

4.http://coredns.io/plugins/

5.http://coredns.io/2017/06/08/how-queries-are-processed-in-coredns/

6. http://github.com/coredns/depl oyment/blob/master/systemd/coredns.service

7.http://cloud.tencent.com/document/product/1338

8.http://cloud.tencent.com/developer/article/1748028

9.http://cloud.tencent.com/developer/article/1945211

作者簡介

羅俊

騰訊雲開發者社群【技思廣益·騰訊技術人原創集】作者

騰訊雲TAM,騰訊雲大客戶技術客戶經理,目前負責騰訊雲大客戶雲上架構設計,架構優化,穩定性治理、高可用,容災等相關諮詢與支援服務。對雲原生、開源技術有較深入的研究與熱情。 

推薦閱讀

Kubernetes原理與架構初探

10分鐘搞定!Golang分散式ID集合

C++非同步:asio的coroutine實現!

Go元件:context學習筆記!

:point_down: 點選 「閱讀原文」 註冊成為社 區創作者,認識大咖,打造你的技術影響力!