登錄 DNS 伺服器

本文檔說明登錄 DNS 伺服器的內部結構。其基於 [Hadoop 服務登錄](../registry/index.html),由 Zookeeper 叢集支援。

簡介

登錄 DNS 伺服器提供標準 DNS 介面,以存取已部署應用程式張貼至 Hadoop 登錄的資訊。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 伺服器公開一個可同時接收 TCP 和 UDP 要求的埠,符合 DNS 標準。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 名稱可以透過組成名稱的元素/標籤數量輕鬆區分。叢集的網域名稱永遠是最後一個元素。在分析出該元素後,從右至左讀取,第一個元素會對應到應用程式使用者,依此類推。在無法輕鬆區分的任何地方,都會使用命名慣例來使用「container」等字首或「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),可以如啟動 DNS 伺服器部分所述,使用 jsvc 啟動 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 解析群集使用的網域中的主機名稱。