构建自定义的 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",
"....",
}