setup_coredns

coredns 是用 go 编写的开源 DNS 服务,是首批加入 CNCF 组织的云原生开源项目,并作为已在 CNCF 毕业的项目,coredns 还是目前 k8s 中默认的 DNS 服务。同时,由于coredns可以集成插件,它还能够实现服务发现的功能。

coredns 与其它诸如 bind、knot、powerdns、unbound 等 DNS 服务不同的是:coredns 非常的灵活,几乎把所有核心功能实现都外包给了插件。比如说,如果你想在 coredns 中加入 Prometheus 的监控支持,只需安装相应的 Prometheus 插件并且启用即可,因此官方也说 coredns 由插件驱动。

以 CentOS 7 为例

部署

不建议采用 git clone 方式,编译时需要从 github、golang、k8s 等网站下载多种资源,耗时长。

下载预编译包

预编译版本内置官方认证的全部插件

解包

配置

服务端

coredns

.:53 {
# 本机地址或网卡名称(如 eth0),但不能是 127.0.0.1bind x.x.x.x
# 先走本机的 hosts
# https://coredns.io/plugins/hosts/
hosts {
  # 解析的域名少,用 hosts 插件即可完成需求
  # 如有大量自定义域名解析,建议用 file 插件使用 符合RFC 1035 规范的 DNS 解析配置文件
  10.126.1.22 resource01.control.umf.cn
  10.126.1.19 resource02.control.umf.cn
  # 解析域名生效时长
  ttl 60
  # 重新加载配置文件的间隔时间
  reload 1m
  # 继续执行
  fallthrough
}
# file enables serving zone data from an RFC 1035-style master file.
# https://coredns.io/plugins/file/
# file service.signed service
# 转发域名查询的请求到上游 DNS 服务器去解析
forward . /etc/resolv.conf
# 前端缓存有效期
cache 60
# 重新加载配置文件的间隔时间
reload 1m
# 将查询记录到日志
log
# 将错误信息记录到日志
errors
}

常用插件:

  • loadbalance:提供基于dns的负载均衡功能
  • loop:检测在dns解析过程中出现的简单循环问题
  • cache:提供前端缓存功能
  • health:对Endpoint进行健康检查
  • kubernetes:从kubernetes中读取zone数据
  • etcd:从etcd读取zone数据,可以用于自定义域名记录
  • file:从文件中读取zone数据
  • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录
  • auto:从磁盘中自动加载区域文件
  • reload:定时自动重新加载Corefile配置文件的内容
  • forward:转发域名查询到上游dns服务器
  • proxy:转发特定的域名查询到多个其他dns服务器,同时提供到多个dns服务器的负载均衡功能
  • prometheus:为prometheus系统提供采集性能指标数据的URL
  • pprof:在URL路径/debug/pprof下提供运行是的西能数据
  • log:对dns查询进行日志记录
  • errors:对错误信息镜像日志记录

systemd

[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
Type=simple
User=coredns
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

通过 systemd 指定日志的输出路径

CentOS 8 及以上版本支持通过 systemd 定义输出文件的路径。

在 /usr/lib/systemd/system/coredns.service 的 [Service] 块中添加:

StandardOutput=append:/home/coredns/logs/coredns.log
StandardError=file:/home/coredns/logs/coredns_error.log

append 可以在原文件末尾继续追加内容,而 file 则是重新打开一个新文件。

二者的区别类似于 echo >>echo >

通过 rsyslog 指定日志的输出路径

rsyslog 相较 systemd 方式,可以输出时间和主机信息,信息更全面。

客户端

修改 DNS 配置

替换 x.x.x.x

调整 DNS 解析顺序

可调可不调,取决于 /etc/hosts 与 /etc/coredns/Corefile 所配置的域名有无冲突。

使 ^host: …… 的顺序为 “dns files ……” 即可。

相关命令

相关文档

CoreDNS - Official Website

CoreDNS - GitHub

CoreDNS Manual

CoreDNS Plugins - Official website

CoreDNS Plugins - GitHub