今天来聊聊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自成一体,看来要凉凉的节奏....