etcdhosts 插件簡介
etcdhosts 顧名思義,就是将 hosts 檔案存儲在 Etcd 中,然後多個 CoreDNS 共享一份 hosts 檔案;得益于 Etcd 提供的 watch 功能,當 Etcd 中的 hosts 檔案更新時,每台 CoreDNS 伺服器都會接到推送,同時完成熱重載;etcdhosts 基本架構如下:
+-----------------------------------------------------------------------------+
| |
| +-----------+ |
| | | |
| | CoreDNS +---------------------+ |
| | | | |
| +-----------+ | +------------------+ |
| | | | |
| +--------v---------+ | | |
| +-----------+ | | | | |
| | | | | | dnsctl or | |
| | CoreDNS +------------> Etcd Cluster <------+ other etcd tool | |
| | | | | | | |
| +-----------+ | | | | |
| +---------^--------+ | | |
| | | | |
| +-----------+ | +------------------+ |
| | | | |
| | CoreDNS +----------------------+ |
| | | |
| +-----------+ |
| |
| |
+-----------------------------------------------------------------------------+
複制
編譯 CoreDNS
etcdhosts release 頁已經提供部分版本的預編譯檔案,可以直接下載下傳使用。
etcdhosts 作為一個 CoreDNS 擴充插件采用直接偶合的方式編寫(未采用 gRPC 是因為考慮性能影響),這意味着需要重新編譯 CoreDNS 來內建插件,以下為 CoreDNS 編譯過程(使用 docker):
# clone source code
git clone https://github.com/ytpay/etcdhosts.git
# build
cd etcdhosts && ./build v1.8.0
複制
編譯完成後将在
build
目錄下生成各個平台的二進制檔案壓縮包。
搭建 Etcd 叢集
Etcd 叢集搭建将直接采用 deb 安裝包,具體細節這裡不再闡述,本次搭建系統為 Ubuntu 20,以下為搭建步驟。
2.1、安裝軟體包
# 下載下傳 cfssl 安裝包,用于簽署證書
wget https://github.com/mritd/etcd-deb/releases/download/v3.4.13/cfssl_1.4.1_amd64.deb
# 下載下傳 etcd 安裝包
wget https://github.com/mritd/etcd-deb/releases/download/v3.4.13/etcd_3.4.13_amd64.deb
# 執行安裝
dpkg -i cfssl_1.4.1_amd64.deb etcd_3.4.13_amd64.deb
複制
2.2、建立證書
建立證書需要先修改證書配置檔案(
etcd-csr.json
)然後借助 cfssl 工具來建立證書
/etc/etcd/cfssl/etcd-csr.json
{
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"O": "etcd",
"OU": "etcd Security",
"L": "Beijing",
"ST": "Beijing",
"C": "CN"
}
],
"CN": "etcd",
"hosts": [
"127.0.0.1",
"localhost",
"*.etcd.node",
"*.kubernetes.node",
+ "172.16.11.71",
+ "172.16.11.72",
+ "172.16.11.73"
]
}
複制
通過腳本建立證書
cd /etc/etcd/cfssl
./create.sh
cp *.pem /etc/etcd/ssl
複制
證書建立完成後需要分發到其他兩台機器上,保證三台節點的
/etc/etcd/ssl
目錄證書相同。
# 複制證書
scp /etc/etcd/ssl/*.pem root@NODE2:/etc/etcd/ssl
scp /etc/etcd/ssl/*.pem root@NODE3:/etc/etcd/ssl
# 修複權限(三台都要修複)
chown -R etcd:etcd /etc/etcd/
複制
2.3、調整叢集配置
證書簽署完成後,簡單的調整每台機器上的叢集節點配置即可
/etc/etcd/etcd.conf
# [member]
+ # 節點号自行修改,推薦格式: etcd+節點IP,例如 etcd21
+ ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/data"
ETCD_WAL_DIR="/var/lib/etcd/wal"
ETCD_SNAPSHOT_COUNT="100"
+ # 修改為目前機器 IP
+ ETCD_LISTEN_PEER_URLS="https://172.16.11.71:2380"
+ # 修改為目前機器 IP
+ ETCD_LISTEN_CLIENT_URLS="https://172.16.11.71:2379,http://127.0.0.1:2379"
ETCD_QUOTA_BACKEND_BYTES="8589934592"
ETCD_MAX_REQUEST_BYTES="10485760"
# [cluster]
+ # 修改為目前機器 IP
+ ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.16.11.71:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
+ # 三台機器都要按照格式寫好
+ ETCD_INITIAL_CLUSTER="etcd1=https://172.16.11.71:2380,etcd2=https://172.16.11.72:2380,etcd3=https://172.16.11.73:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
+ # 修改為目前機器 IP
+ ETCD_ADVERTISE_CLIENT_URLS="https://172.16.11.71:2379"
ETCD_AUTO_COMPACTION_MODE="revision"
ETCD_AUTO_COMPACTION_RETENTION="16"
ETCD_QUOTA_BACKEND_BYTES="5368709120"
# [security]
ETCD_CERT_FILE="/etc/etcd/ssl/etcd.pem"
ETCD_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
ETCD_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-root-ca.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_AUTO_TLS="true"
ETCD_PEER_CERT_FILE="/etc/etcd/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-root-ca.pem"
ETCD_PEER_AUTO_TLS="true"
複制
最後每台機器執行
systemctl start etcd
啟動即可,驗證叢集是否健康可以使用如下指令測試:
etcdctl endpoint health --cert /etc/etcd/ssl/etcd.pem --key /etc/etcd/ssl/etcd-key.pem --cacert /etc/etcd/ssl/etcd-root-ca.pem --endpoints https://172.16.11.71:2379,https://172.16.11.72:2379,https://172.16.11.73:2379
https://172.16.11.71:2379 is healthy: successfully committed proposal: took = 33.07493ms
https://172.16.11.72:2379 is healthy: successfully committed proposal: took = 32.132266ms
https://172.16.11.73:2379 is healthy: successfully committed proposal: took = 40.745291ms
複制
搭建 CoreDNS 叢集
3.1、CoreDNS 安裝
系統級 CoreDNS 安裝推薦直接使用 systemd 管理,官方目前提供了 systemd 相關配置檔案: https://github.com/coredns/deployment/tree/master/systemd
# 安裝二進制檔案
tar -zxvf coredns_1.8.0_linux_amd64.tgz
mv coredns /usr/bin/coredns
# 安裝 systemd 配置
wget https://raw.githubusercontent.com/coredns/deployment/master/systemd/coredns-sysusers.conf -O /usr/lib/sysusers.d/coredns-sysusers.conf
wget https://raw.githubusercontent.com/coredns/deployment/master/systemd/coredns-tmpfiles.conf -O /usr/lib/tmpfiles.d/coredns-tmpfiles.conf
wget https://raw.githubusercontent.com/coredns/deployment/master/systemd/coredns.service -O /usr/lib/systemd/system/coredns.service
# reload
systemctl daemon-reload
# 初始化使用者
systemd-sysusers
# 初始化臨時目錄
systemd-tmpfiles --create
# 建立配置目錄
mkdir -p /etc/coredns/ssl
複制
3.2、etcdhosts 配置
etcdhosts 的配置類似官方的 etcd 插件,其配置格式如下:
etcdhosts [ZONES...] {
[INLINE]
ttl SECONDS
no_reverse
fallthrough [ZONES...]
key ETCD_KEY
endpoint ETCD_ENDPOINT...
credentials ETCD_USERNAME ETCD_PASSWORD
tls ETCD_CERT ETCD_KEY ETCD_CACERT
timeout ETCD_TIMEOUT
}
複制
以下是一個簡單的可啟動的樣例配置:
/etc/coredns/Corefile
. {
# 綁定接口位址
bind 172.16.11.71
# cache
cache 30 . {
success 4096
}
# etcdhosts 配置
etcdhosts . {
fallthrough .
key /etcdhosts
timeout 5s
tls /etc/coredns/ssl/etcd.pem /etc/coredns/ssl/etcd-key.pem /etc/coredns/ssl/etcd-root-ca.pem
endpoint https://172.16.11.71:2379 https://172.16.11.72:2379 https://172.16.11.73:2379
}
# 上遊 DNS 配置
forward . 114.114.114.114:53 {
max_fails 2
expire 20s
policy random
health_check 0.2s
}
# 日志配置
errors
log . "{remote}:{port} - {>id} \"{type} {class} {name} {proto} {size} {>do} {>bufsize}\" {rcode} {>rflags} {rsize} {duration}"
}
複制
由于 etcdhosts 插件需要連接配接 etcd 叢集,是以需要将證書複制到
Corefile
指定的位置:
# 實際生産環境 coredns 與 etcd 一般不在一台機器上,請自行 scp
cp /etc/etcd/ssl/*.pem /etc/coredns/ssl
# 修複權限
chown -R coredns:coredns /etc/coredns
複制
最後直接啟動即可(首次啟動會出現
[ERROR] plugin/etcdhosts: invalid etcd response: 0
錯誤,屬于正常情況):
# 啟動
systemctl start coredns
# 測試
dig @172.16.11.71 baidu.com
; <<>> DiG 9.16.1-Ubuntu <<>> @172.16.11.71 baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35323
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 8e3137531ed0b57a (echoed)
;; QUESTION SECTION:
;baidu.com. IN A
;; ANSWER SECTION:
baidu.com. 30 IN A 220.181.38.148
baidu.com. 30 IN A 39.156.69.79
;; Query time: 8 msec
;; SERVER: 172.16.11.71#53(172.16.11.71)
;; WHEN: Mon Nov 16 20:18:25 CST 2020
;; MSG SIZE rcvd: 100
複制
最後在多台機器上通過同樣的配置啟動 CoreDNS 即可,此時所有 CoreDNS 伺服器通過 Etcd 提供一緻性的記錄解析。
記錄調整
所有 CoreDNS 啟動成功後,預設 etcdhosts 插件将會讀取 Etcd 中的
/etcdhosts
key 作為 hosts 檔案載入;載入成功後将會在記憶體級進行 Cache,多次查詢不會造成瘋狂的 Etcd 請求,隻有當觸發 reload 時(包括 Etcd 更新)才會重新查詢 Etcd。是以此時隻需要向 Etcd 的
/etcdhosts
key 寫入一個 hosts 檔案即可;寫入 Etcd 可以使用 etcdctl 以及其他的開源工具,甚至自己開發都可以,記錄更改隻需要跟 Etcd 打交道,不需要理會 CoreDNS;由于本人實在是比較菜,前端頁面寫不出來,是以弄了一個指令行版本的工具: dnsctl
dnsctl 隻有一個可執行檔案,預設情況下 dnsctl 讀取
$HOME/.dnsctl.yaml
配置檔案來溝通 Etcd,配置檔案格式如下:
# etcd 中 etcdhosts 插件的 key
dnskey: /etcdhosts
# etcd 叢集配置
etcd:
cert: /etc/etcd/ssl/etcd.pem
key: /etc/etcd/ssl/etcd-key.pem
ca: /etc/etcd/ssl/etcd-root-ca.pem
endpoints:
- https://172.16.11.71:2379
- https://172.16.11.72:2379
- https://172.16.11.73:2379
複制
dnsctl 提供如下指令
dnsctl for etcdhosts plugin
Usage:
dnsctl [flags]
dnsctl [command]
Available Commands:
config show example config
dump dump hosts
edit edit hosts
help Help about any command
upload upload hosts from file
version show hosts version
Flags:
--config string config file (default is $HOME/.dnsctl.yaml)
-h, --help help for dnsctl
-v, --version version for dnsctl
Use "dnsctl [command] --help" for more information about a command.
複制
其中
edit
指令将會打開系統預設編輯器(例如 vim),然後編輯完儲存後會自動上傳到 Etcd 中,此後 CoreDNS 的 etcdhosts 插件将會立即重載;
dump
指令用于将 Etcd 中的 hosts 檔案儲存到本地用于備份,
upload
指令可以将已有的 hosts 檔案上傳到 Etcd 用于恢複。
本文轉載自:「 Bleem 」,原文:https://tinyurl.com/y5sgwryn ,版權歸原作者所有。歡迎投稿,投稿郵箱: [email protected]。