服务命名

了解 Mesos-DNS 服务命名约定

Mesos-DNS 为在 DC/OS 上运行的 Mesos 任务定义 DNS 顶级域 .mesos 通过在此 Mesos 域中查找 A 记录以及可选地查找 SRV 记录,可以发现任务和服务。

A 记录

A 记录将主机名与一个 IP 地址关联。当 DC/OS 服务启动一个任务时,Mesos-DNS 以可提供以下任一内容的格式 <task>.<service>.mesos 为主机名生成 A 记录:

  • 正在运行此任务的 代理节点 的 IP 地址
  • 此任务的网络容器的 IP 地址(由 Mesos 容器化工具提供)

例如,其他 DC/OS 任务可以发现名为 search 的任务的 IP 地址,此任务由 marathon 启动以查找 search.marathon.mesos:

dig search.marathon.mesos

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> search.marathon.mesos
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24471
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;search.marathon.mesos. IN  A

;; ANSWER SECTION:
search.marathon.mesos. 60  IN  A   10.9.87.94

如果启动任务的 Mesos 容器化工具为任务 10.0.4.1 提供了容器 IP search.marathon.mesos,则查找结果为:

dig search.marathon.mesos

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> search.marathon.mesos
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24471
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;search.marathon.mesos. IN  A

;; ANSWER SECTION:
search.marathon.mesos. 60  IN  A   10.0.4.1

除了上面显示的 <task>.<service>.mesos 语法之外,Mesos-DNS 还生成 A 记录,其中包含运行任务的代理节点 IP 地址:<task>.<service>.slave.mesos.

例如,查询 search.marathon.slave.mesos 的 A 记录显示在 search 服务上运行 marathon 应用程序一个或多个实例的每个代理节点的 IP 地址。

SRV 记录

SRV 记录指定服务的主机名和端口。

对于由名为 mytask 的服务启动的名为 myservice 的任务,Mesos-DNS 生成一个 SRV 记录 _mytask._protocol.myservice.mesos,其中 protocoludptcp. 例如,其他 Mesos 任务可以发现名为 search 的任务,此任务由 marathon 启动以查询 _search._tcp.marathon.mesos:

dig _search._tcp.marathon.mesos SRV

;  DiG 9.8.4-rpz2+rl005.12-P1 &lt;&lt;&gt;&gt; _search._tcp.marathon.mesos SRV
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 33793
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;_search._tcp.marathon.mesos. IN SRV

;; ANSWER SECTION:
_search._tcp.marathon.mesos. 60 IN SRV 0 0 31302 10.254.132.41.

Mesos-DNS 支持使用任务的 DiscoveryInfo 来生成 SRV 记录。在 DC/OS 群集上,代理节点提供端口的方式与 CPU 和内存等其他资源的相同。如果 DiscoveryInfo 不可用,Mesos-DNS 将使用为任务分配的端口。

下表显示了对 SRV 生成适用的规则:

服务 已知的容器 IP 提供的 DiscoveryInfo 目标主机 目标端口 A 记录目标 IP
_mytask._protocol.myservice.mesos mytask.myservice.slave.mesos 主机端口 代理 IP
_mytask._protocol.myservice.mesos mytask.myservice.slave.mesos 主机端口 代理 IP
_mytask._protocol.myservice.mesos mytask.myservice.mesos DiscoveryInfo 端口 代理 IP
_mytask._protocol.myservice.mesos mytask.myservice.mesos DiscoveryInfo 端口 容器 IP
mytask.protocol.myservice.slave.mesos 不适用 不适用 mytask.myservice.slave.mesos 主机端口 代理 IP

表 1. SRV 生成规则

其他记录

Mesos-DNS 生成一些特殊记录:

  • 对于领导管理节点:A 记录 (leader.mesos) 和 SRV 记录 (_leader._tcp.mesos_leader._udp.mesos)
  • 对于所有服务调度器:A 记录 (myservice.mesos) 和 SRV 记录 (_myservice._tcp.myservice.mesos)
  • 对于每个已知的 DC/OS 管理节点:A 记录 (master.mesos)
  • 对于每个已知的 DC/OS 代理节点:A 记录 (slave.mesos) 和 SRV 记录 (_slave._tcp.mesos)

重要信息:要查询领导管理节点,应始终查询"leader.mesos",而不是"master.mesos"。如需更多信息,请参阅此 FAQ 条目

选者新管理节点和更新 Mesos-DNS 中的领导者/管理节点记录之间存在延迟。Mesos-DNS 还支持 Mesos 域的 SOA 和 NS 记录请求。对 Mesos 域中其他类型记录的 DNS 请求将返回 NXDOMAIN. Mesos-DNS 不支持反向查找所需的 PTR 记录。Mesos-DNS 还会为自己生成 A 记录,列出了 Mesos-DNS 将答复查找请求的所有 IP 地址。这些 A 记录的主机名是 ns1.mesos.

任务和服务命名约定

Mesos-DNS 遵循关于名称格式化的 RFC 1123。用于构建 A 记录主机名和用于构建 SRV 记录的服务名的所有字段必须为 63 个字符或更短,可以包含字母 (A-Z)、数字 (0-9) 和破折号 (-)。名称不分大小写。如果任务名不符合这些限制,Mesos-DNS 将把名称缩短到 24 个字符,删除所有无效字符并以破折号 (-) 替换句点 (.)。对于 Mesos DNS 名称,可以选择执行 RFC 952

请注意,服务名和任务名的规则存在差异。对于服务名,允许使用句点 (.),但所有其他规则适用。例如,由服务 apiserver.myservice 启动的名为 marathon.prod 的任务将具有与 apiserver-myservice.marathon.prod.mesos 名称关联的 A 记录以及与名称 _apiserver-myservice._tcp.marathon.prod.mesos. 关联的 SRV 记录。

有些服务注册的默认名称让人难以理解。例如,旧版本的 Marathon 可以注册使用 marathon-0.7.5 等名称,但这会产生诸如 search.marathon-0.7.5.mesos. 的 Mesos-DNS 主机名。您可以通过启动自定义名称的服务来避免此问题。例如,以 --framework_name marathon 启动 Marathon 将该服务注册为 marathon.

如果您是使用 Marathon 群组,则 Mesos-DNS 主机名是根据应用程序 ID 创建的。例如,如果您有一个名为 nginx-router 的应用程序且它在一个应用 ID 为 mesosphere-tutorial/mesosphere-tutorial/nginx-router 组中,则 DNS 名称将为 nginx-router-mesosphere-.marathon.mesos. 请注意,Mesos-DNS 将主机名截断为 24 个字符,将破折号替换为介于 mesosphere-tutorialnginx-router. 的斜杠。

如果某个服务启动多个名称相同的任务,DNS 查找将返回多个记录,每个任务一个。Mesos-DNS 随机改变记录的顺序,以在这些任务之间提供负载均衡。

警告:如果不同服务启动具有相同主机名的任务,则可能会出现名称冲突。如果不同服务启动具有相同 Mesos-DNS 主机名的任务,或者如果 Mesos-DNS 截断了应用 ID 以创建相同的 Mesos-DNS 主机名,则应用程序会与错误的代理节点通信,并且不可预测地失败。

发现服务的 DNS 名称

您可以获得在 DC/OS 群集节点上运行的应用程序的综合列表。

前提条件: DC/OS 和 DC/OS CLI 已安装。

  1. SSH 到您的节点。例如,使用以下命令对管理节点执行 [SSH]:

    dcos node ssh --leader --master-proxy
    

    如需更多信息,请参阅 SSH 文档.

  2. 从管理节点运行此命令以查看节点详情:

    curl -H "Authorization: token=<auth-token>" http://<master-ip>/mesos_dns/v1/enumerate
    

    此例中,安装了 Kafka 和 Chronos:

       curl -H "Authorization: token=<auth-token>" http://<master-ip>/mesos_dns/v1/enumerate
         {
           "frameworks": [
            {
             "tasks": null,
             "name": "chronos"
            },
            {
             "tasks": null,
             "name": "kafka"
            },
            {
             "tasks": [
              {
               "name": "kafka",
               "id": "kafka.443d5d63-f527-11e5-81a5-2a8c0aaf83b5",
               "records": [
                {
                 "name": "kafka.marathon.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "kafka-7fdws-s0.marathon.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "kafka.marathon.slave.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "kafka-7fdws-s0.marathon.slave.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "_kafka._tcp.marathon.slave.mesos.",
                 "host": "kafka-7fdws-s0.marathon.slave.mesos.:14799",
                 "rtype": "SRV"
                },
                {
                 "name": "_kafka._udp.marathon.slave.mesos.",
                 "host": "kafka-7fdws-s0.marathon.slave.mesos.:14799",
                 "rtype": "SRV"
                },
                {
                 "name": "_kafka._tcp.marathon.mesos.",
                 "host": "kafka-7fdws-s0.marathon.mesos.:14799",
                 "rtype": "SRV"
                }
               ]
              },
              {
               "name": "chronos",
               "id": "chronos.40a4f462-f527-11e5-81a5-2a8c0aaf83b5",
               "records": [
                {
                 "name": "chronos.marathon.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "chronos-4dj75-s0.marathon.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "chronos.marathon.slave.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "chronos-4dj75-s0.marathon.slave.mesos.",
                 "host": "10.0.2.162",
                 "rtype": "A"
                },
                {
                 "name": "_chronos._tcp.marathon.slave.mesos.",
                 "host": "chronos-4dj75-s0.marathon.slave.mesos.:9106",
                 "rtype": "SRV"
                },
                {
                 "name": "_chronos._udp.marathon.slave.mesos.",
                 "host": "chronos-4dj75-s0.marathon.slave.mesos.:9106",
                 "rtype": "SRV"
                },
                {
                 "name": "_chronos._tcp.marathon.mesos.",
                 "host": "chronos-4dj75-s0.marathon.mesos.:9106",
                 "rtype": "SRV"
                }
               ]
              }
             ],
             "name": "marathon"
            }
           ]