orvice blog

构建自定义的 k8s Coredns/LocalDNS 镜像

k8s 集群中,DNS 作为一个服务发现(Service)的重要依赖, 出于稳定性等因素,通常还会在每个 Node 上部署 LocalDNS 来增强 DNS 的可用性。

通常在集群中,kube-dns/local-dns 都会用 CoreDNS + 插件来实现。

最近有个需求是在 CoreDNS 的镜像中,加入自定义的插件,搜了一圈没有比较完整的教程,写个 blog 记录下。

CoreDNS

首先要修改 plugin.cfg 加入自定义的插件:

sign:sign
view:view
k8s_event:github.com/coredns/k8s_event
kubeapi:github.com/coredns/kubeapi # 添加这一行

注意: 插件的执行顺序跟 plugin.cfg 中的插件顺序有关,而不是 ConfigMap 里的 Coredns 配置。问了一圈 AI 都会幻觉。

然后是 Dockerfile:

FROM golang:1.24 as builder

WORKDIR /app

RUN git clone https://github.com/coredns/coredns

WORKDIR /app/coredns
COPY plugin.cfg .

 

RUN make gen
RUN make

FROM alpine
COPY --from=builder /app/coredns/coredns /coredns
ENTRYPOINT ["/coredns"]

LocalDNS

而如果是 LocanDNS 要添加插件进去的话,则需要修改官方的构建文件了。

官方 main.go https://github.com/kubernetes/dns/blob/master/cmd/node-cache/main.go

引入plugin:

	"github.com/coredns/caddy"
	// blank imports to make sure the plugin code is pulled in from vendor when building node-cache image
	_ "github.com/coredns/coredns/plugin/bind"
   // 这里 import 需要的 plugin

修改 plugin 顺序:


// 添加 import
import  "github.com/coredns/coredns/core/dnsserver"



func init(){

// 修改插件顺序, 注意需要加载的插件,都需要在这里声明顺序
dnsserver.Directives = []string{
		"root",
		"....",
}