本文主要对coredns的源码进行编译安装,以及在编译安装的过程中加入一些External Plugins的方法。
1、编译安装coredns
1.1 golang环境准备
官方的github页面上提供了编译安装的相关指引,需要的可以点击这里跳转。
First, make sure your golang version is 1.12 or higher as
go mod
support is needed. See here forgo mod
details.
由于coredns是使用golang编写,因此对其进行编译安装之前需要先配置go环境。而在centos中使用yum安装的go版本较旧,我们直接去官网下载最新的版本进行解压即可。
wget https://golang.org/dl/go1.16.4.linux-amd64.tar.gz
tar -zxvf go1.16.4.linux-amd64.tar.gz -C /usr/local/
ln -s /usr/local/go/bin/go /usr/bin/go
接下来的go环境变量同学们可以根据自己的实际需求进行配置。对于我个人而言,我直接在/etc/profile
中添加下面的配置然后source生效即可。
cat >> /etc/profile <<EOF
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/home/gopath
EOF
[root@tiny-server home]# mkdir /home/gopath
[root@tiny-server home]# source /etc/profile
[root@tiny-server home]# go version
go version go1.16.4 linux/amd64
go环境配置完成之后,我们还需要根据coredns的提示检查gomod是否正常,从go的GitHub文档中我们可以得知在1.16版本开始是默认启用并支持gomod的,所以这里我们无需额外配置。
Go 1.16
See the Go 1.16 release notes for details.
- Module mode (
GO111MODULE=on
) is the default in all cases- Commands no longer modify
go.mod
/go.sum
by default (-mod=readonly
)go install pkg@version
is the recommended way to globally install packages / executablesretract
is available ingo.mod
1.2 编译coredns
接下来我们直接开始进行编译,(在编译过程中会访问google.com
,k8s.io
等域名,需要注意保证网络正常)
git clone https://github.com/coredns/coredns
cd coredns/
make
编译完成之后我们就会在当前目录下得到一个二进制文件
[/home/coredns]# file coredns
coredns: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
[/home/coredns]# ./coredns -version
CoreDNS-1.8.3
linux/amd64, go1.16.4, 7b43d042
2、编译External Plugins
2.1 什么是External Plugins
coredns官方对于插件的分类基本可以分为三种:Plugins、External Plugins和其他。其中Plugins一般都会被默认编译到coredns的预编译版本中,而External Plugins则不会。官方的文档对外部插件的定义有着明确的解释,主要要求大概是有用、高效、符合标准、文档齐全、通过测试等。
2.2 如何编译插件
官方给出了一个详细的文档说明,编译插件基本可以分为修改源码和修改编译的配置文件这两种方式,这里我们采用简单高效的修改配置文件的方式进行测试。
在我们前面下载的官方源码中,有一个plugin
的目录,里面是各种插件的安装包,同时还有一个plugin.cfg
的文件,里面列出了会编译到coredns中的插件,
[/home/coredns]# tail plugin.cfg
secondary:secondary
etcd:etcd
loop:loop
forward:forward
grpc:grpc
erratic:erratic
whoami:whoami
on:github.com/coredns/caddy/onevent
sign:sign
dump:github.com/miekg/dump
例如这里我们需要额外多添加一个dump插件到coredns中,只需要在plugin.cfg中加入插件的名称和地址
dump:github.com/miekg/dump
对于在plugin目录下已经存在的插件,则可以直接写成plugin中的目录名:
sign:sign
然后我们开始编译
[/home/coredns]# go get github.com/miekg/dump
go: downloading github.com/miekg/dump v0.0.0-20201002053733-d877fdb82251
go get: added github.com/miekg/dump v0.0.0-20201002053733-d877fdb82251
[/home/coredns]# go generate
[/home/coredns]# go build
[/home/coredns]# make
2.3 验证插件
接下来只要检验生成的coredns二进制文件中是否包含dump
插件即可确认是否顺利编译完成:
最后我们在配置文件中启动dump
模块并进行测试,可以看到一条查询会出现两条日志,分别对应的是dump
插件生成的日志和log
插件生成的日志(带INFO)