[+]文章目录

网络在数据中心基础设施中起着关键的作用,它–现在–超出了Mesos的范围去强调网络的安装问题、拓扑结构和性能。然而,Mesos可以轻松地与现有的网络解决方案集成,使诸如每个容器都有IP、任务颗粒的任务隔离和服务发现等功能生效。更经常的是,提供一个放之四海而皆准的网络解决方案是具有挑战性的。只有云计算的、本地部署的和混合的部署方案之间的要求和可选方案是不尽相同的。 Mesos对网络的支持的主要目标之一是为用户提供一个可插拔的机制,当用户需要的时候,他们可以定制网络方案。因此,从0.25.0版本开始,Mesos组件添加了几个扩展以提供网络支持。并且,所有的扩展是可选的,以保证更旧的没有网络支持的框架和应用可以与新的共存。 本文档的其它部分描述了所有涉及的组件的总体框架、每个容器都有IP的配置步骤、所需的框架改变。 如何运作? 一个关键的观察是,网络支持通过使用Mesos模块启用的,因此Mesos master和代理对它是完全不知情的。它完全由Mesos网络模块提供所需的支持。下一步,IP请求提供了哦一个最佳努力的方式提供。因此,该框架应愿意处理忽略(如模块不存在的情形)或拒绝(由于各种原因不能分配IP时)的请求。 为了最大程度地与现有的框架向后兼容,调度程序必须对每个容器的网络隔离是可选的。调度程序使用TaskInfo信息中的新数据结构实现网络隔离。 术语 • IP Address Management (IPAM)服务器 o 根据需要分配IPs o IPs 一被释放就回收 o (可选地使用给定的字符串/id对 IPs打标签 • IPAM客户端 o 与一个特定的 IPAM服务器紧耦合 o 在 “Network Isolator Module” 和IPAM 服务器之间充当桥梁 o 与服务器通信以请求/释放IPs • Network Isolator Module (NIM): o 代理实现Isolator 接口的Mesos模块 o 查看TaskInfos 以发现任务的 IP需求 o 与IPAM客户端通信以请求/释放IPs o 与外部网络虚拟器/隔离器通信,以启用网络隔离功能 • Cleanup模块: o 在代理丢失事件发生时负责清理工作(例如释放IPs),其它时候休眠 框架为容器请求IP地址

  1. Mesos框架采用TaskInfo消息请求为每个启动的容器请求IPs。(如果Mesos集群不支持为每个容器提供IP,请求被忽略)。
  2. Mesos Master处理TaskInfos并将它们转发给Agent以启动任务。 网络隔离器模块从IPAM服务器中获得IP
  3. Mesos代理检查TaskInfo以发现容器需求(这种情况下Mesos被容器化),并未即将启动的容器准备各种隔离器。 o NIM检查TaskInfo,以决定是否启用网络隔离器。
  4. 如果启用了网络隔离器,NIM通过IPAM请求IP地址并告知代理。 代理使用命名空间启动容器 o 代理在一个新的网络命名空间内启动容器。代理调用NIM执行“隔离”。 o 接着NIM调用网络虚拟器隔离容器。 网络虚拟器为容器分配IP并隔离它。
  5. 接着NIM使用IP信息“装饰”TaskStatus。 o 可以在Master的状态端点使用TaskStatus中的IP地址。 o TaskStatus被传递到框架中通知它IP地址。 o 当一个任务被杀死或者丢失的时候,NIM与IPAM客户端通信以释放对应的IP地址。 Cleanup模块检测丢失的代理并执行清理操作
  6. 当代理丢失事件发生的时候,Cleanup模块获得通知。
  7. Cleanup模块与IPAM客户端通信以释放所有与丢失代理有关的IP地址。 IPAM在回收IP地址之前,可能会有一个宽限期。 配置 网络隔离模块不是标准的Mesos分部的一部分。然而,在https://github.com/mesosphere/net-modules有一个实现样例。 一旦网络隔离模块被嵌入到一个共享的动态库中,我们可以把它加载到Mesos Agent (/documentation/latest/ 在[modules documentation,http://mesos.apache.org/documentation/latest/modules/]中查阅关于搭建和加载一个模块的说明)。 使框架具备每个容器一个IP的能力 NetworkInfo 一个新的NetworkInfo message被引入了: message NetworkInfo { enum Protocol { IPv4 = 0, IPv6 = 1 }

    optional Protocol protocol = 1;

    optional string ip_address = 2;

    repeated string groups = 3;

    optional Labels labels = 4; }; 从IPAM中请求IP地址的时候,需要将protocol域设置为IPv4 or IPv6。如果 NIM支持的话,将 ip_address设置成一个有效的IP地址可以让框架为每个容器指定一个静态的IP 地址。当一个任务哪怕是在被杀死然后在另外一个不同的节点重启的时候,它也必须绑定一个特定的IP地址的时候,这是很有用的。 指定网络要求的例子 想为每个容器提供IP的框架,需要在TaskInfo中提供NetworkInfo信息。以下是一些例子:

  8. 使用默认的命令执行器请求一个非指定协议版本的地址
  9. TaskInfo {
  10. ...
  11. command: ...,
  12. container: ContainerInfo {
  13. network_infos: [
  14. NetworkInfo {
  15. protocol: None;
  16. ip_address: None;
  17. groups: [];
  18. labels: None;
  19. }
  20. ]
  21. }
  22. }
  23. 使用默认的命令执行器,在两个分开的组中分别请求一个IPv4和一个IPv6地址
  24. TaskInfo {
  25. ...
  26. command: ...,
  27. container: ContainerInfo {
  28. network_infos: [
  29. NetworkInfo {
  30. protocol: IPv4;
  31. ip_address: None;
  32. groups: ["public"];
  33. labels: None;
  34. },
  35. NetworkInfo {
  36. protocol: IPv6;
  37. ip_address: None;
  38. groups: ["private"];
  39. labels: None;
  40. }
  41. ]
  42. }
  43. }
  44. 使用自定义的命令执行器请求一个的指定的IP地址
  45. TaskInfo {
  46. ...
  47. executor: ExecutorInfo {
  48. ...,
  49. container: ContainerInfo {
  50. network_infos: [
  51. NetworkInfo {
  52. protocol: None;
  53. ip_address: "10.1.2.3";
  54. groups: [];
  55. labels: None;
  56. }
  57. ]
  58. }
  59. }
  60. } 注意:The Mesos Containerizer拒绝任何包含了ContainerInfo的CommandInfo。 因此,在使用Mesos Containerizer选择网络隔离的时候,需要设置TaskInfo.ContainerInfo.NetworkInfo。 地址发现(Address Discovery) NetworkInfo信息允许框架请求在任务运行时间内为Mesos代理分配IP地址。在使用这种方法为一个指定的执行器容器选择了网络隔离之后,为了进行健康检查或进行其它带外通信,框架需要知道最终分配的地址。这是通过添加新的域到TaskStatus信息中实现的。 message ContainerStatus { repeated NetworkInfo network_infos; }

message TaskStatus { ... optional ContainerStatus container; ... }; 进一步地,容器IP地址也是通过Master的状态端点暴露的。Master的状态端点JSON输出包含了一个任务状态列表。如果一个任务容器以它自己的IP地址开始,那么被分配的IP地址将会作为TASK_RUNNING状态的部分内容暴露。 注意:由于框架对每个容器具有地址是严格可选的,如果没有一开始就设置好NetworkInfo,框架可能会忽略StatusUpdate提供的IP地址。 写一个自定义的网络隔离模块 网络隔离器模块实现Mesos提供的Isolator接口。该模块作为一个动态共享库加载到Mesos代理中,并被挂在容器启动序列中。为了满足框架的需求,网络隔离器可能要与外部IPAM和网络虚拟器进行通信。 就Isolator API而言,一个网络隔离器需要实现三个关键的回调:

  1. Isolator::prepare() 函数为模块提供了一个机会去决定是否为给定的任务容器启用网络隔离。如果启用网络隔离,Isolator::prepare调用会通知代理为协调者创建一个私有网络命名空间。也正是这个接口会(静态地或者在外部IPAM代理的帮助下)同时为容器生成一个IP地址。
  2. 在容器被创建之后、其内部的执行器被运行之前,Isolator::isolate() 为模块提供了一个机会去隔离容器。这个包括为容器创建一个虚拟的以太网适配器并分配一个IP地址给它。模块也可以在外部网络虚拟器/隔离器的帮助下为容器建立网络。
  3. 当容器终止的时候,Isolator::cleanup()被调用。它允许模块执行任何清理操作,比如说,如有需要,可以回收资源、释放IP地址等。

« 前一篇