容器网络方案
容器网络需要面对的最重要的一个问题是容器的IP地址。DCOS的容器网络在Mesos V0.25版本(2015年10月)之前没有明确的方案,需要手动维护创建。在Mesos V0.25到V1.0(2016年7月)这段时期,Docker容器技术推出了网络扩展功能,Docker容器有了原生的网络扩展支持,典型的第三方插件有Weave,Calico等,此阶段可以通过Marathon的API在创建容器的同时赋予一个IP地址。在Mesos V1.0之后,Mesos原生支持了CNI网络,无论是Docker容器还是AppC容器,一容器一IP变得非常简单。
当前Marathon支持三种网络模式:
- BRIDGE
适用于Docker容器服务。在该模式下,容器端口(容器内部定义的端口)被映射为容器宿主机上对应的端口。在该模式下,容器中的应用绑定到容器的端口,Docker网络服务负责把这些端口绑定到主机的端口。
- USER
适用于Docker容器服务。在该模式下,容器端口(容器内部定义的端口)被映射为容器宿主机上对应的端口。在该模式下,容器中的应用绑定到容器的端口,Docker网络服务负责把这些端口绑定到主机的端口。该模式主要用于适配Docker自定义网络(通过Docker插件扩展实现),在Mesos中主要通过CNI插件结合Mesos CNI网络隔离组件来实现。
- HOST
同时适用于Marathon AppC容器应用和Docker应用。在该模式下,应用直接绑定到宿主机的一个或多个端口。
VIPs
DCOS提供了一个名为Minuteman的服务器端内部微服务之间的东-西向(区分于Client-Server的南-北向)4层负载均衡。为了易于服务的配置和发现,DCOS采用命名(name-based)VIPs来定位服务。因此,客户端访问服务时连接的是一个服务地址而不是具体的IP地址,同时DCOS可以很容易的将指向一个命名VIP的调用请求映射到多个具体的IP地址和端口,从而实现负载调度。采用命名VIPs的另一个好处是可以避免与基于IP的VIP产生冲突,在服务安装时可以自动创建。
一个命名VIP包含3个组成部分:
私有的虚拟IP地址
端口(通过该端口提供服务)
服务名称
VIPs的命名遵循如下规则:
<service-name>.marathon.l4lb.thisdcos.directory:<port>
根据Marathon所运行的是Docker容器镜像还是AppC容器镜像的不同,在Marathon应用定义中分别用portMappings
和portDefinitions
两个不同的属性节点进行配置。
AppC容器配置
{
"id": "myservice",
"portDefinitions": [
{
"protocol": "tcp",
"port": 6666,
"labels": { "VIP_0": "myservice:6666" },
"name": "jmx"
},
{
"protocol": "tcp",
"port": 7777,
"labels": { "VIP_1": "myservice:7777" },
"name": "api"
}
]
}
如上示例,该配置定义了两个VIP:
myservice.marathon.l4lb.thisdcos.directory:6666
myservice.marathon.l4lb.thisdcos.directory:7777
客户端(注:此处指DCOS集群中的其他服务)可以通过调用端口为6666的VIP访问服务提供的JMX管理功能,可以通过调用端口为7777的VIP访问服务提供的业务API。
上述配置也可以通过DCOS的WEB管理控制台进行配置:
Docker容器配置
{
"id": "myservice",
"container": {
"docker": {
"image": "chrisrc/myservice",
"forcePullImage": false,
"privileged": false,
"portMappings": [
{
"containerPort": 6666,
"protocol": "tcp",
"name": "jmx",
"servicePort": 6666,
"labels": { "VIP_0": "myservice:6666" }
},
{
"containerPort": 7777,
"protocol": "tcp",
"name": "api",
"servicePort": 7777,
"labels": { "VIP_1": "myservice:7777" }
}
],
"network": "BRIDGE"
}
}
}
如上示例,该配置定义了一个名为myservice的服务,该服务通过Docker镜像chrisrc/myservice提供。与上例类似,该服务也定义了两个客户端(注:此处指DCOS集群中的其他服务)可以直接访问的VIP:
myservice.marathon.l4lb.thisdcos.directory:6666
myservice.marathon.l4lb.thisdcos.directory:7777
上述配置也可以通过DCOS的WEB管理控制台进行配置: