容器服务是如何做到的跨主机的容器间通信?

容器间网络互通

容器服务为集群中每个容器提供集群内可达的独立IP,容器之间就可以通过这个独立的IP互相通信,而不需要通过NAT暴漏到主机端口,解耦了与宿主机IP的依赖,因此避免了做NAT的时候多个容器端口冲突的问题。而如何实现跨主机的容器通信,在不同网络模型下面的实现方案如下:

VPC网络模式下:

专有网络(Virtual Private Cloud,简称VPC),帮助您基于阿里云构建出一个隔离的网络环境。您可以完全掌控自己的虚拟网络,包括选择自有 IP地址范围、划分网段、配置路由表和网关等。容器服务通过配置VPC路由表的方式将容器对容器的访问转发到容器IP网段所对应的ECS机器上。如图:
screenshot

在集群一台节点(192.168.100.1)上启动docker 容器的时候将容器的网卡挂载到事先创建好的172.18.1.0/24的网桥,另外一个节点(172.16.1.2)启动容器时挂载到172.18.2.0/24的网桥,然后设置对应的路由规则到VPC下面的vRoute路由表将172.18.1.0/24转发到192.168.100.1那个节点,另外一个节点也配置类似的路由规则。
如此,比如在节点1上的一个IP为172.18.1.2的容器访问节点二上的一个IP为172.18.2.2的容器,就能通过路由表的转发将请求转发到对应的机器上,又通过docker在机器上的网桥创建的路由规则将请求转发到172.18.2.0/24的网桥上,然后转发到IP为192.168.2.2对应的容器上。
另外,容器服务在VPC中给Containers分配了独立的网段以及路由条目要避免与原有的vSwitch网段路由表条目机器上的IP路由表冲突,否则请求就可能无法转发到正确的容器上。

IP地址分配规则

容器服务的VPC网络模式中,节点上的容器的IP是在所在ECS的IP段中分配的,集群初始化时,会给每个节点分配一个/24的IP段,在容器服务的VPC驱动初始化时,会分配所在ECS的IP段的一个池子用于分配给容器。在容器启动时,会从这个池子中选择一个空闲的IP分配给容器。

路由表配置

如上述中原理介绍,容器服务是依赖VPC的路由表做容器IP到ECS的流量转发。在VPC的路由表配置中,我们可以看到容器服务配置的网段到ECS下一跳的配置,这个是容器服务自动完成的,如果配置不小心被删除掉了,可以对照节点上的docker info找到本节点上对应的网段,手动恢复到VPC的路由表中。

安全组配置

如上述,容器间通信是节点间通过各自的IP地址互相通信的,在容器从宿主机的eth0出来到目的网段的宿主机的eth0的过程中,会被ECS的安全组过滤,所以安全组的出方向和入方向都需要开放容器的网段,这个配置在容器服务创建集群时是默认配置在集群的安全组中的。如果需要别的安全组的容器或者ECS访问容器的网段,同样需要开放出入的容器网段的安全组规则。

关于docker_gwbridge网桥

默认情况下,Docker会给自定义的网络分配叫docker_gwbridge的网桥,我在这篇文章中有对其的介绍,docker_gwbridge网桥会从172.16.0.0/12自动选择一个空闲的/16的IP段,空闲的定义是在宿主机的路由表(ip route)中无冲突的网段。如果你在容器中访问的地址刚好跟docker_gwbridge网段冲突的话,可能会造成访问问题,解决这个问题的方法是事先在节点上创建好docker_gwbridge网段,或者有访问问题时重建docker_gwbridge网段。

Classic网络模式下:

从Docker 1.9开始,Docker通过Vxlan的协议支持原生的跨主机的容器网络,在Classic网络环境下,容器服务基于Docker Overlay Network创建一个集群内容器互通的网络环境,通过Overlay的网络虚拟出多主机中的容器网络是同一个虚拟出的子网,从而容器可以跨主机的互相通信。

跨节点的Link

在多容器的应用中,link常用于描述容器间的依赖,比如wordpress的web服务依赖于mysql的数据库服务,那么wordpress容器启动时就可以通过link的方式去获取mysql容器的一系列参数,例如数据库连接IP,端口等。
但是docker的link仅支持在同一个主机节点上,而容器服务支持跨节点的容器连接,当容器IP变化是,链接容器中容器别名也会跟着变化。这些行为和单节点上使用link是一致的

相关内容:

aliyun VPC服务
Get started with multi-host networking
Understand Docker container networks
docker container links

想了解更多容器服务的内容,请点击https://www.aliyun.com/product/containerservice

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值