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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器间网络互通 容器服务为集群中每个容器提供集群内可达的独立IP,容器之间就可以通过这个独立的IP互相通信,而不需要通过NAT暴漏到主机端口,解耦了与宿主机IP的依赖,因此避免了做NAT的时候多个容器端口冲突的问题。而如何实现跨主机的容器通信,在不同网络模型下面的实现方案如下: VPC网络模式下
+关注继续查看

容器间网络互通

容器服务为集群中每个容器提供集群内可达的独立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

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
应用服务中间件 Shell 数据库
Docker 容器间通信
Docker 容器间通信
54 1
|
2月前
|
域名解析 网络协议 Linux
Docker网络及容器间通信详解
本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间通信可用于监控其他容器的网络流量、不同容器中程序如web server和app server的高效通信等场景。通过实验进一步熟悉Docker的架构和基本操作,了解Docker容器间通信的方式。
|
3月前
|
存储 Kubernetes 文件存储
使用阿里云容器服务和容器网络文件系统搭建WordPress网站
本教程介绍如何通过阿里云容器服务ACK和容器网络文件系统CNFS搭建一个简单的弹性、高可用WordPress网站,使用CNFS回收站进行数据恢复,验证quota和CNFS在线扩容。
103 0
|
3月前
|
人工智能 Kubernetes Cloud Native
26场技术分享,阿里云容器服务负责人易立领衔带来容器、AI、Serverless、中间件最佳实践
26场技术分享,阿里云容器服务负责人易立领衔带来容器、AI、Serverless、中间件最佳实践
|
3月前
|
运维 Kubernetes Cloud Native
云原生容器Clouder认证:容器应用与集群管理—课时4:阿里云容器服务
云原生容器Clouder认证:容器应用与集群管理—课时4:阿里云容器服务
100 0
|
4月前
|
关系型数据库 MySQL 应用服务中间件
docker--容器间通信 Link(单向通信)、bridge(双向通信)
docker--容器间通信 Link(单向通信)、bridge(双向通信)
|
5月前
|
Docker 容器
docker compose设置不同容器间通信
docker compose新启动了一个容器,这个时候怎么去连接到其他容器呢,去容器里面ping发现不通。一般来说是因为和其他容器没有在一个网络环境里面。首先用命令查看一下当前存在哪些网络环境。
103 0
|
7月前
|
弹性计算 运维 资源调度
《云原生架构容器&微服务优秀案例集》——03 零售/电商——识货 基于阿里云容器服务实现云原生提效降本
《云原生架构容器&微服务优秀案例集》——03 零售/电商——识货 基于阿里云容器服务实现云原生提效降本
161 0
|
12月前
|
容器
《容器加速企业创新阿里云容器服务》电子版地址
容器加速企业创新阿里云容器服务
69 0
《容器加速企业创新阿里云容器服务》电子版地址
|
数据安全/隐私保护 Docker 容器
Docker容器实战【四】阿里云容器服务
harbor虽好,但许多公司的生产环境仍然采用的是云服务,这节课我们就来学习本地Docker如何使用云服务,将本地镜像推送到云平台。
700 0
Docker容器实战【四】阿里云容器服务
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多