说明
etcd 插件实现了(旧的)SkyDNS 服务发现服务。它不适合作为通用 DNS 区域数据插件。它只实现了 DNS 记录类型的一部分,根本无法处理子域和委派。该插件还将递归地向下遍历树并返回找到的所有记录,详情请参见下面的“特殊行为”。
etcd 实例中的数据必须编码为 消息 ,比如 SkyDNS。它的工作原理和 SkyDNS 一样。
etcd 插件大量使用 forward 插件来转发和查询网络中的其他服务器(如果该插件也已启用)。
语法
etcd [ZONES...]
- ZONES 区域 etcd 应作为 authoritative。
此路径将默认为本地 etcd3 代理 (https://127.0.0.1:2379) 的 /skydns
。如果没有指定任何区域,将会把块的区域用作区域。
etcd [ZONES...] {
fallthrough [ZONES...]
path PATH
endpoint ENDPOINT...
credentials USERNAME PASSWORD
tls CERT KEY CACERT
}
-
fallthrough
如果区域匹配但无法生成任何记录,请将请求传递给下一个插件。如果省略 [ZONES…],那么对于插件是权威的所有区域将进行 fallthrough。如果列出了特定区域(例如in-addr.arpa
和ip6.arpa
),那么只有对那些区域的查询才会受到 fallthrough 的影响。 -
PATH etcd 中的路径。默认为 “/skydns”。
-
ENDPOINT etcd 端点。默认为 “https://127.0.0.1:2379”。
-
credentials
用于为访问 etcd 集群设置 USERNAME 和 PASSWORD。 -
tls
后面跟- 无参数,如果服务器证书由系统安装的 CA 签名,不需要客户端证书
- 一个参数为 CA PEM 文件,如果服务器证书未由系统 CA 签名,不需要客户端证书
- 两个参数 - 证书 PEM 文件路径、私钥 PEM 文件路径 - 如果服务器证书由系统安装的 CA 签名,需要客户端证书
- 三个参数 - 证书 PEM 文件路径、客户端私钥 PEM 文件路径、CA PEM 文件路径 - 如果服务器证书未由系统安装的 CA 签名,需要客户端证书。
特殊行为
etcd 插件利用目录结构来查找相关条目。例如,条目 /skydns/test/skydns/mx
将具有以下条目:/skydns/test/skydns/mx/a
、/skydns/test/skydns/mx/b
等。同样,目录 /skydns/test/skydns/mx1
将具有所有 mx1
条目。请注意此插件将搜索整个(子)树以查找记录。在第一个示例中,针对 mx.skydns.test
的查询将同时返回 a
和 b
记录的内容。如果目录的层次更深,那些记录也会返回。
使用 etcd3 时,对分层密钥的支持已取消。这意味着在 etcd3 中没有目录,只有前缀为平面密钥。为了适应查找,etcd 插件现在对前缀 /skydns/test/skydns/mx/
执行查找以搜索条目(例如 /skydns/test/skydns/mx/a
等),如果在 /skydns/test/skydns/mx/
上找不到任何内容,则它将查找 /skydns/test/skydns/mx
以找到条目(例如 /skydns/test/skydns/mx1
)。
在某些情况下,这会导致 CoreDNS 对 etcd 执行两次查找。
示例
这是默认的 SkyDNS 设置,其中所有内容都已完整指定
skydns.local {
etcd {
path /skydns
endpoint https://127.0.0.1:2379
}
prometheus
cache
loadbalance
}
. {
forward . 8.8.8.8:53 8.8.4.4:53
cache
}
或当我们使用 /etc/resolv.conf
作为代理和上游的基础时,该设置在解析指向外部点名的 CNAME 时使用。
skydns.local {
etcd {
path /skydns
}
cache
}
. {
forward . /etc/resolv.conf
cache
}
还支持多个端点。
etcd skydns.local {
endpoint https://127.0.0.1:2379 https://127.0.0.1:4001
...
在开始使用这些示例之前,请按照此处所述设置 etcdctl
(使用 etcdv3
API)。这将帮助你在 etcd 服务器中放入示例密钥。
如果愿意,可以使用 curl
填充 etcd
服务器,但使用 curl
时,端点 URL 取决于 etcd
的版本。例如,etcd v3.2
或更早版本仅使用 [CLIENT-URL]/v3alpha/*,而 etcd v3.5
或更高版本使用 [CLIENT-URL]/v3/* 。此外,在 JSON 有效负载中,密钥和值必须采用 base64 编码。使用 etcdctl
时,将自动处理这些详情。有关详情,可以查看此文档。
反向区域
反向区域受支持。你需要让 CoreDNS 知晓你也会反向授权。例如,如果你想为 10.0.0.0/24 添加反向,则需要将区域 0.0.10.in-addr.arpa
添加到区域列表中。显示 Corefile 的片段
etcd skydns.local 10.0.0.0/24 {
...
接下来,你需要用反向记录填充该区域,在此处,我们添加指向 reverse.skydns.local 的 10.0.0.127 的反向。
% etcdctl put /skydns/arpa/in-addr/10/0/0/127 '{"host":"reverse.skydns.local."}'
使用 dig 查询
% dig @localhost -x 10.0.0.127 +short
reverse.skydns.local.
区域名称作为 A 记录
可以使用区域名称本身作为 A
记录。可以通过向区域的 ETCD 路径写入特殊条目来实现此行为。例如,如果区域名称为 skydns.local
,你可以按如下方式为此区域创建 A
记录
% etcdctl put /skydns/local/skydns/ '{"host":"1.1.1.1","ttl":60}'
如果你查询区域名称本身,将收到创建的 A
记录
% dig +short skydns.local @localhost
1.1.1.1
如果您想将 DNS RR 用于区域名称,则可以设置以下内容
% etcdctl put /skydns/local/skydns/x1 '{"host":"1.1.1.1","ttl":60}'
% etcdctl put /skydns/local/skydns/x2 '{"host":"1.1.1.2","ttl":60}'
如果您现在查询区域名称,您将获得以下响应
% dig +short skydns.local @localhost
1.1.1.1
1.1.1.2
作为 AAAA 记录的区域名称
如果您也想将 AAAA
记录用于区域名称,则可以设置以下内容
% etcdctl put /skydns/local/skydns/x3 '{"host":"2003::8:1","ttl":60}'
% etcdctl put /skydns/local/skydns/x4 '{"host":"2003::8:2","ttl":60}'
如果您现在为 AAAA
查询区域名称,您将获得以下响应
% dig +short skydns.local AAAA @localhost
2003::8:1
2003::8:2
SRV 记录
如果您想使用 SRV
记录,则可以设置以下内容
% etcdctl put /skydns/local/skydns/x5 '{"host":"skydns-local.server","ttl":60,"priority":10,"port":8080}'
请注意,在 SRV
中,键 host
是 target
,因此它应该是一个域名。
如果您现在为 SRV
查询区域名称,您将获得以下响应
% dig +short skydns.local SRV @localhost
10 100 8080 skydns-local.server.
TXT 记录
如果您想使用 TXT
记录,则可以设置以下内容
% etcdctl put /skydns/local/skydns/x6 '{"ttl":60,"text":"this is a random text message."}'
% etcdctl put /skydns/local/skydns/x7 '{"ttl":60,"text":"this is a another random text message."}'
如果您现在为 TXT
查询区域名称,您将获得以下响应
% dig +short skydns.local TXT @localhost
"this is a random text message."
"this is a another random text message."
另请参阅
如果您想 循环访问
A 和 AAAA 响应,请查看 loadbalance 插件。