基于 DNS 的服务发现

发现 OpenStack 服务的常用方法是通过 服务目录。但是,在某些特殊情况下,使用基于 DNS 的发现可能更方便,例如

  1. 通过 DNS 初始发现身份服务端点。

  2. 发现本地网络上的服务,尤其是在独立部署的情况下。

警告

本指南不建议任何服务实现任何基于 DNS 的发现,而是为需要它的服务和部署提供指导。

本指南基于以下两个 IETF 文档

  • RFC 6763 定义了 DNS 服务发现。

  • RFC 6762 定义了多播 DNS 协议(或 mDNS)。

服务类型

RFC 6763 第 7 节定义了服务的完全限定域名,格式如下

<instance>.<servicename>._tcp.<domain>.

其中

domain

是服务所属的父域名。对于多播 DNS,它必须是 local

servicename

是特定于服务的协议名称。在 OpenStack API 发现的情况下,必须是 _openstack

实例

是服务的实例。在 OpenStack API 发现的情况下,必须是 OpenStack 服务类型,例如 computeidentitybaremetal。不应使用项目代码名称,例如 nova

服务信息

DNS SRV 记录将提供服务的宿主机和端口号。DNS TXT 记录应用于通信访问服务所需的剩余部分。RFC 6763 定义了这些记录的格式为用 = 分隔的键值对。本指南定义了以下键

path

应用于指定端点的路径部分。如果缺失,则必须假定为 /

注意

将这些键前面加上类似 os_ 的内容很诱人,但 pathRFC 6763 的示例中以完全相同的方式使用,因此可能对潜在的消费者和工具来说足够熟悉。

protocol

应用于指定是使用 HTTP 还是 HTTPS。如果存在,则必须是 httphttps。如果不存在,消费者应使用端口来确定要使用的协议

  • 如果端口是 80,则使用 HTTP,

  • 如果端口是 443,则使用 HTTPS,

如果端口不是 443 或 80,消费者应尝试 HTTPS,并且如果失败,可以回退到 HTTP。

txtvers

应如 RFC 6763 中定义的那样使用,以指定格式的版本。如果存在,其值必须是 1

示例

提供商的身份发现

作为 OpenStack 提供商 mystack.example.com 的新用户,我想发现要使用的 auth_url

我发出 DNS 请求以检索 SRVTXT 记录

$ nslookup -query=any "identity._openstack._tcp.mystack.example.com"
identity._openstack._tcp.mystack.example.com    service = 0 0 443 os.mystack.example.com
identity._openstack._tcp.mystack.example.com    text = "txtvers=1" "path=/"

现在我知道我必须连接到 os.mystack.example.com,端口 443。从 TXT 记录中我知道应该使用根路径。未指定协议,因此从端口 443 推断使用 HTTPS。

结果:auth_urlhttps://os.mystack.example.com/

ironic 的本地发现

ironic 服务 ramdisk 在启动后需要发现 baremetal (ironic) 和 baremetal 检查 (ironic-inspector) API 端点。它无法使用服务目录。

ramdisk 发出多播 DNS 请求以列出 OpenStack 服务。一个等效的 Avahi(FOSS mDNS 和 DNS-SD 实现)命令将是

$ avahi-browse -rt _openstack._tcp
+ eth1 IPv4 baremetal                                     _openstack._tcp      local
+ eth1 IPv4 baremetal-introspection                       _openstack._tcp      local
= eth1 IPv4 baremetal                                     _openstack._tcp      local
   hostname = [baremetal._openstack._tcp.local]
   address = [192.168.42.17]
   port = [80]
   txt = ["proto=http" "path=/baremetal"]
= eth1 IPv4 baremetal-introspection                       _openstack._tcp      local
   hostname = [baremetal-introspection._openstack._tcp.local]
   address = [192.168.42.17]
   port = [5050]
   txt = ["proto=http"]

在这里,我们对所有匹配 服务类型 中定义的 _openstack._tcp 服务类型进行多播搜索。我们收到两个预期服务的响应,每个响应都包含一个 IP 地址、一个 TCP 端口以及 TXT 部分中的 protopath 变量。

结果

  • baremetal 端点是 http://192.168.42.17/baremetal

  • baremetal 检查端点是 http://192.168.42.17:5050