レジストリDNSサーバー

このドキュメントでは、レジストリDNSサーバーの内部について説明します。これは、ZooKeeperクラスタをバックエンドとする[Hadoopサービスレジストリ](../registry/index.html)に基づいています。

導入

レジストリ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に基づく名前)をサポートします。ただし、これは、他のコンテナがホストのIPを共有するため、Dockerコンテナの場合のみ機能します。
  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の「推奨される名前構文」を参照)。

  • domain - クラスタDNSドメインの名前。この名前は構成プロパティとして提供されます。さらに、親DNSサーバーで、定義されたレジストリDNSゾーンのゾーン名として構成されます(親DNSサーバーがレジストリDNSへの要求を転送するゾーン)。例:yarncluster.com
  • username - アプリケーションデプロイヤの名前。この名前は、アプリケーションを起動したユーザーに関連付けられた単純な短い名前(例:Kerberosプリンシパルの主要なコンポーネント)です。ユーザー名はDNS名の要素の1つであるため、これもDNS名規則(上記のRFC 1035)に準拠していることが期待されます。そのため、国際化されたDNSに使用されるpunycode規則を使用して、有効なDNSホスト名エントリに変換されます。
  • application name - デプロイされたYARNアプリケーションの名前。この名前は、アプリケーションのノードへのYARNレジストリパスから推測されます。アプリケーションIDではなくアプリケーション名が選択されたのは、ユーザーが人間が読み取れるDNS名を参照しやすくするためです。これは明らかに、アプリケーション名に特定の一意性の特性を義務付けます。
  • container id - YARNによってコンテナに割り当てられたID(例:container_e3741_1454001598828_01_000004)
  • component name - デプロイされたコンポーネント(例:マスターコンポーネント)に割り当てられた名前。コンポーネントは、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サーバーからの標準的なDNSリクエストです(たとえば、レジストリDNSサービスがフォワーダーとして構成されているDNSサーバー)。

DNSサーバーの起動

デフォルトでは、DNSサーバーは非特権ポート`5335`で実行されます。次のコマンドでサーバーを起動します。

hadoop --daemon start registrydns

DNSサーバーが標準的な特権ポート`53`を使用するように構成されている場合、`hadoop-env.sh`ファイルで環境変数`HADOOP_REGISTRYDNS_SECURE_USER`と`HADOOP_REGISTRYDNS_SECURE_EXTRA_OPTS`のコメントを外す必要があります。その後、DNSサーバーをrootとして起動し、ポートがバインドされた後に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>

172.17.0.0/24のリバースルックアップを提供するようにレジストリDNSを設定するには

  <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を使用する

システムでレジストリDNSを使用するように/etc/resolv.confを編集できます。例として以下に示します。ここで、192.168.154.3はDNSホストのIPアドレスです。これは、クラスタで使用されるドメインのルックアップでNXDOMAINを返す名前サーバーの前に表示される必要があります。

nameserver 192.168.154.3

あるいは、組織内に企業DNSがある場合は、ゾーン転送を設定して、レジストリDNSがクラスタで使用されるドメインのホスト名を解決するようにすることができます。