服务命名

了解 Mesos-DNS 服务命名约定

A 记录

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

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

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

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

  1. dig search.marathon.mesos
  2. ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> search.marathon.mesos
  3. ;; global options: +cmd
  4. ;; Got answer:
  5. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24471
  6. ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
  7. ;; QUESTION SECTION:
  8. ;search.marathon.mesos. IN A
  9. ;; ANSWER SECTION:
  10. search.marathon.mesos. 60 IN A 10.0.4.1

<task>.<service>.mesos syntax shown above, Mesos-DNS also generates A records that contain the IP addresses of the agent nodes that are running the task: <task>.<service>.slave.mesos

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

SRV 记录

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

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

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

表 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”。如需更多信息,请参阅 。

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

任务和服务命名约定

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

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

如果您是使用 Marathon 群组,则 Mesos-DNS 主机名是根据应用程序 ID 创建的。例如,如果您有一个名为 的应用程序且它在一个应用 ID 为 /mesosphere-tutorial/nginx-routermesosphere-tutorial 组中,则 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]:

    1. dcos node ssh --leader --master-proxy

    如需更多信息,请参阅 SSH 。

  2. 此例中,安装了 Kafka 和 Chronos:

    1. curl -H "Authorization: token=<auth-token>" http://<master-ip>/mesos_dns/v1/enumerate
    2. {
    3. "frameworks": [
    4. {
    5. "tasks": null,
    6. "name": "chronos"
    7. },
    8. {
    9. "tasks": null,
    10. "name": "kafka"
    11. {
    12. "tasks": [
    13. {
    14. "name": "kafka",
    15. "id": "kafka.443d5d63-f527-11e5-81a5-2a8c0aaf83b5",
    16. "records": [
    17. {
    18. "name": "kafka.marathon.mesos.",
    19. "host": "10.0.2.162",
    20. "rtype": "A"
    21. },
    22. {
    23. "name": "kafka-7fdws-s0.marathon.mesos.",
    24. "host": "10.0.2.162",
    25. "rtype": "A"
    26. },
    27. {
    28. "name": "kafka.marathon.slave.mesos.",
    29. "host": "10.0.2.162",
    30. "rtype": "A"
    31. },
    32. {
    33. "name": "kafka-7fdws-s0.marathon.slave.mesos.",
    34. "host": "10.0.2.162",
    35. "rtype": "A"
    36. },
    37. {
    38. "name": "_kafka._tcp.marathon.slave.mesos.",
    39. "host": "kafka-7fdws-s0.marathon.slave.mesos.:14799",
    40. "rtype": "SRV"
    41. },
    42. {
    43. "name": "_kafka._udp.marathon.slave.mesos.",
    44. "host": "kafka-7fdws-s0.marathon.slave.mesos.:14799",
    45. },
    46. {
    47. "name": "_kafka._tcp.marathon.mesos.",
    48. "host": "kafka-7fdws-s0.marathon.mesos.:14799",
    49. "rtype": "SRV"
    50. }
    51. ]
    52. },
    53. "name": "chronos",
    54. "id": "chronos.40a4f462-f527-11e5-81a5-2a8c0aaf83b5",
    55. "records": [
    56. {
    57. "name": "chronos.marathon.mesos.",
    58. "host": "10.0.2.162",
    59. "rtype": "A"
    60. },
    61. {
    62. "name": "chronos-4dj75-s0.marathon.mesos.",
    63. "host": "10.0.2.162",
    64. "rtype": "A"
    65. },
    66. {
    67. "name": "chronos.marathon.slave.mesos.",
    68. "host": "10.0.2.162",
    69. "rtype": "A"
    70. },
    71. {
    72. "name": "chronos-4dj75-s0.marathon.slave.mesos.",
    73. "host": "10.0.2.162",
    74. "rtype": "A"
    75. },
    76. {
    77. "name": "_chronos._tcp.marathon.slave.mesos.",
    78. "host": "chronos-4dj75-s0.marathon.slave.mesos.:9106",
    79. "rtype": "SRV"
    80. },
    81. {
    82. "name": "_chronos._udp.marathon.slave.mesos.",
    83. "host": "chronos-4dj75-s0.marathon.slave.mesos.:9106",
    84. "rtype": "SRV"
    85. },
    86. {
    87. "name": "_chronos._tcp.marathon.mesos.",
    88. "host": "chronos-4dj75-s0.marathon.mesos.:9106",
    89. "rtype": "SRV"
    90. }
    91. ]
    92. }
    93. ],
    94. "name": "marathon"