天天看點

使用 etcdctl 修改 etcd 實作 Coredns 的解析規則

# Corefile ...

# etcd Plugins
# https://coredns.io/plugins/etcd/

.:53 {	                # 監聽tcp和udp的53端口
   etcd {               # 配置啟用etcd插件,後面可以指定域名,例如 etcd test.com {
       stubzones        # 啟用存根區域功能,stubzone僅在位于指定的第一個區域下方的etcd樹中完成
       path /coredns    # etcd裡面的路徑,預設是 /skydns,所有DNS記錄都是存儲在該存根路徑下
       endpoint http://localhost:2379     # etcd通路位址
       # 設定要使用的上遊解析程式解決指向外部域名的在etcd(認為CNAME)中找到的外部域名
       upstream 8.8.8.8:53 8.8.4.4:53 /etc/resolv.conf   
       fallthrough      # 如果區域比對但不能生成記錄,則将請求傳遞給下一個插件
       # tls CERT KEY CACERT # 可選參數,etcd認證證書設定
   }
   prometheus           # 監控插件
   cache 160
   loadbalance          # 負載均衡,開啟DNS記錄輪詢政策
   proxy . 8.8.8.8:53 8.8.4.4:53 /etc/resolv.conf  # 上面etcd未查詢到的請求轉發給設定的DNS伺服器解析
   log                  # 列印日志
}

# -----------------------------------------------------

# Coredns使用etcd的v3版api添加資料,etcdctl指令預設使用v2,是以需如下修改
echo 'export ETCDCTL_API=3' >> ~/.bash_profile
export ETCDCTL_API=3

# ----------------------------------------------------- A

etcdctl put /coredns/com/leffss/www '{"host":"1.1.1.1","ttl":10}' 
# etcd的目錄結構和域名是相反的,上面路徑表示域名 www.leffss.com,ttl值設定60s後其每60s到etcd讀一次此域名的記錄

# 驗證上述配置
dig @localhost +short www.leffss.com 
# 1.1.1.1

# 添加多條記錄測試coredns的輪詢功能
etcdctl put /coredns/com/leffss/www/x1 '{"host":"1.1.1.2","ttl":10}'
etcdctl put /coredns/com/leffss/www/x2 '{"host":"1.1.1.3","ttl":10}'
# x1和x2可自定義如a、b、c等,并且設定多個AAAA、CNAME等方法類似
# 添加 /coredns/com/leffss/www/{x1,x2} 後請求www.leffss.com就不會再讀取/coredns/com/leffss/www
# 可用 etcdctl del /coredns/com/leffss/www 删除值
# 若想取消輪詢需删除 /coredns/com/leffss/www/{x1,x2}

# 驗證上述配置
dig @localhost +short www.leffss.com 
# 1.1.1.2 
# 1.1.1.3

# ----------------------------------------------------- AAAA

etcdctl put /coredns/com/leffss/www '{"host":"1002::4:2","ttl":10}' 
dig -t AAAA @localhost +short www.leffss.com 
# 1002::4:2

# ----------------------------------------------------- CNAME

etcdctl put /coredns/com/leffss/www '{"host":"www.baidu.com","ttl":10}' 
# 這裡cname設定成外部百度域名,按理說coredns應該也把這個cname記錄繼續解析成www.baidu.cm的IP
# 但經測試發現請求www.leffss.com隻能解析到CNAME:www.baidu.com,無法繼續解析,原因未知 ...

# 驗證上述配置
dig -t CNAME @localhost +short www.leffss.com 
# www.baidu.com.

# ----------------------------------------------------- SRV

etcdctl put /coredns/com/leffss/www '{"host":"www.baidu.com","port":80,"priority":10,"ttl":10}'
# SRV記錄和CNAME類似,隻是多了port,它們的添加方法其實可以通用

# 驗證上述配置
dig -t SRV @localhost +short www.leffss.com 
# 10 100 80 www.baidu.com.

# ----------------------------------------------------- TXT

etcdctl put /coredns/com/leffss/www '{"text":"This is text!","ttl":10}'

# 驗證上述配置
dig -t TXT @localhost +short www.leffss.com 
# "This is text!"