设为首页 收藏本站
查看: 1724|回复: 0

[经验分享] SkyDNS试用

[复制链接]

尚未签到

发表于 2018-1-6 18:19:49 | 显示全部楼层 |阅读模式
SkyDNS试用

简介
  SkyDNS是kubernetes用于服务发现的默认的开源DNS服务。本文将抛开kubernetes单独体验SkyDNS。其开源在github。依赖与etcd作为数据存储。
  其官方介绍如下:
  Version 2.5.2c
  SkyDNS is a distributed service for announcement and discovery of services built on top of etcd. It utilizes DNS queries to discover available services. This is done by leveraging SRV records in DNS, with special meaning given to subdomains, priorities and weights.
  This is the original announcement blog post for version 1. Since then, SkyDNS has seen some changes, most notably the ability to use etcd as a backend. Here you can find the SkyDNS2 announcement.

启动etcd服务
  本文中将使用单机版etcd作为其服务。etcd发布版本下载可能需要FQ。

启动etcd
  下载完成后解压,在解压目录中执行./etcd即可运行服务。

部署SkyDNS

安装SkyDNS
  使用go get -u github.com/skynetservices/skydns即可将SkyDNS所需的文件从源码中下载并编译完成,位置位于$GOPATH/bin。
  如果$GOPATH/bin在系统环境变量PATH中,则可以直接在终端模拟器(命令行)中执行skydns,如在我测试机上执行查看帮助如下:
  

sope:~ goyoo$ skydns --help  
Usage of skydns:
  -addr string
  ip:port to bind to (SKYDNS_ADDR) (default "127.0.0.1:53")
  -ca-cert string
  CA Certificate
  -discover
  discover new machines by watching /v2/_etcd/machines
  -dnssec string
  basename of DNSSEC key file e.q. Kskydns.local.+005+38250
  -domain string
  domain to anchor requests to (SKYDNS_DOMAIN) (default "skydns.local.")
  -hostmaster string
  hostmaster email address to use (default "hostmaster@skydns.local.")
  -local string
  optional unique value for this skydns instance
  -machines string
  machine address(es) running etcd
  -nameservers string
  nameserver address(es) to forward (non-local) queries to e.g. 8.8.8.8:53,8.8.4.4:53
  -no-rec
  do not provide a recursive service
  -path-prefix string
  backend(etcd) path prefix, default: skydns (default "skydns")
  -rcache int
  capacity of the response cache
  -rcache-ttl int
  TTL of the response cache (default 60)
  -round-robin
  round robin A/AAAA replies (default true)
  -rtimeout duration
  read timeout (default 2s)
  -scache int
  capacity of the signature cache (default 10000)
  -stubzones
  support stub zones
  -systemd
  bind to socket(s) activated by systemd (ignore -addr)
  -tls-key string
  TLS Private Key path
  -tls-pem string
  X509 Certificate
  -verbose
  log queries
  

  

环境变量
  设置etcd的环境变量ETCD_MACHINES,如果未设置SkyDNS将使用默认的http://127.0.0.1:4001来连接etcd,或者使用-machines选项。可以通过设置-discover来启用自动发现新添加到网络中的机器。因启动时需要占用53端口,需要使用sudo执行。
  

export ETCD_MACHINES='http://192.168.0.1:4001,http://192.168.0.2:4001'  
skydns
  

  

  推荐方式设置nameserver:
  

curl -XPUT http://127.0.0.1:4001/v2/keys/skydns/local/skydns/dns/ns/ns1 \  -d value='{"host":"192.168.0.1"}'
  

  

参数说明
  SkyDNS的配置文件都是作为JSON对象存储在etcd的key/skydns/config下。以下是可能需要设置的参数:


  • dns_addr: SkyDNS需要监听的IP:port,默认127.0.0.1:53
  • domain: SkyDNS 专属域名,默认skydns.local.
  • dnssec:开启DNSSEC
  • hostmaster:主机管理者邮件地址
  • local:可选的SkyDNS实体的唯一值,默认为空。当查询local.dns.skydns.local时返回这个值
  • round_robin:开启A的AAAA响应的round-robin功能,默认true。注意包中包含不止一个CNAME被免除
  • nameservers:当不属于当前DNS中记录时,转发(递归)DNS请求至nameservers(IP:port的数组),默认转到/etc/resolv.conf中的服务列表
  • no_rec:不提供递归服务(如:转发至在-nameservers)提供的服务列表
  • read_timeout:DNS与etcd的网络通讯超时
  • ttl:当etcd中未设置时,默认以秒为单位来作为应答时间,默认时间为3600
  • min_ttl: 使用NXDOMAIN的最小ttl时间设置,默认为30
  • scache: DNSSEC签名的容量,默认10000条记录
  • rcache: 响应缓存,默认为0条消息
  • rcache_ttl: 缓存响应ttl,默认为60
  • systemd: 绑定到由systemd激活的socket,将会忽略-addr
  • path-prefix: 后台(etcd)路径前缀,默认为skydns(例如:如果设置为mydns,SkyDNS的配置对象将存储在key为/mydns/config路径下)
初始化

测试SkDNS
  在未初始化时进行以下测试,从结果中可以看出,当前DNS服务继承了宿主机上的DNS,当当前记录在SkyDNS中未找到时,会轮训宿主机上配置的DNS
  sope:~ goyoo$ dig @localhost baidu.com
  ; <<>> DiG 9.8.3-P1 <<>> @localhost baidu.com
  ; (2 servers found)
  ;; global options: +cmd
  ;; Got answer:

  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR,>  ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 5, ADDITIONAL: 5
  ;; QUESTION SECTION:
  ;baidu.com. IN A
  ;; ANSWER SECTION:
  baidu.com. 600 IN A 123.125.114.144
  baidu.com. 600 IN A 111.13.101.208
  baidu.com. 600 IN A 220.181.57.217
  baidu.com. 600 IN A 180.149.132.47
  ;; AUTHORITY SECTION:
  baidu.com. 10940 IN NS ns2.baidu.com.
  baidu.com. 10940 IN NS ns4.baidu.com.
  baidu.com. 10940 IN NS dns.baidu.com.
  baidu.com. 10940 IN NS ns3.baidu.com.
  baidu.com. 10940 IN NS ns7.baidu.com.
  ;; ADDITIONAL SECTION:
  dns.baidu.com. 168235 IN A 202.108.22.220
  ns2.baidu.com. 172699 IN A 61.135.165.235
  ns3.baidu.com. 13330 IN A 220.181.37.10
  ns4.baidu.com. 11265 IN A 220.181.38.10
  ns7.baidu.com. 6547 IN A 119.75.219.82
  ;; Query time: 2005 msec
  ;; SERVER: 127.0.0.1#53(127.0.0.1)
  ;; WHEN: Sat Oct 10 13:39:03 2015

  ;; MSG>  从上面的结果可以看出,没有在etcd中初始化也是可以解析的
  初始化etcd数据,当设置初始化数据之后SkyDNS服务需要重启才能生效,此时继承的dns为谷歌的DNS。
  

sope:~ goyoo$ etcdctl set /skydns/config '{"dns_addr":"127.0.0.1:53","ttl":3600,"nameservers": ["8.8.8.8:53","8.8.4.4:53"]}'  

  

  先测试一个不存在的域名test1.shenshouer.skydns.local,从下列结果中可以看出当前域名的应答数为0,说明不存在。
  sope:~ goyoo$ dig @localhost test1.shenshouer.skydns.local
  ; <<>> DiG 9.8.3-P1 <<>> @localhost test1.shenshouer.skydns.local
  ; (2 servers found)
  ;; global options: +cmd
  ;; Got answer:

  ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN,>  ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
  ;; QUESTION SECTION:
  ;test1.shenshouer.skydns.local. IN A
  ;; AUTHORITY SECTION:
  com. 899 IN SOA a.gtld-servers.net. nstld.verisign-grs.com. 1444455889 1800 900 604800 86400
  ;; Query time: 125 msec
  ;; SERVER: 127.0.0.1#53(127.0.0.1)
  ;; WHEN: Sat Oct 10 13:44:55 2015

  ;; MSG>  添加不存在的域名test1.shenshouer.skydns.local,并进行检查发现有一个应答,并将此域名映射到localhost上,注意是映射到localhost或者127.0.0.1上,如果是指定的其他域名,如test1.skydns.local的话,则必须去指定test1.skydns.local域名的CNAME记录:
  sope:~ goyoo$ etcdctl set /skydns/local/skydns/shenshouer/test1. ‘{“host”:“localhost”}’
  {“host”:”localhost”,”port”:8080}
  sope:~ goyoo$ dig @localhost SRV test1.shenshouer.skydns.local
  ; <<>> DiG 9.8.3-P1 <<>> @localhost SRV test1.shenshouer.skydns.local
  ; (2 servers found)
  ;; global options: +cmd
  ;; Got answer:

  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR,>  ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
  ;; QUESTION SECTION:
  ;test1.shenshouer.skydns.local. IN SRV
  ;; ANSWER SECTION:
  test1.shenshouer.skydns.local. 3600 IN SRV 10 100 8080 localhost.
  ;; Query time: 1 msec
  ;; SERVER: 127.0.0.1#53(127.0.0.1)
  ;; WHEN: Sat Oct 10 14:01:34 2015

  ;; MSG>  解析测试OK。
  将本机的配置的其他DNS服务IP地址全部删除,只配置一个127.0.0.1。此时,在访问域名的时候如果记录不存在SkyDNS中,访问不到,则SkyDNS将轮询谷歌DNS服务。此时再在本地开启一个端口为30001的web服务,当访问此服务时会返回请求端的IP地址,用于测试。
  使用nslookup测试,从结果中可以看到已经能够正常解析了:
  

sope:~ goyoo$ nslookup test1.shenshouer.skydns.local  
Server:     127.0.0.1
  
Address:    127.0.0.1#53
  
Name:   test1.shenshouer.skydns.local
  
Address: 127.0.0.1
  

  

  再试试使用curl是否能够基于域名能够访问本地服务:
  

sope:~ goyoo$ curl test1.shenshouer.skydns.local  
curl: (7) Failed to connect to test1.shenshouer.skydns.local port 80: Connection refused
  

  

  从以上结果中可以看出域名已经访问当了localhost,但请求的为默认的80端口。在请求的域名后面新增30001端口试试:
  

sope:~ goyoo$ curl test1.shenshouer.skydns.local:30001  
127.0.0.1:60358
  
sope:~ goyoo$
  

  

  从以上结果中可以看出添加端口后服务访问正常。
  但此时只增加了SRV记录,如果test1.shenshouer.skydns.local映射到的不是localhost而是test1.skydns.local,则使用nslookup测试会出现不能解析域名的问题,此时需要给域名test1.skydns.local再新增一条SRV记录,且必须映射到具体的IP地址或可访问的域名,此时叫做新增CNAME记录。
  为test1.shenshouer.skydns.local新增CNAME记录,具体操作如下:
  

// 先清理掉已经添加的任何域名信息  
sope:~ goyoo$ etcdctl rm --recursive /skydns/local
  
// 新增test1.shenshouer.skydns.local
  
sope:~ goyoo$ etcdctl set /skydns/local/skydns/shenshouer/test1. '{"host":"test1.skydns.local","port":8080}'
  
// 新增test1.skydns.local
  
etcdctl set /skydns/local/skydns/test1 '{"host":"127.0.0.1","port":30001}'
  

  

  此时CNAME记录新增完成。
  SkyDNS还有子域名、MX记录、TXT记录、NS记录、PTR记录(域名反转地址)等系列功能,本文中不做尝试
  http://blog.csdn.net/shenshouer/article/details/49025239
  https://github.com/skynetservices/skydns

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432311-1-1.html 上篇帖子: 逆向 AWS API 设计 下篇帖子: 【转】微服务实战(六):选择微服务部署策略
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表