前提条件:已经有一个可用的etcd环境。

一、CoreDNS简介

CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件。CoreDNS是云本土计算基金会启动阶段项目。

CoreDNS是SkyDNS的继任者。 SkyDNS是一个薄层,暴露了DNS中的etcd中的服务。 CoreDNS建立在这个想法上,是一个通用的DNS服务器,可以与多个后端(etcd,kubernetes等)进行通信。

CoreDNS旨在成为一个快速灵活的DNS服务器。 这里的关键灵活指的是:使用CoreDNS,您可以使用DNS数据进行所需的操作。 还可以自已写插件来实现DNS的功能。

CoreDNS可以通过UDP / TCP(旧式的DNS),TLS(RFC 7858)和gRPC(不是标准)监听DNS请求。

CoreDNS目前支持的行为,括号里面的英文表示插件:

  • 从文件提供区域数据; 支持DNSSEC(仅限NSEC)和DNS(file)。
  • 从主机检索区域数据,即充当辅助服务器(仅限AXFR)(secondary)。
  • 快速签署区域数据(dnssec)
  • 响应负载均衡(loadbalance
  • 允许区域传输,即充当主服务器(file)
  • 从磁盘自动加载区域文件(auto)
  • 缓存(cache)
  • 对endpoint的健康检查(health)
  • 使用ETCD作为后端,即SkyDNS(ETCD)的101.5%替换(etcd)
  • 使用k8s(kubernetes)作为后端(kubernetes)
  • 作为一个代理转发查询到一些其他(递归)域名服务器(proxy)
  • 提供指标(使用Prometheus)(metrics
  • 提供查询(log)和错误(errors)日志记录
  • 支持CH类:version.bind和friends(chaos)
  • 分析支持(pprof)
  • 重写查询(qtype,qclass和qname)(rewrite)
  • 回传所使用的IP地址,传输和端口号(whoami)

二、CoreDNS的安装

1、下载CoreDNS二进制安装文件

从CoreDNS官网上下载最新发布版本(https://github.com/coredns/coredns/releases/

这里下载  coredns_011_linux_x86_64.tgz

下载后解压到/etc/coredns目录下,同时在本目录下添加一个Corefile文件,Corefile是CoreDNS工作的核心,Corefile里面引用了一系列的插件来支持CoreDNS的工作。具体Corefile的原理可参照(https://coredns.io/2017/07/23/corefile-explained/

以下是一个引用了etcd插件的Corefile

.: {
etcd {
stubzones
path /skydns
endpoint http://172.16.71.200:2379
upstream /etc/resolv.conf
}
log stdout
errors stdout
proxy . /etc/resolv.conf
}
 

说明coredns工作于53端口,使用了etcd,log,errors,proxy插件

我们将编写好的Corefile也放在/etc/coredns目录底下。

新建管理脚本:/etc/init.d/coredns-manage

#!/bin/bash
now=$(date +%Y%m%d)
cmd='/etc/coredns/coredns -conf /etc/coredns/Corefile' start(){
exec $cmd &
} stop(){
ps -ef | grep "/etc/coredns/coredns" | grep -v "grep" |awk '{print $2}'| while read pid
do
C_PID=$(ps --no-heading $pid | wc -l)
echo "当前PID=$pid"
if [[ $C_PID == "" ]]; then
echo "PID=$pid 准备结束"
kill - $pid
echo "PID=$pid 已经结束"
else
echo "PID=$pid 不存在"
fi
done } case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
printf 'Usage: %s {start|stop|restart}\n'"$prog"
exit
;;
esac

启动coredns:

/etc/init.d/coredns-manage start
// :: [INFO] CoreDNS-
// :: [INFO] linux/amd64, go1., 1b60688d
CoreDNS-
linux/amd64, go1., 1b60688d

停止coredns:

/etc/init.d/coredns-manage stop

三、基于etcd插件的动态域名增加案例

etcd中的数据必须被编码为像SkyDNS这样的消息。 它也应该像SkyDNS一样工作。etcd插件广泛使用proxy插件来转发和查询网络中的其他服务器。

插件格式声明如下:

 
etcd [ZONES...] {
stubzones
fallthrough
path PATH
endpoint ENDPOINT...
upstream ADDRESS...
tls CERT KEY CACERT
}
  • ZONES :经过授权的区域,可以为空
  • stubzones:启用存根区域功能。 stubzone仅在位于指定的第一个区域下方的etcd树中完成。
  • fallthrough:如果区域匹配但不能生成记录,则将请求传递给下一个插件
  • path:etcd里面的路径 默认为“/ skydns”,以后所有的dns记录就是存储在该存根路径底下
  • endpoint:etcd访问地址,默认http://localhost:2397
  • upstream:要使用的上游解析程序解决指向外部域名的在etcd(认为CNAME)中找到的外部域名。 如果您希望CoreDNS作为客户端的代理,您需要添加代理插件。 ADDRESS可以是一个IP地址,IP:端口或一个字符串,指向一个被构造为/etc/resolv.conf的文件。
  • tls 后面紧跟:
  1. 没有参数,如果服务器证书由系统安装的CA签名,并且不需要客户端证书
  2. 一个参数是CA PEM文件,如果服务器证书没有被系统CA签名,并且不需要客户端证书
  3. 两个参数 - 认证PEM文件的路径,私钥PEM文件的路径 - 如果服务器证书由系统安装的CA签名并需要客户端证书
  4. 三个参数 - 认证PEM文件的路径,客户端私钥PEM文件的路径,CA PEM文件的路径 - 如果服务器证书未被系统安装的CA签名,并且需要客户端证书

举例:有一个tomcat的访问地址:http://172.16.80.175:8080/

现在我们为该地址动态增加域名:coredns.dynamic.com.test

假如etcd插件定义为:
    etcd {
stubzones
path /skydns
endpoint http://172.16.71.200:2379
upstream /etc/resolv.conf
}
那么我们只需要向etcd中添加一条如下的记录:
curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/test/com/dynamic/coredns -d value='{"host":"172.16.80.175","port":8080}'
 
注意:test/com/dynamic/coredns的顺序和coredns.dynamic.com.test是相反的。
添加了这样一条记录之后,我们就可以用coredns.dynamic.com.test:8080来访问刚才的tomcat了
 

假如etcd插件定义为:
    etcd com.test{
stubzones
path /skydns
endpoint http://172.16.71.200:2379
upstream /etc/resolv.conf
}
那么必须是/test/com/*/*的域名才能访问。
curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/test/com/dynamic/coredns -d value='{"host":"172.16.80.175","port":8080}'

反向域名解析:

支持反向区域。 您需要使CoreDNS了解您的权威性相反的事实。 例如,如果要添加172.0.0.0/24的反向,则需要将zone 0.0.172.in-addr.arpa添加到区域列表中。如果需要添加172.16.80.0/8的反向,则需要将zone  172.in-addr.arpai添加到区域列表中;

下面我们需要将172.16.80.175指向hzb.test.com,Corefile应该进行如下配置:

.: {
etcd test.com .in-addr.arpa {
stubzones
path /skydns
endpoint http://172.16.71.200:2379
upstream /etc/resolv.conf
}
log stdout
errors stdout
proxy . /etc/resolv.conf
}
 

还需要向etcd中增加一条如下的记录:

curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/arpa/in-addr/172/16/80/175 -d value='{"host":"hzb.test.com"}'

用dig命令进行查询测试:

root@ceph01:~/mir2_data/dev//# dig @localhost -x 172.16.80.175 +short
hzb.test.com.

基于etcd插件的CoreDNS动态域名添加的更多相关文章

  1. 基于maven插件的缓存控制插件

    asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...

  2. 基于Consul+Upsync+Nginx实现动态负载均衡

    基于Consul+Upsync+Nginx实现动态负载均衡 1.Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/l ...

  3. 教程:动手用自己电脑搭建一个网站 (nat123 花生壳 动态域名 个人电脑做服务器)

    先ps一下..今晚试了N种方法,终于找到一个靠谱 免费 好用的方法,来改装自己电脑成为服务器,在外网也能通过域名访问了!!! 需要准备的东西: Tomcat:这个是web容器,其实有了这个就已经让电脑 ...

  4. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  5. 基于Python实现matplotlib中动态更新图片(交互式绘图)

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  6. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  7. saltstack自动化运维系列11基于etcd的saltstack的自动化扩容

    saltstack自动化运维系列11基于etcd的saltstack的自动化扩容 自动化运维-基于etcd加saltstack的自动化扩容# tar -xf etcd-v2.2.1-linux-amd ...

  8. dnspod 动态域名的使用。openwrt使用dnspod动态域名解析。

    这里主要说的是linux shell下的使用. 先看接口说明: 接口地址: https://dnsapi.cn/Record.Ddns HTTP请求方式: POST 请求参数: 公共参数 domain ...

  9. windows下编译基于nginx插件的rtmp流媒体服务nginx-rtmp

    1 概述 rtmp流媒体服务器,开源方案有多种,包括srs,red5,crtmpserver,fms,nginx插件等.本文描述了基于nginx插件的方式来实现rtmp流媒体服务器nginx-rtmp ...

随机推荐

  1. 在AD中存取照片

    AD中有存放照片的字段吗? 答案肯定是有的.photo,jpegPhoto,thumbnailPhoto 前端时间客户,包括领导 在问通讯录中的照片为什么存在数据库中而不是AD中,AD中的属性能不能利 ...

  2. java对象模型

    java对象模型其实就是JVM中对象的内存布局.一个对象本身内在结构的描述信息以字节码的方式存储在方法区中(参见java内存区域),说白了就是class文件.那么如何获取到对象的class信息呢?虚拟 ...

  3. scrollTop、offsetHeight和offsetTop等属性用法详解--转转转

    scrollTop.offsetHeight和offsetTop等属性用法详解: 标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼 ...

  4. 熟练使用Linux系统信息类命令

    系统信息类命令 – dmesg命令 dmesg命令用实例名和物理名称来标识连到系统上的设备. dmesg命令显示系统诊断信息.操作系统版本号.物理内存大小以及其他信息. 系统启动时,屏幕上会显示系统C ...

  5. C#如何优雅的结束一个线程

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...

  6. Spring Boot使用@Scheduled定时器任务

      摘要: Spring Boot之使用@Scheduled定时器任务 假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能@EnableS ...

  7. OpenCL 直方图

    ▶ 计算直方图,由原子计数和规约计算两部分组成 ● 最简单的版本,代码 // kernel.cl #pragma OPENCL EXTENSION cl_khr_local_int32_base_at ...

  8. Servlet类源码说明

    servlet是学习java web不可不懂的一个类,网上各种教程都参杂太多,每次理解都感觉像把别人吐出来的食物再放在嘴里咀嚼,小编一怒之下,直接打开源码,原汁原味的芬芳扑面而来: /** * Def ...

  9. np的归纳总结

    1. np.sqrt(input)    # 求数的开方 import numpy as np print(np.sqrt(2)) 2. np.square(3)   # 求数的平方 import n ...

  10. centos7.3 防火墙设置

    1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启.重启.关闭.firewall ...