CoreDNS实战(八)-递归服务器

2023-12-06 01:01

本文主要是介绍CoreDNS实战(八)-递归服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要用于介绍CoreDNS实现递归服务器的几种方式以及在生产环境中遇到的一些问题和解决方案。

在开始之前我们需要知道一些关于CoreDNS的基本知识:CoreDNS本身是没有能力作为一个递归查询的DNS服务器(Recursive DNS),但是它有着众多的插件,可以通过插件来实现对域名的递归查询和缓存等功能从而加速客户端的DNS查询性能。这里主要实现的插件有内部插件(Plugins)forward外部插件(External Plugins)unbound

CoreDNS官方对External Plugins的描述为:
Out of tree plugins for CoreDNS. A plugin listed here is  not automatically endorsed by the CoreDNS team. Issues should be reported to owner(s) of the plugin.
我们可以将CoreDNS的External Plugins简单理解为第三方插件,但是其中少部分会有官方的维护支持或者是直接默认内置在官方编译好的版本中。

1 unbound

我们先来了解一下不依靠外部程序实现递归查询功能的unbound插件,unbound是一个非常优秀的DNS软件,专注于递归查询和缓存,但对于权威DNS服务器这方面的功能稍显不足,因此理论上将unbound和CoreDNS结合就可以很好的弥补两者的不足。

1.1 编译安装

unbound插件的编译安装稍显麻烦,unbound 中有详细介绍操作步骤和注意事项,需要特别注意的是编译安装了unbound插件的CoreDNS会从原来的静态二进制文件,变成了需要动态加载依赖库。因此如果需要提前编译然后大范围使用,最好保证编译环境的系统和最终的使用环境系统一致或全兼容。

1.2 一些问题

unbound插件已经很长一段时间没有更新维护了,尽管它有Maintained by CoreDNS的标注,因此如果使用较新版本的go编译之后,在启动的时候会有报警。

Jan 18 02:29:16 coredns1 coredns: [WARNING] An external plugin (/home/gopath/pkg/mod/github.com/coredns/unbound@v0.0.7/setup.go line 63) is using the deprecated function Normalize. This will be removed in a future versions of CoreDNS. The plugin should be updated to use OriginsFromArgsOrServerBlock or NormalizeExact instead.

另外就是在运行的过程中会出现panic异常,一开始怀疑是和负载有关,后面测试发现当请求量极低(个位数qps)的时候也会出现此类异常。

[tinychen /home/coredns]# ./coredns -dns.port=53 -conf /home/coredns/corefile
.:53 on 0.0.0.0
CoreDNS-1.8.3
linux/amd64, go1.16.4, 7b43d042-dirty
[INFO] 127.0.0.1:46007 - 37929 "A IN baidu.com. udp 50 false 4096" NOERROR qr,rd,ra 484 0.614542s
[INFO] 127.0.0.1:32946 - 43201 "A IN baidu.com. udp 50 false 4096" NOERROR qr,aa,rd,ra 484 0.0000971s
[INFO] 127.0.0.1:38201 - 44652 "A IN baidu.com. udp 50 false 4096" NOERROR qr,aa,rd,ra 484 0.0001522s
[INFO] 127.0.0.1:50863 - 63692 "A IN tinychen.com. udp 53 false 4096" NOERROR qr,rd,ra 58 0.3613896s
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"

经过多次测试之后,我们发现针对unbound插件出现panic的情况和请求的频率无关,而是和请求的内容有关。简单来说就是:当请求的域名本身就不存在解析的时候,就会触发panic异常;当然还可以再进一步:当CoreDNS服务端本身无法和根域名服务器建立连接转发查询的时候,也会出现panic异常。

2 forward

2.1 配置使用

forward插件主要的作用就是把DNS请求转发给上游的upstream服务器。forward插件本身并不支持任何的DNS解析功能,但是可以将相应的请求转发到递归服务器上,再结合cache插件做缓存,从而实现递归查询解析缓存的功能。

.:53 {forward . 114.114.114.114 114.114.115.115 {health_check 5s}logerrorsready prometheus cache {success 10240 600 60denial 5120 60 5}
}

forward对应的upstream机器可以根据自己的需求选择现有的公共DNS,如国内常见的114、谷歌的8888等免费DNS,或者选择自己使用unbound、bind9之类的DNS服务器单独搭建一个专门用来做递归查询的DNS服务。

2.2 一些问题

Jan 18 05:29:16 coredns1 coredns: [ERROR] plugin/errors: 2 nonexist.test.tinychen.com. A: read udp 127.0.0.1:7522->114.114.114.114:53: i/o timeout

当查询的域名解析记录不存在的时候,可能会触发upstream的超时时间限制,导致报错i/o timeout,可以考虑使用error插件的consolidate指令对这类报警进行统一处理并修改报警等级

    errors {consolidate 5m ".* i/o timeout$" warning}

这篇关于CoreDNS实战(八)-递归服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459815

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.