容器的几种接入方式

简介: 【5月更文挑战第20天】容器的六种网络接入方式

1、和host共享network namespace

在这种接入模式下,不会为容器创建网络协议栈,即容器没有独立于host的network namespace,但是容器的其他namespace(如IPC、PID、Mount等)还是和host的namespace独立的。容器中的进程处于host的网络环境中,与host共用L2~L4网络资源。该方式的优点是,容器能够直接使用host的网络资源与外界进行通信,没有额外的开销(如NAT);缺点是网络的隔离性差,容器和host所使用的端口号经常发生冲突。

2、和host共享物理网卡

这种方式与上一种方式的区别在于,容器和host共享物理网卡,但容器拥有独立于host的network namespace,容器有自己的MAC地址、IP地址、端口号。这种接入方式主要使用了SR-IOV技术,每个容器分配一个VF,直接通过硬件网卡与外界通信,优点是旁路了内核不占任何计算资源,而且IO速度较快,缺点是VF数量有限且对迁移的支持不足。

3、和另外一个容器共享network namespace

在这种方式中,容器没有独立的network namespace,但是以该方式新创建的容器将与一个已经存在的容器共享其network namespace(包括MAC、IP以及端口号等)。从网络角度上两者将作为一个整体对外提供服务,不过两个容器的其他namespace(如IPC、PID、Mount等)是彼此独立的。这种方式的优点是,network namespace相关的容器间的通信高效便利,缺点是由于其他的namespace仍然是彼此独立的,因此容器间无法形成一个业务逻辑上的整体。

4、通过vSwitch/vRouter接入

在这种方式中,容器拥有独立的network namespace,通过veth-pair连接到vSwitch/vRouter上。这种方式对于网络来说是最为直接的,在vSwitch/vRouter看来,通过这种方式连接的容器与虚拟机并没有任何区别。vSwitch的实现有很多,如Linux Bridge, Open vSwitch等,可用于容器间二层流量的互通,能够对VLAN、Tunnel、SDN Controller等高级功能进行支持。vRouter可用于容器间三层流量的路由,能够对BGP、Tunnel、SDN Controller等提供高级功能的支持。

5、Macvlan/IPvlan

通过vSwitch或者vRouter来接入容器,虽然可以实现丰富的功能,但是却引入了相当的复杂性。Macvlan/IPvlan是由Linux原生提供的网络虚拟化方案,由于二者在部署和使用上的简单性,因此在容器网络中得到了广泛的使用。


Macvlan将一个物理网卡虚拟出多个虚拟网卡,并提供多个虚拟的MAC地址,使用macvlan接入的容器即会获得虚拟的MAC地址。物理网卡在收到流量后,在发送到协议栈前,会在RX函数中判断目的MAC地址,如果为本地容器的虚拟MAC则直接发给相应的namespace。容器的虚拟网卡在发出流量时,会在TX函数中判断目的MAC地址,如果为本地容器的虚拟MAC则直接发给相应的namespace,否则交给物理网卡来处理。Macvlan提供了Bridge、VEPA、Private、Pass Through等多种工作模式。


IPvlan在一个物理网卡上虚拟出多个IP地址,使用IPvlan接入的容器会复用物理网卡的MAC地址,并获得虚拟的IP地址。物理网卡在收到流量后,在发送到协议栈前,会在RX函数中判断目的IP地址,如果为容器的IP则直接发给相应的namespace。容器的虚拟网卡在发出流量时,会在TX函数中判断目的IP地址,如果为本地容器的虚拟IP则直接发给相应的namespace,否则交给宿主机的协议栈进行处理。IPvlan提供了L2和L3两种工作模式,其中L3模式可以实现不同网段间的路由。

6、嵌套部署在VM中

这种方式在生产环境也比较常见,由于一台host中往往部署着多方的容器,所示存在安全隐患,因此许多用户会选择先启动自己的虚拟机,然后在自己的虚拟机上运行容器。这种方式其实是一种嵌套虚拟化。从本质上来说,在这种方式下容器的接入对于host可以是完全透明的,容器在虚拟机内部的接入可以采用上述其他方法。不过这对于云平台来说,这就意味着失去了对容器接入的管理能力,为了保留这一能力,往往需要在虚拟机内部和host中分别部署vswitch并实现级联,由虚拟机内部的vswitch来接入容器并对其进行特定的标记(云平台分配),以便host中的vswitch对其进行识别。一种常见的方式是使用Open vSwitch对容器标记VLAN ID。

相关文章
|
存储 Go C语言
如何用Go开发eBPF程序
【2月更文挑战第7天】
|
3月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
261 59
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
567 0
在 MySQL 中使用子查询
|
前端开发 API
前端框架与库 - Material-UI组件库
【7月更文挑战第20天】Material-UI 是一个基于 React 的 UI 组件库,它遵循 Google 的 Material Design 设计规范,提供了丰富的预构建组件,极大地简化了前端开发过程。本文将深入浅出地介绍 Material-UI 的常见问题、易错点及如何避免这些问题,并附带代码示例,帮助你更好地掌握 Material-UI 的使用技巧。
427 0
|
10月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
928 7
|
12月前
|
Kubernetes 网络协议 网络安全
Pod之间的通信问题
【10月更文挑战第6天】
415 4
|
弹性计算 前端开发 Java
通义千问API:让大模型写代码和跑代码
基于前面三章的铺垫,本章我们将展示大模型Agent的强大能力。我们不仅要实现让大模型同时使用多种查询工具,还要实现让大模型能查询天气情况,最后让大模型自己写代码来查询天气情况。
通义千问API:让大模型写代码和跑代码
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
1085 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
Docker 容器
6-16|docker怎么把容器内的文件传出来
6-16|docker怎么把容器内的文件传出来