注册表 DNS 服务器

该文档描述了注册表 DNS 服务器的内部结构。它基于 [Hadoop 服务注册表](../registry/index.html),该注册表由 Zookeeper 集群支持。

简介

注册表 DNS 服务器为部署的应用程序发布到 Hadoop 注册表中的信息提供标准 DNS 接口。DNS 服务提供以下功能

  1. 通过 DNS 公开现有的服务发现信息 - 当前 Hadoop 服务注册表记录中提供的信息将转换为 DNS 条目,从而允许用户使用标准 DNS 客户端机制(例如,指定服务的 DNS SRV 记录主机名和端口号)来发现有关 YARN 应用程序的信息。
  2. 启用容器到 IP 映射 - 通过标准 DNS 查找启用容器 IP 的发现。由于记录通过 DNS 提供,因此将促进基于容器名称的通信(例如,curl http://solr-0.solr-service.devuser.yarncluster:8983/solr/admin/collections?action=LIST)。

服务属性

现有的 Hadoop 服务注册表用作 DNS 服务信息来源。

DNS 服务器支持以下核心功能

功能属性

  1. 支持为已部署 YARN 应用程序的端点创建 DNS 记录
  2. 在重新启动容器和/或应用程序期间,记录名称保持不变
  3. 支持反向查找(基于 IP 的名称)。请注意,这仅适用于 Docker 容器,因为其他容器共享主机的 IP
  4. 支持使用域名系统安全扩展 (DNSSEC) 定义的标准来确保安全性
  5. 高可用性
  6. 可扩展性 - 该服务提供响应 DNS 查询所需的响应能力(例如低延迟)(超时会尝试调用其他已配置的名称服务器)。

部署属性

  1. 通过充当 Hadoop 集群区域/域的 DNS 服务器,支持与现有 DNS 资产(例如公司 DNS 服务器)集成。该服务器无意充当主 DNS 服务器,也不会将请求转发到其他服务器。相反,可以将主 DNS 服务器配置为将区域转发到注册表 DNS 服务器。
  2. DNS 服务器公开一个端口,该端口可以根据 DNS 标准接收 TCP 和 UDP 请求。DNS 协议的默认端口不在受限范围内 (5335)。但是,现有 DNS 资产可能只允许将区域转发到非自定义端口。为了支持这一点,注册表 DNS 服务器可以在特权模式下启动。

DNS 记录名称结构

生成记录的 DNS 名称由以下元素(标签)组成。请注意,这些元素必须与 DNS 惯例兼容(请参阅 RFC 1035 中的“首选名称语法”)

  • - 集群 DNS 域的名称。此名称作为配置属性提供。此外,此名称在父 DNS 服务器上配置为已定义注册表 DNS 区域的区域名称(父 DNS 服务器将请求转发到注册表 DNS 的区域)。例如 yarncluster.com
  • 用户名 - 应用程序部署者的名称。此名称是与启动应用程序的用户关联的简单短名称(例如,Kerberos 主体的基本组件)。由于用户名是 DNS 名称的元素之一,因此预计它也符合 DNS 名称约定(上面链接的 RFC 1035),因此它使用国际化 DNS 的 punycode 约定转换为有效的 DNS 主机名条目。
  • 应用程序名称 - 已部署 YARN 应用程序的名称。此名称从 YARN 注册表路径推断到应用程序的节点。选择应用程序名称而不是应用程序 ID,以便用户可以轻松引用人类可读的 DNS 名称。这显然要求应用程序名称具有某些唯一性属性。
  • 容器 ID - YARN 分配给容器的 ID(例如,container_e3741_1454001598828_01_000004)
  • 组件名称 - 分配给已部署组件的名称(例如,主组件)。组件是应用程序或服务的一个分布式元素,它在 YARN 容器中启动(例如,HBase 主)。可以想象应用程序中有多个组件。组件名称在 YARN 中还不是一级概念,但它是一个非常有用的概念,我们在这里引入它是为了注册表 DNS 条目。MapReduce、Slider 等许多框架已经有了组件名称(尽管如上所述,它们在 YARN 中尚未以一级方式得到支持)。
  • api - 公开端点的 api 指定

关于 DNS 名称的说明

  • 在大多数情况下,可以通过组成名称的元素/标签数轻松区分 DNS 名称。集群的域名始终是最后一个元素。在解析出该元素后,从右向左读取,第一个元素映射到应用程序用户,依此类推。无论在何处不容易区分,命名约定都用于使用前缀(例如“容器”)或后缀(例如“api”)消除名称歧义。例如,作为管理端点发布的端点将使用名称 management-api.griduser.yarncluster.com 引用。
  • YARN 当前不支持/不保证唯一的应用程序名称(每个用户),但 YARN 服务框架支持。注册表 DNS 服务当前利用 ZK 路径条目中应用程序的最后一个元素作为应用程序名称。这些应用程序名称对于给定用户必须是唯一的。

DNS 服务器功能

DNS 服务的主要功能在以下图表中说明

DNS Functional Overview

DNS 记录创建

下图更详细地说明了 DNS 记录创建和注册序列(注意:服务记录更新将遵循类似的步骤序列,仅由不同的事件类型区分)

DNS Functional Overview

DNS 记录删除

同样,记录删除遵循类似的序列

DNS Functional Overview

(注意:DNS 区域需要一条记录作为删除方法的参数,因此需要类似的解析逻辑来识别应该删除的特定记录)。

DNS 服务初始化

  • DNS 服务在已配置端口上初始化 UDP 和 TCP 侦听器。如果需要受限范围内的端口(例如标准 DNS 端口 53),则可以使用 jsvc 启动 DNS 服务,如启动 DNS 服务器部分所述。
  • 随后,DNS 服务侦听入站 DNS 请求。这些请求是来自用户或其他 DNS 服务器(例如,将 RegistryDNS 服务配置为转发器的 DNS 服务器)的标准 DNS 请求。

启动 DNS 服务器

默认情况下,DNS 服务器在非特权端口 5335 上运行。使用以下命令启动服务器

hadoop --daemon start registrydns

如果 DNS 服务器配置为使用标准特权端口 53,则必须在 hadoop-env.sh 文件中取消注释环境变量 HADOOP_REGISTRYDNS_SECURE_USER 和 HADOOP_REGISTRYDNS_SECURE_EXTRA_OPTS。然后应以 root 身份启动 DNS 服务器,并且在绑定端口后,jsvc 将用于降低守护进程的特权。

配置

注册表 DNS 服务器从 core-site.xml 文件读取其配置属性。以下是与 DNS 关联的配置属性

名称 说明
hadoop.registry.zk.quorum 用于定义 Hadoop 注册表 的 Zookeeper 仲裁组的逗号分隔主机名:端口对列表。
hadoop.registry.dns.enabled 为集群启用 DNS 功能。默认值为 false。
hadoop.registry.dns.domain-name 与 Hadoop 集群关联记录的域名。
hadoop.registry.dns.bind-address 与 DNS 侦听器应绑定的网络接口关联的地址。
hadoop.registry.dns.bind-port DNS 侦听器的端口号。默认端口为 5335。
hadoop.registry.dns.dnssec.enabled 指示是否启用 DNSSEC 支持。默认值为 false。
hadoop.registry.dns.public-key 服务器公钥的 base64 表示形式。用于创建为 DNSSEC 客户端请求提供的 DNSKEY 记录。
hadoop.registry.dns.private-key-file 标准 DNSSEC 私钥文件的路径。只有启动 DNS 的标识才能读取该文件。请参阅 dnssec-keygen 文档。
hadoop.registry.dns-ttl 与 DNS 记录关联的默认 TTL 值。默认值设置为 1(值为 0 的行为未定义)。典型值应近似于 YARN 重新启动失败容器所需的时间。
hadoop.registry.dns.zone-subnet 与集群容器关联的 IP 范围的指示符。该设置用于生成反向区域名称。
hadoop.registry.dns.zone-mask 与区域 IP 范围关联的网络掩码。如果指定,它将用于确定可能的 IP 范围并提出适当的反向区域名称。
hadoop.registry.dns.zones-dir 包含在区域初始化期间读取的区域配置文件的目录。此目录可以包含名为 zone-name.zone 的区域主文件。请参阅 此处 以获取区域主文件文档。

示例配置

 <property>
    <description>The domain name for Hadoop cluster associated records.</description>
    <name>hadoop.registry.dns.domain-name</name>
    <value>ycluster</value>
  </property>

  <property>
    <description>The port number for the DNS listener. The default port is 5335.
    If the standard privileged port 53 is used, make sure start the DNS with jsvc support.</description>
    <name>hadoop.registry.dns.bind-port</name>
    <value>5335</value>
  </property>

  <property>
    <description>The DNS functionality is enabled for the cluster. Default is false.</description>
    <name>hadoop.registry.dns.enabled</name>
    <value>true</value>
  </property>

  <property>
    <description>Address associated with the network interface to which the DNS listener should bind.</description>
    <name>hadoop.registry.dns.bind-address</name>
    <value>localhost</value>
  </property>

  <property>
    <description>A comma separated list of hostname:port pairs defining the zookeeper quorum for the Hadoop registry</description>
    <name>hadoop.registry.zk.quorum</name>
    <value>localhost:2181</value>
  </property>

要配置注册表 DNS 以提供 172.17.0.0/24 的反向查找

  <property>
    <description>The network mask associated with the zone IP range. If specified, it is utilized to ascertain the
    IP range possible and come up with an appropriate reverse zone name.</description>
    <name>hadoop.registry.dns.zone-mask</name>
    <value>255.255.255.0</value>
  </property>

  <property>
    <description>An indicator of the IP range associated with the cluster containers. The setting is utilized for the
     generation of the reverse zone name.</description>
    <name>hadoop.registry.dns.zone-subnet</name>
    <value>172.17.0.0</value>
  </property>

让您的集群使用注册表 DNS

你可以编辑 /etc/resolv.conf 以使你的系统使用注册表 DNS,如下所示,其中 192.168.154.3 是你的 DNS 主机的 IP 地址。它应该出现在任何名称服务器之前,这些名称服务器将为群集使用的域中的查找返回 NXDOMAIN。

nameserver 192.168.154.3

或者,如果你在你的组织中有一个企业 DNS,你可以配置区域转发,以便注册表 DNS 解析群集使用的域的主机名。