今天來聊聊skydns,在k8s中默認使用skydns做服務發現,比起單純的etcd和consul來做服務發現,skydns有哪些優勢?從名字上就能看出來,使用dns機制做服務發現,而數據則是存儲在etcd中的。看看官方如何介紹的:SkyDNS是一種分佈式服務,用於在etcd之上構建服務發現,它利用DNS查詢來發現可用的服務,這是通過利用DNS中的SRV記錄來完成的。
SRV?大家平常可能CNAME和A記錄用的多,SRV是個什麼東西?SRV是DNS記錄中一種,用來指定服務地址,與常見的A記錄、cname不同。SRV中除了記錄服務器的地址,還記錄了服務的端口,並且可以設置每個服務地址的優先級和權重,訪問服務的時候,本地的DNS resolver從DNS服務器查詢到一個地址列表,根據優先級和權重,從中選取一個地址作爲本次請求的目標地址。
環境
ubuntu16.04-1 | etcd3 | skydns | 172.31.68.241 |
ubuntu16.04-3 | client |
ps:環境爲之前的docker swarm集羣機器
部署
啓動etcd
/opt/programs/etcd_3.3.9/etcd --name ubuntu16.04-1 --data-dir /var/lib/etcd --listen-client-urls http://172.31.68.241:2379 --listen-peer-urls http://172.31.68.241:2380 --advertise-client-urls http://172.31.68.241:2379 --initial-advertise-peer-urls http://172.31.68.241:2380
編譯skydns
go get github.com/skynetservices/skydns
cd $GOPATH/src/github.com/skynetservices/skydns
go build -v
ps:你大概率用現在github上代碼是編譯不通的,最新版2.5.3a竟然是2015年的版本,在容器化日新月異的今天,這樣軟件能跟上社區潮流?乾的過consul?既然無法編譯通過,那就直接下載編譯好的唄
wget 'https://dl.fedoraproject.org/pub/fedora/linux/releases/27/Everything/x86_64/os/Packages/s/skydns-2.5.3-0.1.a.git8688008.fc24.x86_64.rpm'
啓動skydns
export ETCD_MACHINES='http://172.31.68.241:2379'
./skydns -addr 172.31.68.241:53 -domain test.nn -nameservers 202.96.209.133:53
ps:skydns設置一個自定義的domain叫test.nn。skydns -v可以看到相關參數的解釋,一定要在啓動之前設置後端etcd地址的環境變量
實驗
設置NS
./etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/dns/ns '{"host":"172.31.68.241"}'
{"host":"172.31.68.241"}
ps:如果有多個ns記錄,則是/skydns/nn/test/dns/ns/ns1..10 '{}'來設置ns記錄,NS的記錄值只能是ip,不能是name,ns記錄一般在etcd中存儲在'domain'/dns/ns下面
查看
dig @172.31.68.241 -t NS test.nn
Wildcards查找
etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/host '{"host": "172.31.68.245"}'
etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/host2 '{"host": "www.google.com","port":8080}'
etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/host3 '{"host": "172.31.68.246"}'
ps:添加了三個服務,兩個是ip,一個是域名
查看
ps:可以看出所有的test.nn記錄都被找到了
CNAME查詢
dig @172.31.68.241 SRV host2.test.nn
查看
ps:可以看到先把host2.test.nn解析成www.google.com,由於我們在啓動skydns的時候設置了上級dns,所以會利用上級的公網dns再把www.google.com解析成一個具體的地址
SRV查詢
dig @172.31.68.241 SRV host2.test.nn
查看
ps:注意看SRV的權重和端口
LB查詢
domain爲pp.test.nn
./etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/pp/x1 '{"host": "172.31.68.21"}'
./etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/pp/x2 '{"host": "172.31.68.22"}'
./etcdctl --endpoint http://172.31.68.241:2379 set /skydns/nn/test/pp/x3 '{"host": "172.31.68.23"}'
查看
SRV多記錄
Groups
/skydns/local/domain/
/skydns/local/domain/a - {"host": "127.0.0.1", "group": "g1"}
/skydns/local/domain/b - {"host": "127.0.0.2", "group": "g1"}
/skydns/local/domain/subdom/
/skydns/local/domain/subdom/c - {"host": "127.0.0.3", "group": "g2"}
/skydns/local/domain/subdom/d - {"host": "127.0.0.4", "group": "g2"}
ps:當你查詢domain.local的時候,會返回127.0.0.1和127.0.0.2,當你查詢subdom.domain.local的時候,會返回127.0.0.3和127.0.0.4
看起來只要信息註冊到etcd後,skydns可以做到簡單的服務發現,但是比起consul有什麼優勢?skydns沒有自己的存儲,consul自成一體,看來要涼涼的節奏....