ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CoreDNS 1.5.0 版本全解析:grpc / ready 新插件、弃用策略与核心服务重构

2026/10/6 20:35:17 拓冰建站 浏览量
CoreDNS 1.5.0 版本全解析:grpc / ready 新插件、弃用策略与核心服务重构 后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载CoreDNS 1.5.0发布于 2019 年 4 月是一次以「新能力落地 老能力收口」为双主线的版本迭代一方面引入了两个全新的插件 —— 用于通过 gRPC 协议转发 DNS 报文的grpc与用于就绪探测的ready另一方面对核心服务端代码做了精简并正式弃用了file/auto插件中的TIMEOUT、no_reload指令以及proxy插件。读完本文你将掌握这两个新插件的完整配置语法与底层实现原理理解弃用清单的迁移路径并了解 kubernetes 插件resyncperiod的默认值变更及两个关键活跃 bug 的定位背景。版本概览一次「加新、收旧、简化」的发布本次发布的核心变化可以用三句话概括详见 版本发布说明新增两个插件grpc负责将 DNS 查询通过 gRPC 协议转发给上游解析器ready提供就绪状态检查的 HTTP 端点第一个使用者是kubernetes插件。核心服务端代码打磨dnsserver 部分做了「polish and simplifications」即面向可维护性的清理与简化。弃用动作收口file与auto插件中的TIMEOUT、no_reload指令被完全弃用proxy插件同步进入弃用状态与其承载的 gRPC 转发能力一并由新插件接管。此外版本说明同步更新了两个重要且活跃的 bugIssue 2593问题线索逐渐收敛到 Docker / 容器环境可能是诱发因素之一Issue 2624根因定位在forward插件中的 TLS 会话协商环节。新插件一grpc —— 用 gRPC 协议转发 DNS 报文功能定位grpc插件的核心职责是「facilitates proxying DNS messages to upstream resolvers via gRPC protocol」即把 DNS 查询封装进 gRPC 通道转发给上游解析器。它同时支持 gRPC 与 TLS并且每个 Server Block 中只能使用一次从 setup.go 中plugin.ErrOnce的检查逻辑可以印证parseGRPC中第二次进入for c.Next()就会直接报错。基础语法grpc FROM TO...FROM请求要匹配的基域base domain匹配成功才会被代理转发TO...目标上游端点列表数量上限为 15 个—— 该限制直接定义在 setup.go 的const max 15中setup()会在启动解析阶段检查g.len() max并拒绝启动。多个上游首次使用时按policy策略随机排序当某个上游返回错误时会依次尝试列表中的下一个上游。扩展语法与参数详解grpc FROM TO... { except IGNORED_NAMES... tls CERT KEY CA tls_servername NAME policy random|round_robin|sequential fallthrough [ZONES...] }except IGNORED_NAMES...空格分隔的域名列表这些域名的查询不会被转发。从 grpc.go 的isAllowedDomain实现可见请求名等于from域时直接放行否则逐个检查ignored列表命中任一忽略项即拒绝转发。tls CERT KEY CA定义 TLS 连接的属性03 个参数含义如下表参数个数写法行为0tls不进行客户端认证使用系统 CA 验证服务器证书1tls CA不进行客户端认证使用指定的 CA 文件验证服务器证书2tls CERT KEY使用指定的 cert/key 对进行客户端认证服务器证书用系统 CA 验证3tls CERT KEY CA使用指定的 cert/key 对进行客户端认证服务器证书用指定的 CA 文件验证在配置解析阶段非绝对路径的证书参数会被拼接到dnsserver.GetConfig(c).Root之下再经由pkgtls.NewTLSConfigFromArgs生成tls.Config见 setup.go。tls_servername NAME在 TLS 配置中设置 SNI 服务器名。典型场景是 Quad99.9.9.9必须设置为dns.quad9.netCloudflare1.1.1.1需设置为cloudflare-dns.com。注意多个上游必须使用同一个tls_servername混用不同厂商如同时配置 9.9.9.9 和 1.1.1.1不会生效。代码中该值会被写入g.tlsConfig.ServerName见 setup.go。policy上游选择策略默认random。可选值random、round_robin、sequential未知值会在启动时报错见 setup.go。fallthrough [ZONES...]当 gRPC 后端返回 NXDOMAIN 时将请求交给下一个插件而不是直接返回 NXDOMAIN 响应。适用于「gRPC 后端虽然权威托管某区域但不应为不属于该区域的查询返回权威 NXDOMAIN」的场景例如搜索路径查询。不写[ZONES...]时对所有区域生效写了具体区域则仅对该区域生效。关于 TLS 的一个约束TLS 配置对整条 grpc 代理是「全局」的如果需要为不同上游设置不同的tls_servername当前版本无能为力。转发流程与错误处理源码级grpc.go 中ServeDNS的完整调用链值得关注先做域名匹配match()要求请求名匹配from且不在except列表内不匹配则交给Next插件链无下一个插件时返回 SERVFAIL。取上游列表g.list()设置总截止时间deadline now defaultTimeoutdefaultTimeout 5 * time.Second见 grpc.go。循环尝试每个上游每次调用proxy.query(callCtx, r)前通过context.WithDeadline为单次调用设置截止时间。单个上游出错则continue尝试下一个若所有上游都失败最终返回 SERVFAIL 并携带ErrNoHealthyno healthy gRPC proxies。若返回报文与请求不匹配!state.Match(ret)直接向客户端写回 FORMERR。若返回 NXDOMAIN 且g.Fall.Through(state.Name())命中则交给下一个插件处理fallthrough 逻辑在错误路径和正常路径均有处理。正常响应直接w.WriteMsg(ret)返回。完整配置示例将example.org.内的所有请求转发到本机 9005 端口的命名服务器example.org { grpc . 127.0.0.1:9005 }在三个解析器之间做负载均衡其中一个为 IPv6 地址. { grpc . 10.0.0.10:53 10.0.0.11:1053 [2003::1]:53 }除example.org外全部转发. { grpc . 10.0.0.10:1234 { except example.org } }使用宿主resolv.conf的 nameserver 转发except排除example.org. { grpc . /etc/resolv.conf { except example.org } }通过 TLS 协议转发到 9.9.9.9 并缓存 30 秒。注意tls_servername是必须项 —— 9.9.9.9 无法直接用于 TLS 协商. { grpc . 9.9.9.9 { tls_servername dns.quad9.net } cache 30 }同一厂商的多个上游. { grpc . 1.1.1.1 1.0.0.1 { tls_servername cloudflare-dns.com } cache 30 }转发到监听在 Unix 域套接字上的本地上游. { grpc . unix:///path/to/grpc.sock }example.org.的 gRPC 后端返回 NXDOMAIN 时回退到forward插件以正确处理搜索路径查询example.org { grpc . 127.0.0.1:9005 { fallthrough } forward . 8.8.8.8 }监控指标配合prometheus即 metrics插件启用监控后grpc 导出如下指标定义见 metrics.gocoredns_grpc_request_duration_seconds{to}—— 每次上游交互的耗时coredns_grpc_requests_total{to}—— 每个上游的查询计数coredns_grpc_responses_total{to, rcode}—— 每个上游按 RCODE 统计的响应计数指标上报使用random策略随机选择上游。新插件二ready —— 插件级就绪状态探测功能定位ready插件暴露一个 HTTP 就绪检查端点当所有能够上报就绪状态的插件都就绪后端点返回200 OK只要还有插件未就绪端点返回503且响应体中会列出尚未就绪的插件名。第一个接入方是kubernetes插件。源码层面ready.go 中/ready的 handler 会调用plugins.Ready()就绪时写200 OK否则写 503 与未就绪插件列表。语法与行为ready [ADDRESS] { monitor until-ready|continuously }ADDRESS可选默认:8181路径固定为/ready。monitor可选默认until-readyuntil-ready插件上报一次就绪后不再重复检查假定初始就绪确认之后状态保持稳定continuously持续监控插件就绪状态插件可在 ready / not ready 之间动态切换提供实时状态更新。默认行为下插件上报一次就绪后便不再被询问。工作机制源码级每个启用了ready插件的 Server Block会把该 Server Block 内的插件就绪状态上报到同一端口上的/ready端点。因此同一个插件在不同 Server Block 中以不同配置出现时其就绪状态取各自就绪状态的「并集」。就绪检查的端口监听复用reuseport.ListenHTTP 服务的读写与空闲超时均为 5 秒关闭时也有 5 秒的优雅退出窗口见 ready.go。插件接入方式任何希望上报就绪状态的插件只需实现ready.Readiness接口即实现一个Ready() bool方法见 readiness.go返回true表示就绪。配置示例为.与example.org两个服务器同时上报就绪状态假定erratic、whoami也导出就绪能力. { ready erratic } example.org { ready whoami }在自定义端口运行就绪检查. { ready localhost:8091 }新插件三cancel —— 请求级超时取消cancel插件为每个请求创建一个可取消的 context并在5001 毫秒后触发超时。这个「5001」是刻意选定的DNS 客户端的默认超时是 5 秒超过 5 秒客户端通常已经放弃等待详见 cancel 插件说明。cancel [TIMEOUT]TIMEOUT自定义超时默认 5001 毫秒5001 ms。插件侧配合对取消状态感兴趣的插件应调用plugin.Done()检查 context若 context 因超时被取消该插件不应再向客户端写任何数据并返回让 CoreDNS 也停止响应的值返回零值即可。版本说明特别注明该插件尚未默认启用but not enabled - yet。example.org { cancel whoami }自定义超时写法example.org { cancel 1s whoami }其余插件增强一览1.5.0 中还有一批既有插件的功能增强forward新增 dnstap 支持相关实现见 forward/dnstap.go为转发流量提供 dnstap 观测通道route53开始支持通配符wildcard记录pprof新增block选项开启 block profilingprometheusmetrics新增coredns_plugin_enabled指标用于展示每个 server、zone、view 维度上启用了哪些插件。该指标的定义位于 metrics/vars/vars.go在 metrics/setup.go 中为每个注册为 Handler 的插件写入1并在重启时重置。注意只有注册为 Handler 的插件才会出现在该指标中reload、bind两个插件目前不会被上报chaos当查询authors.bind TXT CH时返回维护者maintainers名单kubernetesresyncperiod选项默认值改为0 秒即默认禁用重新同步。源码中object/informer.go的defaultResyncPeriod 0见 plugin/kubernetes/object/informer.goFullResyncPeriod随之取该默认值。弃用清单与迁移路径本次发布明确了两条弃用线file / auto 插件TIMEOUT与no_reload指令已被完全弃用fully deprecated不再作为受支持的配置项proxy 插件整个插件进入弃用状态。若此前依赖proxy中的 gRPC 转发能力可平滑迁移到 1.5.0 新增的grpc插件。此外kubernetes插件的resyncperiod选项同样被标记为弃用计划在1.6.0中变为 no-op无效配置并在1.7.0中彻底移除。结合默认值已改为 0 秒的事实可以理解为该机制正在逐步退出历史舞台使用者应尽快从 Corefile 中移除该配置。版本说明中的关键工程信息最后补充两点发布说明中值得注意的工程背景核心服务端代码dnsserver 部分进行了打磨与简化属于面向长期可维护性的重构不改变既有配置语义两个活跃 bug 的进展Issue 2593 的线索集中在 Docker / 容器环境怀疑其为触发因素之一Issue 2624 根因指向forward插件中的 TLS 会话协商TLS session negotiating环节。这两个问题在 1.5.0 发布时仍在跟进中属于对已知问题的状态同步而非本次版本已修复的功能点。小结CoreDNS 1.5.0 的核心价值在于用grpc插件接棒了proxy中的 gRPC 转发能力上限 15 个上游、四种 TLS 参数形态、三种选择策略、NXDOMAIN fallthrough 一应俱全用ready插件为 k8s 生态提供了基于 HTTP 的就绪探测标准接口同时通过弃用TIMEOUT、no_reload、proxy与resyncperiod为后续版本的功能收敛铺平了道路。对于需要 gRPC 上游或就绪检查的用户这份版本的语法与源码实现plugin/grpc、plugin/ready、plugin/cancel可以直接作为落地与二次开发的手册。赞分享后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载相关推荐CoreDNS 1.1.4 版本发布详解插件弃用策略、核心优化与 Docker 镜像多阶段构建CoreDNS 1.1.4 版本发布详解插件弃用策略、核心优化与 Docker 镜像多阶段构建 CoreDNS 1.1.4 是 CoreDNS 在 2018后端网络云原生CoreDNS v008 版本解析日志体系重构、hosts/debug 新插件与插件链核心更新CoreDNS v008 版本解析日志体系重构、hosts/debug 新插件与插件链核心更新 CoreDNS 008v008是 CoreDNS 早期发布后端网络云原生CoreDNS 1.0.5 版本解析route53 新插件、health lameduck 与核心修复全景CoreDNS 1.0.5 版本解析route53 新插件、health lameduck 与核心修复全景 CoreDNS 1.0.5 是 CoreDNS 早后端网络云原生上一篇GCP云安全防护指南Awesome Cloud Security精选工具与最佳实践下一篇【亲测免费】 探索Metric3D一款强大的3D空间量化工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考