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 等网站下载多种资源,耗时长。
预编译版本内置官方认证的全部插件
cd /opt/app
wget https://github.com/coredns/coredns/releases/download/v1.9.1/coredns_1.9.1_linux_amd64.tgz
tar -zxf /opt/app/coredns_1.9.1_linux_amd64.tgz -C /usr/bin
su root
useradd coredns -s /sbin/nologin
mkdir /etc/coredns
vim /etc/coredns/Corefile
.:53 {
# 本机地址或网卡名称(如 eth0),但不能是 127.0.0.1 bind 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
}
常用插件:
vim /usr/lib/systemd/system/coredns.service
[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
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 相较 systemd 方式,可以输出时间和主机信息,信息更全面。
echo -e 'if $programname == "coredns" then /home/coredns/logs/coredns.log\n& stop' >> /etc/rsyslog.conf
systemctl restart rsyslog.service
替换 x.x.x.x
# 修改 DNS 服务器地址
sed -i -r 's/(^nameserver.*)/#\1/g' /etc/resolv.conf && echo "nameserver x.x.x.x" >> /etc/resolv.conf
# 使网卡发生重启后不重置 /etc/resolv.conf 的内容
echo "PEERDNS=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0
可调可不调,取决于 /etc/hosts 与 /etc/coredns/Corefile 所配置的域名有无冲突。
vim /etc/nsswitch.conf
使 ^host: …… 的顺序为 “dns files ……” 即可。
# 开机自启
systemctl enable coredns
# 重载 systemd 配置文件
systemctl daemon-reload
# 启动服务
systemctl start coredns
# 查看服务状态
systemctl status coredns
# 查看帮助
coredns --help