etcd

源码

etcd 实现了 etcd 中的 SkyDNS 服务发现。

说明

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.arpaip6.arpa),那么只有对那些区域的查询才会受到 fallthrough 的影响。

  • PATH etcd 中的路径。默认为 “/skydns”。

  • ENDPOINT etcd 端点。默认为 “https://127.0.0.1:2379”。

  • credentials 用于为访问 etcd 集群设置 USERNAMEPASSWORD

  • 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 的查询将同时返回 ab 记录的内容。如果目录的层次更深,那些记录也会返回。

使用 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 中,键 hosttarget,因此它应该是一个域名。

如果您现在为 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 插件。