外部 DNS 解析

https://blueprints.launchpad.net/neutron/+spec/external-dns-resolution

作者:

Carl Baldwin <carl.baldwin@hp.com>

版权:

2015 Hewlett-Packard Development Company, L.P.

该蓝图是在内部 DNS 解析蓝图的基础上构建的 [1]。后者协调了 Nova VM 名称与 Neutron DHCP 分配的主机名以及可以使用 Neutron 内部 DNS 查找主机的 DNS 名称。下一步是将 DNSaaS 集成,以便可以使用实例名称加上云外部的 DNS 域名来查找实例。

问题描述

随着实例的来来去去以及浮动 IP 的关联和取消关联,外部 DNS 服务可能需要进行更改以反映这些变化。目前,这些更改需要独立进行。这通常是一个手动过程,容易出错。可以使用指向外部 DNS 服务的 API 对其进行脚本编写,但这会给 API 用户及其脚本增加复杂性。

提议的变更

概述

此更改会将 Neutron 外部网络上的公共 IP 地址与外部 DNS 服务(例如 OpenStack Designate)关联起来。租户期望网络上 IP 地址的创建、更新或删除会导致 DNS 中相应的一组更改,涵盖 A/AAAA 和 PTR 记录。

目前需要考虑的一个重要问题是,DNS 名称指向的 A/AAAA 记录是与实例关联还是与公共 IP 本身关联。这个问题将在 数据模型影响 部分中详细讨论。

此更改将引入一个接口以及该接口的参考实现,该接口将与 OpenStack Designate 服务集成。此参考实现将尽可能易于配置和使用。

此驱动程序将以类似于 Nova 配置访问 Neutron 服务以创建端口的方式,通过管理方式配置外部服务的凭据。

分域 DNS

考虑使用 NAT 的 IPv4 情况,并且已将 DNS 域与网络关联。人们可能会期望 DNS 对该域的查询使用位于同一网络上的 VM 的私有 IP 地址进行响应。类似地,对私有 IP 地址的反向 DNS 请求将返回 VM 的 DNS 名称。

分域 DNS 的优势在于,无论机器是否在同一网络或不同网络上,任何机器都可以使用相同的名称来表示其他机器。

使用 BIND 9 dns 服务器视图已经实现了这种功能。通常,禁用外部区域的递归 DNS,但不在内部区域禁用。

该蓝图将通过利用现有的 dnsmasq 实现进行内部解析,并与外部 dns 服务集成以实现外部部分,从而实现这一点。

目前,Neutron 将域名设置为 openstacklocal。为了启用分域 DNS,网络的 dnsmasq 将配置为使用与该网络关联的域名,而不是 openstacklocal。如果没有关联域名,则它将默认设置为 openstacklocal。

分域 DNS 有一些限制。

  1. 如果两个网络通过 neutron 路由器私下连接,则它们之间将无法使用分域 DNS。它仅适用于同一网络上的实例名称。

  2. 数据模型影响 中所述,它可能无法用于来自浮动 IP 的名称。

数据模型影响

+–––––––––––––+    +–––––––––––––+    +–––––––––––––+    +–––––––––––––+
| FloatingIP  |    | Port        |    | Network     |    | DNSDomain   |
+–––––––––––––+    +–––––––––––––+    +–––––––––––––+    +–––––––––––––+
| ...         |––> | ...         |––> |...          | -->|             |
|             |    |             |    |             |    |             |
| dns_domain  |    |             |    |             |    | dns_domain  |
| dns_name    |    | dns_name    |    |             |    |             |
+–––––––––––––+    +–––––––––––––+    +–––––––––––––+    +–––––––––––––+
     \                                                          |
      \                                                         V
       \                                           +––––––––––––––––––––––+
        \                                          | External DNS service |
         \                                         +––––––––––––––––––––––+
          +––––––––––––––––––––––––––––––––––––––> | dns_domain           |
                                                   | dns_name             |
                                                   | ...                  |
                                                   |                      |
                                                   +––––––––––––––––––––––+

上图总结了将对数据模型进行的更改以及这些更改将如何支持与外部 DNS 服务的交互。这些交互是在创建、更新或删除公共 IP 时触发的。将支持三种情况

  1. 具有空 dns_domain 和 dns_name 的浮动 IP

    In this case, DNS names are linked to instances.  More precisely, they are
    linked through the port attached to the instance.  When a floating IP
    association changes, the name and domain used for DNS will come from the
    backing port's dns_name and the DNSDomain associated to the port's
    network.
    
    The dns_name will match either the Nova display name or the Neutron
    generated name consistent with the first part of this blueprint.
    
  2. 具有非空 dns_domain 和 dns_name 的浮动 IP

    In this case, the dns_name and the dns_domain are linked to the floating
    IP. When the floating IP association changes there is no need to change
    anything in DNS.  The instance name has no relevance.
    
    This covers the use case where a floating IP should always have a given
    name and domain regardless of which instance it is associated with.
    
    The values for dns_name and dns_domain can be overridden for each floating
    IP.  If these values are set on the floating IP then the DNS name comes
    from the floating IP.
    
  3. 没有空 dns_name 的端口,位于没有空 dns_domain 的公共提供程序网络上

    This is the case where the user is making the ports in a provider network
    accesible outside the Openstack cloud. Once more, DNS names are linked to
    instances through their ports attached to the provider network. An
    instance's name and domain used for DNS will come from its backing port
    dns_name and the DNSDomain associated to the port's network.
    
    The dns_name will match either the Nova display name or the Neutron
    generated name consistent with the first part of this blueprint.
    

注意

可以将多个网络链接到相同的 DNS 域。这会引发对重复名称的潜在担忧。DNS 中重复条目的有效部分,并且该蓝图认为它们是可以接受的。

注意

由于 A 和 AAAA 记录的映射方式取决于运行分域视图的 DNS 是否正在运行,因此如果它们存在,将 IP 发布在两个名称下可能是有意义的。

对于 PTR 记录,将发布指向私有 IP 地址下的实例 dns 名称的指针,以及指向浮动 IP 地址下的浮动 ip dns 名称的指针。

DNSDomain

将向数据模型添加一个 DNSDomain 对象,并与网络对象建立一对多的关系。这将允许将多个网络与 DNS 域名关联起来。与 DNSDomain 对象没有关系意味着网络对象未与 DNS 域名关联。无需在升级时填充现有的网络对象,因此升级不需要任何特殊关注。

DNSDomain 对象中的 dns_domain 将在 API 级别验证为合法的 dns 域。插件还将使用外部服务验证域,以确保其存在并且租户可以访问它。

在某些情况下,外部服务中可能合法存在多次相同的 DNS 域名。可以可选地将特定于驱动程序的限定符附加到 dns_domain 名称,并且该限定符将由单个冒号 (:) 字符分隔。例如,假设域名 example.org 存在于外部服务中,资源 ID 为 298c22d1-cebd-475b-b5c9-0f880ee2f23f,则 DNSDomain 存储的限定域名可能是“example.org:298c22d1-cebd-475b-b5c9-0f880ee2f23f”。使用限定符必须是可选的,并且仅在项目在外部服务中看到多个具有相同名称的 DNS 域时才需要。

浮动 IP

将向浮动 IP 对象添加两个字段 - dns_domain 和 dns_name。dns_domain 字段将以与 DNSDomain 对象相同的验证方式进行验证。dns_name 字段将验证为有效的 PQDN。有关详细信息,请参阅 internal-dns-resolution 蓝图。

REST API 影响

API 将扩展为支持对新对象 DNSDomain 进行 CRUD 操作。创建和更新操作将允许用户将 dns 域与网络列表关联起来。

用于管理浮动 IP 的当前 API 将扩展为添加可选的 dns_domain 和 dns_name 字段。

安全影响

Neutron 配置文件将包含访问外部服务的驱动程序特定配置,这将包括用户名/密码等敏感信息,并且类似于 Nova 配置 Neutron 凭据以在创建实例时创建端口的方式。

通知影响

其他最终用户影响

此更改需要对 python-neutronclient 进行相应的更改,以支持 REST API 影响 中的 API 更改。

性能影响

IPv6 影响

其他部署者影响

此更改需要部署者显式启用。它是可选的,默认设置适用于现有或新的部署。

部署者将负责配置驱动程序以与外部 DNS 服务交互。这将是一个可选功能,并且在希望启用新功能之前不需要部署者采取任何操作。

开发人员影响

社区影响

备选方案

此功能可以由 Designate 处理。通常,这具有排除其他 DNS 服务的缺点。

可以通过轮询 Neutron 以获取公共 IP 地址的更改来实现。这样做需要调整轮询间隔,以便它足够频繁,用户不会抱怨更改生效的时间,但又不会过于频繁,从而成为系统性能的负担。

也可以通过将 Designate 与 Neutron RPC 集成来实现,以便它获取公共 IP 地址的更改。这具有将 Designate 绑定到 Neutron 实现的缺点。Designate 难以理解和解释内部端口与浮动 IP 端口之间的关系。控制 DNS 名称的关联性也很困难。

实现

工作项

  1. 扩展数据库模型。

    • 将 dns_name 和 dns_domain 属性添加到 FloatingIP 模型。

    • 添加 DNSDomain 对象。

  2. 数据库升级脚本。

  3. 扩展 API 和验证器。

    • 将 dns_name 和 dns_domain 添加到 FloatingIP。

    • 实现 DNSDomain 的 CRUD 操作

  4. 实现 Neutron 和外部 DNS 服务之间的接口

  5. 实现 Designate 的驱动程序。

依赖项

https://blueprints.launchpad.net/nova/+spec/internal-dns-resolution

此更改需要使用 Designate API,而 Neutron 目前未使用该 API。

测试

Tempest 测试

Designate 具有完整的 DevStack 插件,可以用作 gate 集成测试的一部分。关于是否需要将此插件包含在 devstack 树中,或者是否可以从 Designate 存储库可靠地使用它,存在一个公开的问题。

功能测试

API 测试

文档影响

应记录 REST api 影响

参考资料