skydns编译安装
一、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[[email protected] 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[[email protected] ~]# 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[[email protected] google.golang.org]# git clone https://github.com/google/go-genproto
2[[email protected] 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目录下就可以像使用一般的命令一样使用该工具了
其主要使用到的参数说明如下:
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"
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/build-skydns/5477.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.