CoreDNS篇2-编译安装External Plugins

本文最后更新于:May 16, 2021 am

本文主要对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 for go mod details.

由于coredns是使用golang编写,因此对其进行编译安装之前需要先配置go环境。而在centos中使用yum安装的go版本较旧,我们直接去官网下载最新的版本进行解压即可。

1
2
3
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生效即可。

1
2
3
4
5
6
7
8
9
10
cat >> /etc/profile <<EOF
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/home/gopath
EOF
$ mkdir /home/gopath
$ source /etc/profile
$ 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 / executables
  • retract is available in go.mod

1.2 编译coredns

接下来我们直接开始进行编译,(在编译过程中会访问google.com,k8s.io等域名,需要注意保证网络正常)

1
2
3
git clone https://github.com/coredns/coredns
cd coredns/
make

编译完成之后我们就会在当前目录下得到一个二进制文件

1
2
3
4
5
$ file coredns
coredns: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
$ ./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中的插件,

1
2
3
4
5
6
7
8
9
10
11
$ 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中加入插件的名称和地址

1
dump:github.com/miekg/dump

对于在plugin目录下已经存在的插件,则可以直接写成plugin中的目录名:

1
sign:sign

然后我们开始编译

1
2
3
4
5
6
$ 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
$ go generate
$ go build
$ make

2.3 验证插件

接下来只要检验生成的coredns二进制文件中是否包含dump插件即可确认是否顺利编译完成:

最后我们在配置文件中启动dump模块并进行测试,可以看到一条查询会出现两条日志,分别对应的是dump插件生成的日志和log插件生成的日志(带INFO)