书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!


顾名思义,Linux bridge就是Linux系统中的网桥,但是Linux bridge的行为更像是一台虚拟的网络交换机,任意的真实物理设备(例如eth0)和虚拟设备(例如,前面讲到的veth pair和后面即将介绍的tap设备)都可以连接到Linux bridge上。

Linux bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去取决于目的MAC地址,原理和物理交换机差不多。

1.3.1 Linux bridge初体验

用iproute2软件包里的ip命令创建一个bridge:

kubernates 网络插件_kubernetes

或使用bridge-utils软件包里的brctl工具管理网桥,例如新建一个网桥:

kubernates 网络插件_kubernetes_02

刚创建一个bridge时,其实没有任何实际功能,如图1-4所示。

kubernates 网络插件_kubernates 网络插件_03

图1-4 独立的bridge设备示意图

创建一对veth设备,并配置IP地址:

kubernates 网络插件_网络_04

将veth0连接到br0上:

kubernates 网络插件_kubernetes_05

添加一个设备到网桥上:

kubernates 网络插件_kubernates 网络插件_06

对接后,查看当前网桥上都有哪些网络设备:

kubernates 网络插件_IP_07

或使用brctl命令显示当前存在的网桥及其所连接的网络端口:

kubernates 网络插件_IP_08

执行完以上命令后,连接veth pair的bridge设备的网络拓扑如图1-5所示。

kubernates 网络插件_网络_09

图1-5 连接veth pair的bridge设备的网络拓扑

br0和veth0相连之后发生了如下变化:

  • br0和veth0之间连接起来了,并且是双向的通道;
  • 协议栈和veth0之间变成了单通道,协议栈能发数据给veth0,但veth0从外面收到的数据不会转发给协议栈;
  • br0的MAC地址变成了veth0的MAC地址。

这就好比Linux bridge在veth0和协议栈之间做了一次拦截,将veth0本来要转发给协议栈的数据拦截,全部转发给bridge。

1.3.2 把IP让给Linux bridge

通过上面的分析可以看出,给veth0配置IP没有意义。这里我们就把veth0的IP地址“让给”Linux bridge:

kubernates 网络插件_容器_10

于是,绑定IP地址的bridge设备的网络拓扑如图1-6所示。

kubernates 网络插件_网络_11

图1-6 绑定IP地址的bridge设备的网络拓扑

图1-6将协议栈和veth0之间的联系去掉了,veth0相当于一根网线。

这时,再通过br0 ping veth1,结果成功收到了ICMP的回程报文:

kubernates 网络插件_kubernetes_12

1.3.3 将物理网卡添加到Linux bridge

将主机上的物理网卡eth0添加到Linux bridge:

kubernates 网络插件_容器_13

通过br0 ping网关成功:

kubernates 网络插件_kubernetes_14

通过veth1 ping网关成功:

kubernates 网络插件_kubernates 网络插件_15

将eth0上的IP删除:

kubernates 网络插件_IP_16

通过eth0 ping网关成功:

kubernates 网络插件_kubernates 网络插件_17

查看主机路由表:

kubernates 网络插件_网络_18

eth0的IP被删除后,默认路由不见了,需要手动将默认网关加回来。

添加默认网关:

kubernates 网络插件_网络_19

ping外网成功:

kubernates 网络插件_网络_20

经过上面一系列的操作,将物理网卡添加到bridge设备的网络拓扑如图1-7所示。

kubernates 网络插件_容器_21

图1-7 将物理网卡添加到bridge设备的网络拓扑

1.3.4 Linux bridge在网络虚拟化中的应用

下面将通过Linux bridge的两种常见的部署方式说明其在现代网络虚拟化技术中的地位。

  1. 虚拟机

虚拟机通过tun/tap或者其他类似的虚拟网络设备,将虚拟机内的网卡同br0连接起来,这样就达到和真实交换机一样的效果,如图1-8所示。如果有多个虚拟机,那么这些虚拟机通过tun/tap设备连接到网桥。

kubernates 网络插件_网络_22

图1-8 Linux bridge在虚拟机中的应用

  1. 容器

Linux bridge在容器场景的组网和上面的虚拟机场景差不多,但也存在一些区别。例如,容器使用的是veth pair设备,容器和物理网络不在同一个网段内。Linux bridge在容器中的应用如图1-9所示。

kubernates 网络插件_网络_23

图1-9 Linux bridge在容器中的应用

1.3.5 网络接口的混杂模式

网络接口的混杂模式在Kubernetes网络也有应用。

混杂模式(Promiscuous mode),简称Promisc mode,俗称“监听模式”。在非混杂模式下,网卡只会接收目的MAC地址是它自己的单播帧,以及多播及广播帧;在混杂模式下,网卡会接收经过它的所有帧!

我们可以使用ifconfig或者netstat -i命令查看一个网卡是否开启了混杂模式。

  • ifconfig eth0,查看eth0的配置,包括混杂模式。当输出包含PROMISC时,表明该网络接口处于混杂模式。

kubernates 网络插件_kubernetes_24

启用网卡的混杂模式,可以使用下面这条命令:

kubernates 网络插件_网络_25

使网卡退出混杂模式,可以使用下面这条命令:

kubernates 网络插件_网络_26

将网络设备加入Linux bridge后,会自动进入混杂模式。

kubernates 网络插件_网络_27

网络设备离开Linux bridge后,会自动退出混杂模式,如下所示:

kubernates 网络插件_网络_28