基于 DNS 的服务发现¶
发现 OpenStack 服务的常用方法是通过 服务目录。但是,在某些特殊情况下,使用基于 DNS 的发现可能更方便,例如
通过 DNS 初始发现身份服务端点。
发现本地网络上的服务,尤其是在独立部署的情况下。
警告
本指南不建议任何服务实现任何基于 DNS 的发现,而是为需要它的服务和部署提供指导。
本指南基于以下两个 IETF 文档
服务类型¶
RFC 6763 第 7 节定义了服务的完全限定域名,格式如下
<instance>.<servicename>._tcp.<domain>.
其中
domain是服务所属的父域名。对于多播 DNS,它必须是
local。servicename是特定于服务的协议名称。在 OpenStack API 发现的情况下,必须是
_openstack。实例是服务的实例。在 OpenStack API 发现的情况下,必须是 OpenStack 服务类型,例如
compute、identity或baremetal。不应使用项目代码名称,例如nova。
服务信息¶
DNS SRV 记录将提供服务的宿主机和端口号。DNS TXT 记录应用于通信访问服务所需的剩余部分。RFC 6763 定义了这些记录的格式为用 = 分隔的键值对。本指南定义了以下键
path应用于指定端点的路径部分。如果缺失,则必须假定为
/。注意
将这些键前面加上类似
os_的内容很诱人,但path在 RFC 6763 的示例中以完全相同的方式使用,因此可能对潜在的消费者和工具来说足够熟悉。protocol应用于指定是使用 HTTP 还是 HTTPS。如果存在,则必须是
http或https。如果不存在,消费者应使用端口来确定要使用的协议如果端口是 80,则使用 HTTP,
如果端口是 443,则使用 HTTPS,
如果端口不是 443 或 80,消费者应尝试 HTTPS,并且如果失败,可以回退到 HTTP。
txtvers应如 RFC 6763 中定义的那样使用,以指定格式的版本。如果存在,其值必须是
1。
示例¶
提供商的身份发现¶
作为 OpenStack 提供商 mystack.example.com 的新用户,我想发现要使用的 auth_url。
我发出 DNS 请求以检索 SRV 和 TXT 记录
$ 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_url 是 https://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 部分中的 proto 和 path 变量。
结果
baremetal 端点是
http://192.168.42.17/baremetal。baremetal 检查端点是
http://192.168.42.17:5050。