一、skydns概述

SkyDNS是kubernetes用于服务发现的默认的开源DNS服务,其开源在github。使用etcd作为数据存储。由于其在配置DNS信息时,几乎可以实时生效,所以SkyDNS比较适用于服务的动态注册。

二、编译安装

根据官方的示例,编译安装非常简单,如下:

1go get github.com/skynetservices/skydns
2cd $GOPATH/src/github.com/skynetservices/skydns
3go build -v

不过由于golang网站是被墙的,所以很多依赖包在下载的时候会有问题 。在编译的时候也可能会碰到这样或哪样的问题,这里将编译过程中可能遇到的问题记录下。

错误1:缺少net包

1[root@361way.com local]# go get github.com/skynetservices/skydns
2package golang.org/x/net/context: unrecognized import path "golang.org/x/net/context" (https fetch: Get https://golang.org/x/net/context?go-get=1: unexpected EOF)
3package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: unexpected EOF)
4package context: unrecognized import path "context" (import path does not begin with hostname)

解决方法:由于github 上也有这部分包,可以通过git clone将所需的包下载到相应的位置即可。比如我的$GOPATH位于/root/go/src下,可以使用以下命令下载依赖包到对应的位置

1git clone  https://github.com/golang/net  /root/go/src/golang.org/x/net

错误2:golang版本问题

错误内容如下:

1package context: unrecognized import path "context" (import path does not begin with hostname)

我编译使用的环境是centos7 ,默认yum源安装的go版本是1.6.3。网上查了下上面对应的报错信息,提示说是版本过低 。由于被墙的原因,这里选择国内镜像站下载 。具体安装步骤省略,可以参看我之前的博文---Golang的安装

错误3:找不到genproto包

1[root@361way.com ~]# go get github.com/skynetservices/skydns
2package google.golang.org/genproto/googleapis/rpc/status: unrecognized import path "google.golang.org/genproto/googleapis/rpc/status" (https fetch: Get https://google.golang.org/genproto/googleapis/rpc/status?go-get=1: unexpected EOF)

这个也可以从github上找,不过其对应的名称目前为go-genproto 。解决方法如下:

1[root@361way.com google.golang.org]# git clone https://github.com/google/go-genproto
2[root@361way.com google.golang.org]# mv go-genproto  genproto

不过编译出的文件有点大,可以通过使用如下参数,将编译的大小减小:

1go build -ldflags "-s -w" 

‘-s’ 相当于strip掉符号表, 但是以后就没办法在gdb里查看行号和文件了。 ‘-w’ flag to the linker to omit the debug information 告知连接器放弃所有debug信息 。如果还想进一步减小文件大小,可以使用upx 进行压缩。

三、使用

将编译好的skydns文件copy到其他主机的/usr/local/bin目录下就可以像使用一般的命令一样使用该工具了

go-build-skydns
go-build-skydns

其主要使用到的参数说明如下:

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

四、RHEL7下配置开机自启动

RHEL7下使用了systemctl 进行自启动管理,具体使用命令如下:

 1# systemctl status skydns
 2skydns.service - SkyDNS service
 3   Loaded: loaded (/usr/lib/systemd/system/skydns.service; enabled)
 4   Active: active (running) since 四 2017-03-23 18:41:19 CST; 2 months 17 days ago
 5 Main PID: 21665 (skydns)
 6   CGroup: /system.slice/skydns.service
 7           └─21665 /usr/local/bin/skydns -no-rec
 83月 23 18:41:19 ZJHZ-CMREAD-ETCD01-VBUS-SD systemd[1]: Started SkyDNS service.
 93月 23 18:41:19 ZJHZ-CMREAD-ETCD01-VBUS-SD skydns[21665]: 2017/03/23 18:41:19 skydns: falling back to default configuration, could not read from etcd: 100: Key not found (/skydns/con... [41898257]
103月 23 18:41:19 ZJHZ-CMREAD-ETCD01-VBUS-SD skydns[21665]: 2017/03/23 18:41:19 skydns: metrics enabled on :5300/metrics
113月 23 18:41:19 ZJHZ-CMREAD-ETCD01-VBUS-SD skydns[21665]: 2017/03/23 18:41:19 skydns: ready for queries on migu. for tcp://0.0.0.0:53 [rcache 0]
123月 23 18:41:19 ZJHZ-CMREAD-ETCD01-VBUS-SD skydns[21665]: 2017/03/23 18:41:19 skydns: ready for queries on migu. for udp://0.0.0.0:53 [rcache 0]
13Hint: Some lines were ellipsized, use -l to show in full.

/usr/lib/systemd/system/skydns.service 服务文件配置如下:

 1# cat /usr/lib/systemd/system/skydns.service
 2[Unit]
 3Description=SkyDNS service
 4After=etcd.service
 5[Service]
 6Type=simple
 7EnvironmentFile=-/etc/skydns/skydns.conf
 8User=root
 9ExecStart=/usr/local/bin/skydns -no-rec
10[Install]
11WantedBy=multi-user.target

引用的/etc/skydns/skydns.conf 文件配置格式如下:

 1# cat /etc/skydns/skydns.conf
 2[basic]
 3# list of etcd machines, "http://localhost:4001,http://etcd.example.com:4001"
 4ETCD_MACHINES="http://192.168.23.244:2379,http://192.168.23.245:2379,http://192.168.43.91:2379"
 5# path of TLS client certificate - private key
 6#ETCD_TLSKEY=""
 7# path of TLS client certificate - public key
 8#ETCD_TLSPEM=""
 9# path of TLS certificate authority public key
10#ETCD_CACERT=""
11# specify address to bind to
12SKYDNS_ADDR="0.0.0.0:53"
13# set a default domain if not specified by etcd config
14SKYDNS_DOMAIN="migu"
15# set a list of nameservers to forward DNS requests to when not authoritative for a domain, "8.8.8.8:53,8.8.4.4:53"
16#SKYDNS_NAMESERVERS=""
17# [statistics]
18#GRAPHITE_SERVER=""
19#GRAPHITE_PREFIX=""
20#STATHAT_USER=""
21# [prometheus]
22# port where the HTTP server for prometheus will run
23PROMETHEUS_PORT="5300"
24# path for the metrics, defaults to /metrics
25PROMETHEUS_PATH="/metrics"
26# namespace used in the metrics, no default
27PROMETHEUS_NAMESPACE="migu"
28# subsystem used in the metric, defaults to skydns
29PROMETHEUS_SUBSYSTEM="skydns"