DC/OS 覆盖网络

了解 DC/OS 覆盖网络

DC/OS 覆盖网络 (Overlay) 是一种 SDN 解决方案,适用于到货时预封装有 DC/OS 的 UCR 和 Docker 容器,默认情况下处于启用状态。DC/OS 覆盖网络可以运行给定 DC/OS 集群中的多个虚拟网络实例。从 DC/OS 1.11 开始,DC/OS 覆盖网络就支持创建 IPv6 网络。

注意: IPv6 支持仅适用于 Docker 容器。

DC/OS 覆盖网络提供的功能包括:

  • Mesos 和 Docker 容器均可从单个节点的内部以及在集群上的节点之间通信。
  • 可以创建服务,使其流量与来自集群中任何其他虚拟网络或主机的其他流量隔离。
  • 无需担心可能与应用程序中的端口重合,无需使用服务用的非标准端口来避免重合。
  • 可以生成一类任务任意数量的实例,并让它们全部侦听同一端口,使得客户端不必进行端口发现。
  • 可以运行需要集群间连通的应用程序,如 Cassandra、HDFS 和 Riak。
  • 可以创建多个虚拟网络来隔离您组织的不同部分,如开发、营销和生产。

有关 DC/OS 覆盖网络的设计和实现的详细信息,请参阅 覆盖简介。DC/OS 覆盖网络的默认配置提供 IPv4 虚拟网络、dcos,以及 YAML 配置如下的 IPv6 虚拟网络 dcos6

  1. dcos_overlay_network :
  2. vtep_subnet: 44.128.0.0/20
  3. vtep_subnet6: fd01:a::/64
  4. vtep_mac_oui: 70:B3:D5:00:00:00
  5. overlays:
  6. - name: dcos
  7. subnet: 9.0.0.0/8
  8. prefix: 24
  9. - name: dcos6
  10. subnet6: fd01:b::/64
  11. prefix6: 80

每个虚拟网络通过一个规范的 name 识别(有关虚拟网络命名的限制,请参阅 限制)。在虚拟网络上启动的容器从分配给虚拟网络的子网获取 IP 地址。要移除对全局 IPAM 的依赖关系,覆盖子网进一步分成更小的子网。每个更小的子网都会分配给代理。然后,代理可以使用主机本地 IPAM 将 IP 地址从它们各自相应的子网分配给在代理上启动的容器,并附加到给定的覆盖网络。prefix 确定分配给每个代理的子网(从覆盖子网创造出来)的大小,进而定义覆盖网络可运行的代理的数量。例如,在高于虚拟网络的默认配置中,dcos 分配有 /8 子网(在“子网”字段),它然后被分为每个将作为网络一部分的主机上使用的 /26 容器子网(在“前缀”字段中),如下所示:

虚拟网络地址空间

图 1. 虚拟网络地址空间

保留用于 ContainerID(此例中为 6 )的位元然后被分为两个相等的组(此例中为 5 个位元),分别用于 Mesos 容器和 Docker 容器。使用默认配置时,每个代理将能够承载最多 2^5=32 个 Mesos 容器和 32 个 Docker 容器。使用此特定配置时,如果服务尝试在 Mesos containerizer或 Docker containerizer上启动超过 32 个任务,它将会收到 TASK_FAILED。请参阅虚拟网络主要页面的 限制 部分,了解有关此限制的更多信息。

虽然上述示例是专门针对 IPv4 虚拟网络的,但同样的逻辑也可用于 IPv6 虚拟网络 dcos6。唯一的区别在于,目前Ipv6仅被 Docker 容器支持。

注意: 尝试启动 dcos6 上的 UCR 容器会导致容器启动失败。

您可以修改默认虚拟网络配置,并可根据需要添加更多虚拟网络。目前,您只能在安装时添加或删除虚拟网络。

在安装时添加虚拟网络

DC/OS 虚拟网络只能在安装时进行添加和配置。要替换或添加另一个虚拟网络,请根据这些说明重新安装 DC/OS

通过修改 config.yaml 文件,可以覆盖默认的网络,或者可以对其他虚拟网络进行设置:

  1. agent_list:
  2. - 10.10.0.117
  3. - 10.10.0.116
  4. # Use this bootstrap_url value unless the DC/OS installer assets have been moved.
  5. bootstrap_url: file:///opt/dcos_install_tmp
  6. cluster_name: <cluster-name>
  7. master_discovery: static
  8. master_list:
  9. - 10.10.0.120
  10. - 10.10.0.119
  11. - 10.10.0.118
  12. resolvers:
  13. - 8.8.4.4
  14. - 8.8.8.8
  15. ssh_port: 22
  16. ssh_user: centos
  17. dcos_overlay_network:
  18. vtep_subnet: 44.128.0.0/20
  19. vtep_mac_oui: 70:B3:D5:00:00:00
  20. overlays:
  21. - name: dcos
  22. subnet: 9.0.0.0/8
  23. prefix: 26
  24. - name: dcos-1
  25. subnet: 192.168.0.0/16
  26. prefix: 24

上例中,定义了两个虚拟网络。虚拟网络 dcos 保留默认虚拟网络,并添加了另一个名为 dcos-1 的虚拟网络,其子网范围为 192.168.0.0/16。在 DC/OS 覆盖网络中,虚拟网络必须与一个名称和子网关联。该名称用于使用此特定虚拟网络来启动 Marathon 任务和其他 Mesos 框架任务(请参阅 使用)。由于 Linux 设备名称的大小限制,虚拟网络名称必须少于 13 个字符。请参阅虚拟网络主要页面的 限制 部分,了解更多信息。

检索虚拟网络状态

DC/OS 安装完成后,可从 https://leader.mesos:5050/overlay-master/state 端点获得虚拟网络配置。以下片断的 network 部分列出了当前覆盖配置,agents 部分列出了覆盖是如何跨 Mesos 代理节点分配的。以下内容显示了当名为 dcos 的集群中存在单个覆盖时的网络状态。

  1. "agents": [
  2. {
  3. "ip": "172.17.0.2",
  4. "overlays": [
  5. {
  6. "backend": {
  7. "vxlan": {
  8. "vni": 1024,
  9. "vtep_ip": "44.128.0.1/20",
  10. "vtep_ip6": "fd01:a::1/64",
  11. "vtep_mac": "70:b3:d5:80:00:01",
  12. "vtep_name": "vtep1024"
  13. }
  14. },
  15. "info": {
  16. "name": "dcos",
  17. "prefix": 24,
  18. "subnet": "9.0.0.0/8"
  19. },
  20. "state": {
  21. "status": "STATUS_OK"
  22. },
  23. "subnet": "9.0.0.0/24"
  24. },
  25. {
  26. "backend": {
  27. "vxlan": {
  28. "vni": 1024,
  29. "vtep_ip": "44.128.0.1/20",
  30. "vtep_ip6": "fd01:a::1/64",
  31. "vtep_mac": "70:b3:d5:80:00:01",
  32. "vtep_name": "vtep1024"
  33. }
  34. },
  35. "info": {
  36. "name": "dcos6",
  37. "prefix6": 80,
  38. "subnet6": "fd01:b::/64"
  39. },
  40. "state": {
  41. "status": "STATUS_OK"
  42. },
  43. "subnet6": "fd01:b::/80"
  44. }
  45. ]
  46. },
  47. {
  48. "ip": "172.17.0.4",
  49. "overlays": [
  50. {
  51. "backend": {
  52. "vxlan": {
  53. "vni": 1024,
  54. "vtep_ip": "44.128.0.2/20",
  55. "vtep_ip6": "fd01:a::2/64",
  56. "vtep_mac": "70:b3:d5:80:00:02",
  57. "vtep_name": "vtep1024"
  58. }
  59. },
  60. "docker_bridge": {
  61. "ip": "9.0.1.128/25",
  62. "name": "d-dcos"
  63. },
  64. "info": {
  65. "name": "dcos",
  66. "prefix": 24,
  67. "subnet": "9.0.0.0/8"
  68. },
  69. "mesos_bridge": {
  70. "ip": "9.0.1.0/25",
  71. "name": "m-dcos"
  72. },
  73. "state": {
  74. "status": "STATUS_OK"
  75. },
  76. "subnet": "9.0.1.0/24"
  77. },
  78. {
  79. "backend": {
  80. "vxlan": {
  81. "vni": 1024,
  82. "vtep_ip": "44.128.0.2/20",
  83. "vtep_ip6": "fd01:a::2/64",
  84. "vtep_mac": "70:b3:d5:80:00:02",
  85. "vtep_name": "vtep1024"
  86. }
  87. },
  88. "docker_bridge": {
  89. "ip6": "fd01:b::1:8000:0:0/81",
  90. "name": "d-dcos6"
  91. },
  92. "info": {
  93. "name": "dcos6",
  94. "prefix6": 80,
  95. "subnet6": "fd01:b::/64"
  96. },
  97. "mesos_bridge": {
  98. "ip6": "fd01:b:0:0:1::/81",
  99. "name": "m-dcos6"
  100. },
  101. "state": {
  102. "status": "STATUS_OK"
  103. },
  104. "subnet6": "fd01:b:0:0:1::/80"
  105. }
  106. ]
  107. },
  108. {
  109. "ip": "172.17.0.3",
  110. "overlays": [
  111. {
  112. "backend": {
  113. "vxlan": {
  114. "vni": 1024,
  115. "vtep_ip": "44.128.0.3/20",
  116. "vtep_ip6": "fd01:a::3/64",
  117. "vtep_mac": "70:b3:d5:80:00:03",
  118. "vtep_name": "vtep1024"
  119. }
  120. },
  121. "docker_bridge": {
  122. "ip": "9.0.2.128/25",
  123. "name": "d-dcos"
  124. },
  125. "info": {
  126. "name": "dcos",
  127. "prefix": 24,
  128. "subnet": "9.0.0.0/8"
  129. },
  130. "mesos_bridge": {
  131. "ip": "9.0.2.0/25",
  132. "name": "m-dcos"
  133. },
  134. "state": {
  135. "status": "STATUS_OK"
  136. },
  137. "subnet": "9.0.2.0/24"
  138. },
  139. {
  140. "backend": {
  141. "vxlan": {
  142. "vni": 1024,
  143. "vtep_ip": "44.128.0.3/20",
  144. "vtep_ip6": "fd01:a::3/64",
  145. "vtep_mac": "70:b3:d5:80:00:03",
  146. "vtep_name": "vtep1024"
  147. }
  148. },
  149. "docker_bridge": {
  150. "ip6": "fd01:b::2:8000:0:0/81",
  151. "name": "d-dcos6"
  152. },
  153. "info": {
  154. "name": "dcos6",
  155. "prefix6": 80,
  156. "subnet6": "fd01:b::/64"
  157. },
  158. "mesos_bridge": {
  159. "ip6": "fd01:b:0:0:2::/81",
  160. "name": "m-dcos6"
  161. },
  162. "state": {
  163. "status": "STATUS_OK"
  164. },
  165. "subnet6": "fd01:b:0:0:2::/80"
  166. }
  167. ]
  168. }
  169. ],
  170. "network": {
  171. "overlays": [
  172. {
  173. "name": "dcos",
  174. "prefix": 24,
  175. "subnet": "9.0.0.0/8"
  176. },
  177. {
  178. "name": "dcos6",
  179. "prefix6": 80,
  180. "subnet6": "fd01:b::/64"
  181. }
  182. ],
  183. "vtep_mac_oui": "70:B3:D5:00:00:00",
  184. "vtep_subnet": "44.128.0.0/20",
  185. "vtep_subnet6": "fd01:a::/64"
  186. }
  187. }

删除虚拟网络

要删除一个虚拟网络,请先卸载 DC/OS,然后删除管理节点上的覆盖复制日志以及代理节点上与虚拟网络关联的 iptable 规则。

覆盖复制日志

DC/OS 覆盖网络使用复制日志跨 Mesos 管理节点重启以保留虚拟网络状态,并在选择新的 Mesos 管理节点时恢复覆盖状态。覆盖复制日志的存储位置为 /var/lib/dcos/mesos/master/overlay_replicated_log。当从集群卸载 DC/OS 时,不会移除覆盖复制日志,因此您需要在重新安装 DC/OS 之前手动删除此日志。否则,Mesos 管理节点会尝试在启动期间对现有覆盖日志进行核对,如果发现未配置的虚拟网络,管理节点将失败。

注意: 覆盖复制日志不同于 管理节点的复制日志,其存储位置为 /var/lib/dcos/mesos/master/replicated_log。移除覆盖复制日志对管理节点的恢复语义没有影响。

iptables

虚拟网络安装 IPMASQ 规则,让容器可以在虚拟网络之外进行通信。删除或替换虚拟网络时,必须移除与之前虚拟网络关联的规则。要移除与每个覆盖关联的 IPMASQ 规则,请从对应于虚拟网络子网的 POSTROUTING 更改的 NAT 表中移除 IPMASQ 规则。移除每个代理节点上的这些规则。

替换或添加新的虚拟网络

要替换虚拟网络,请先卸载 DC/OS,然后删除管理节点上的覆盖复制日志以及代理节点的 iptable 规则。然后,通过在 config.yaml 文件中指定的所需网络重新安装。

故障排除

DC/OS Web 界面的网络选项卡提供了有助于排除故障的信息。它包含关于 DOS 覆盖网络中与容器关联的虚拟网络以及该虚拟网络上容器 IP 地址的信息。

注意: The network tab currently displays information about containers that are associated with virtual networks managed by DC/OS Overlay. It does not have information about containers running on virtual networks managed by any other CNI/CNM provider`.

限制

  • 对于 Docker 容器,DC/OS 覆盖仅支持 IPv6 网络。在 IPv6 网络上启动 UCR 容器会导致容器启动失败。但为了使其能在未来运行正常,在把子网分配给一个代理时,IPv6 子网会按照用于 IPv4 网络的相同逻辑预先分配给 MesosContainerizer 和 DockerContainerizer。

  • DC/OS 覆盖网络不允许服务预留 IP 地址,这会造成为虚拟网络上多个化身之间的容器产生临时地址。此限制确保给定客户端连接到正确的服务。

DC/OS 在不同的 区域 提供 FQDN,提供通过可预测的 URL 访问服务的简洁方式。如果使用 DC/OS 覆盖网络,您应使用 DC/OS DNS 服务提供的 FQDN 之一,以便客户端能够轻松发现服务的位置。

  • DC/OS 覆盖网络上的容器总数的限制与覆盖子网上可用 IP 地址的数量相同。但是,代理上的容器数量限制取决于分配给此代理的子网(将是覆盖子网的子集)。对于给定的代理子网,一半的地址空间分配给 MesosContainerizer,另一半分配给 DockerContainerizer

  • 在 DC/OS 覆盖网络中,虚拟网络的子网将细分成更小的子网,这些更小的子网会分配给各个代理。当代理耗尽为其分配的地址范围且服务尝试在此代理启动虚拟网络容器上的容器时,容器启动将失败,服务将收到 TASK_FAILED 消息。

由于没有 API 报告代理上的地址耗尽,因此由服务决定容器是否因代理上缺少 IP 地址而无法在虚拟网络上启动。此限制对服务的行为有直接影响,例如尝试使用指定数量的实例来启动服务的 Marathon 等。由于此限制,如果 Marathon 等服务尝试在耗尽为其分配的 IP 地址范围的代理上启动某个服务的实例,这些服务可能无法完成在虚拟网络上启动服务的义务。

在解决使用虚拟网络的框架相关问题时以及当您看到 TASK_FAILED 消息时,请牢记此限制。

  • DC/OS 覆盖网络使用代理上的 Linux 网桥设备将 Mesos 和 Docker 容器连接到虚拟网络。这些网桥设备的名称来自虚拟网络名称。由于 Linux 系统对网络设备名称有 15 个字符的限制,因此虚拟网络名称的字符限制为 13 个字符(其中 2 个字符用于区分虚拟网络上的 CNI 网桥和 Docker 网桥)。

  • 某些名称是预留的,不能用作 DC/OS 覆盖网络的名称。这是因为 DC/OS 覆盖网络使用底层 Docker 网络将 Docker 容器连接到覆盖网络,而这反过来预留某些网络的名称。预留的名称为:hostbridgedefault

  • Marathon 运行状况检查 会与某些 DC/OS 覆盖网络配置不兼容。如果您不使用默认的 DC/OS 覆盖配置且 Marathon 与虚拟网络隔离,运行状况检查将持续失败,即使服务的运行状况良好。

以下任何情况时,Marathon 运行状况检查将可以运行:

  • 您在使用默认的 DC/OS 覆盖网络配置时。
  • Marathon 可以访问虚拟网络时。
  • 您使用 command 运行状况检查 时。