内部 DNS 解析

OpenStack 云的用户希望以直观的方式使用域名系统 (DNS) 按名称查找他们的实例。在使用 Nova 启动实例时,会提供一个名称,然后将其用作系统的hostname。启动实例中的许多程序使用 DNS 来解析 hostname,当 hostname 无法解析时,功能会低于理想状态。

问题描述

缺乏合理的内部 DNS 解析困扰着 OpenStack 部署实例的用户,甚至早于 ice(-house) 时代。Neutron 长期以来为租户网络提供 DNS 服务,但 Neutron 提供的默认名称定义为 ‘host-%(octet0)s-%(octet1)s-%(octet2)s-%(octet3)s.openstacklocal’。由于此名称与实例名称/hostname 不匹配,因此在尝试解析 hostname 时 DNS 查询会失败。

以下是一些对租户来说会变得棘手的情况示例

  1. Sudo 每次运行时都会尝试解析 hostname。Sudo 继续工作,但抱怨名称解析失败

    ubuntu@john-oliver:~$ sudo -s
    sudo: unable to resolve host john-oliver
    
  2. 用户无法像在裸机实验室环境中那样,通过名称在正常的网络操作中逻辑地引用其他实例

    ubuntu@jon-stewart:~$ ping john-oliver
    ping: unknown host john-oliver
    
  3. 诸如 rabbitmq-server 之类的应用程序需要可解析的 hostname 才能正常工作。

OpenStack Neutron 和 Nova 项目分别在 Liberty 和 Mitaka 版本中解决了这个问题,这些 charms 应该为最终用户启用此功能。

提议的变更

Neutron 的 Liberty 版本引入了 DNS 扩展驱动程序 [1]。启用此扩展驱动程序后,它会将 dns_domain 属性添加到 Neutron Network API,并将 dns_namedns_fqdn (只读) 属性添加到 Neutron Port API。这些新属性由 Neutron dhcp-agent 在为 dnsmasq 进程创建主机文件时使用。

在随后的 Mitaka 版本中,Nova 项目利用 Neutron 中新创建的 DNS 扩展来提供实例名称的 DNS 规范化版本 [2]。启动新实例时,Nova 将通过 Neutron API 为其创建的端口提供 dns_name 属性。

OpenStack 文档 [3] 在 Mitaka 版本中提供了有关如何在这两个项目之间启用此 DNS 集成的详细信息。配置部分完全属于 Neutron 项目,因为 Nova 会“正确地做事”(TM)。

本规范建议为部署的云启用内部 DNS 解析,并且不尝试涵盖与外部 DNS 服务(如 Designate)的集成。

重要的是要注意,此功能提供的内部 DNS 解析是网络隔离的,而不是租户隔离的。因此,在网络 A 中启动的实例将无法解析在网络 B 中启动的实例。对于这种类型的名称解析,应使用 Designate 等外部 DNS 服务,并且超出了本规范的范围。

要启用内部 DNS 解析,必须将 neutron-server 服务配置为在 neutron.conf 文件中将 dns_domain 配置选项设置为其他值,而不是 openstacklocal,并且必须在 ml2_conf.ini 文件中启用 dns 扩展驱动程序。

此更改将添加两个新的配置选项,如下所示

enable-ml2-dns:
  type: boolean
  default: False
  description: |
    Enables the Neutron DNS extension driver. When enabled, ports attached
    to Nova instances will have DNS names assigned based on the instance
    name.
dns-domain:
  type: string
  default: openstack.example.
  description: |
    Specifies the dns domain name that should be used for building instance
    hostnames. An empty option or the value of 'openstacklocal' will cause
    the dhcp agents to broadcast the default domain of openstacklocal and
    will not enable internal cloud dns resolution. This value should end
    with a '.', e.g. 'cloud.example.org.'.

为了启用内部 DNS 解析,用户必须将 enable-ml2-dns 设置为 True。默认值为 False,以便为现有的部署提供向后兼容性。

DNS 转发服务器

仅 dns-domain 并不足以提供 neutron 网络所需的所有配置选项。在大多数情况下,管理员还需要能够指定 dns 转发服务器。为了做到这一点,将提供一个新的配置选项,允许用户配置用作转发服务器的 nameservers。

根据 [4],有三种配置云中启动实例的 DNS nameservers 的方法。租户子网可以拥有自己的 nameservers,需要额外的工作才能启用它。DHCP 代理提供默认 nameserver 信息,指向 dhcp 端口地址,但不包含任何额外的转发服务器。默认情况下,这仅允许实例能够解析同一子网中的其他实例。为了修改这一点,neutron-openvswitch 和 neutron-gateway charms 将被修改,以允许用户指定 DNS 转发服务器。这些 charms 不会包含任何允许使用在 DHCP 代理的主机上配置的 DNS 解析器(dnsmasq_local_resolv 选项)的选项,因为它会带来将内部基础设施级别资源泄漏到实例的风险。

因此,neutron-openvswitch 和 neutron-gateway charms 将添加一个选项 dns-servers,它将配置 dhcp_agent.ini 文件中的 dnsmasq_dns_servers 选项。该选项定义如下

dns-servers:
  type: string
  default:
  description: |
    A comma-separated list of DNS servers which will be used by dnsmasq as
    forwarders.

enable-local-dhcp-and-metadata 选项设置为 True 时,dns-servers 选项仅适用于 neutron-openvswitch charm。

关系影响

neutron-dhcp-agent 不在与 neutron-server 相同的节点上运行,并且应该在 dhcp_conf.ini 文件中指定 dns_domain。在 dhcp_conf.ini 文件中指定此值并非绝对必要,因为主机名将在没有它的情况下正确解析。但是,向主机通告的默认搜索列表将是默认的 openstacklocal,可能会让用户感到困惑。为了允许 neutron-api charm 与相关方共享此配置信息,neutron-plugin-api relation-data 将更新为包含 dns-domain 名称

'dns-domain': 'domain.tld.'

该值将是一个包含域名名称的字符串。

备选方案

  1. 可以设置 Designate 以提供租户的 DNS 服务条目。此选项有效,但需要设置和部署到环境中的其他组件。此外,上游文档中对配置 DNS 集成的某些限制没有充分记录。例如,Neutron port API 不会为隧道租户网络(例如 GRE)上的端口调用 Designate API。

  2. 可以部署基于 OpenStack 事件的 serverstack-dns 工具之类的带外解决方案来提供 DNS。这不太理想,因为它必须安装在每个租户上,每个租户必须具有访问底层云资源的凭据,并且该工具本身不适用于生产环境。

实现

负责人

主要负责人

billy-olsen

Gerrit Topic

对于与此规范相关的所有补丁,请使用 Gerrit 主题“charms-internal-dns”。

git-review -t charms-internal-dns

工作项

charm-neutron-api
  • 将新的配置选项添加到 neutron api charm

  • 将 dns-domain 添加到 neutron-plugin-api 接口

  • 更新 README.md 以反映新的行为

charm-neutron-gateway
  • 更新 neutron-gatway 以从关系数据中获取 dns-domain

  • 添加 dns-servers 配置选项到 charm

charm-neutron-openvswitch
  • 更新 neutron-openvswitch charm 以从关系数据中获取 dns-domain

  • 添加 dns-servers 配置选项到 charm

仓库

不需要新的 git 仓库。

支持的发布版本

此功能将在运行 Mitaka 或更高版本的已部署云上可用。尝试在早期版本上启用此功能将不会产生任何影响。

文档

neutron-api charm 的 README 需要更新,以反映新的功能以及如何启用内部 DNS。

安全性

此变更没有安全影响。

测试

实施将包括所有新编写代码的单元测试; amulet 功能测试将更新,以确保在 charm 集中正确实施该功能。

依赖项

没有外部依赖项。