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

本文涉及的产品
容器镜像服务 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月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
存储 运维 Kubernetes
容器服务ACK常见问题之容器服务ACK 淘宝源过期了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
7月前
|
域名解析 网络协议 Linux
Docker网络及容器间通信详解
本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间通信可用于监控其他容器的网络流量、不同容器中程序如web server和app server的高效通信等场景。通过实验进一步熟悉Docker的架构和基本操作,了解Docker容器间通信的方式。
|
7月前
|
存储 负载均衡 调度
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
316 0
|
5月前
|
Shell Linux Docker
Docker -v 挂载主机目录到容器中(及数据卷容器)
Docker -v 挂载主机目录到容器中(及数据卷容器)
94 0
|
2月前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK启动时readiness告警如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
存储 监控 Kubernetes
容器服务ACK常见问题之cmonitor-agent容器一直没起来如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK worker节点选择不同地域失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
存储 Kubernetes 前端开发
容器服务ACK常见问题之把容器的时间改成宿主机的时区失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
Kubernetes 网络安全 调度
容器服务ACK常见问题之容器服务ACK的eci调度卡住如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。

相关产品

  • 容器计算服务