网络协议(九)-云

1. 虚拟网卡

数据中心的维护非常复杂麻烦,主要体现在采购,运维,规格,复用等方面。为了解决这个问题,我们发明了虚拟机,并基于它产生了云计算技术。

1.1 物理机到虚拟机

软件模拟硬件的方式,数据中心里面用的是qumu-kvm,能让你在一台巨大的物理机里面,掏出一台台小机器。这套软件就能解决上面的问题:一点就能创建,一点就能销毁。想多大就有多大,每次创建的系统都还是新的。

其实做的事情就和OS做的事情一样,让虚拟机觉得自己在使用独立的设备,占有所有的内存,CPU,网络,硬盘。

实质上是多个虚拟机轮流使用物理CPU,内存也是使用虚拟内存映射的方式,最终映射到物理内存上。硬盘在一块大的文件系统上创建一个N个G的文件,作为虚拟机的硬盘。

1.2 虚拟网卡的原理 - 如何将虚拟机的网络和物理机的网络连接起来?

fig1.jpg

虚拟机是物理机上跑着的一个软件,这个软件可以像其他应用打开文件一样,打开一个称谓TUN/TAP的Char Dev(字符设备文件)。打开了这个字符设备文件之后,在物理机上就能看到一张虚拟TAP网卡。

虚拟机会打开这个文件,然后在自己的虚拟的身上(hhhh)虚拟出一张网卡,让虚拟机里的应用觉得它们真的有一张网卡。然后,所有的网络包都往这里发。

当然,网络包会到虚拟化软件这里。它会将网络包转换成为文件流,写入字符设备,就像写一个文件一样。内核中 TUN/TAP 字符设备驱动会收到这个写入的文件流,交给 TUN/TAP 的虚拟网卡驱动。这个驱动将文件流再次转成网络包,交给 TCP/IP 协议栈,最终从虚拟 TAP 网卡发出来,成为标准的网络包。这样数据就能从虚拟机里面最终发送到虚拟机的外面。

1.3 虚拟网卡的连接

1.3.1 云计算中的网络问题

  • 共享: 尽管每个虚拟机都会有一个或者多个虚拟网卡,但是物理机可能只有有限的网卡。这么多虚拟网卡如何共享同一个出口?
  • 隔离: 安全隔离-同一个机器上的两个虚拟机属于两个用户,怎么保证相互之间不会被窃听? 流量隔离-同一个机器上的两个虚拟机,一个占用大量带宽,另外一个还能上网么?
  • 互通: 同一个机器两个虚拟机,同一用户,如何通信? 不同物理机上两个虚拟机,属于同一个用户的话,这两个如何相互通信?
  • 灵活: 虚拟机会经常有创建,删除的操作,或者所有配置的迁移搬运,需要能够进行灵活配置。

1.3.2 共享与互通的问题

  • 一台物理机上有多个虚拟机,多个虚拟网卡,这些虚拟网卡如何连接在一起,进行相互访问,并且能够访问外网的呢?

1.3.2.1 网桥

物理机上应该有一个虚拟的交换机,通过创建虚拟的网桥 brctl addbr br0 将几个虚拟机的虚拟网卡都连接到虚拟网桥brctl addif br0 tap0上,这样讲两个虚拟机配置相同的子网网段,两台虚拟机就能够相互通信了。

fig2.jpg

要让几台虚拟机都能访问外网,可以采用桥接的方式,形成以下的结构:

fig3.jpg

这个时候如果你去看你的IP地址,会发现你的虚拟机的地址和你的笔记本电脑和你旁边的人的网段是一致的。因为网桥将这几个都连接起来了。在数据中心里面,采取的也是类似的技术,只不过都是 Linux,在每台机器上都创建网桥 br0,虚拟机的网卡都连到 br0 上,物理网卡也连到br0上,所有的br0都通过物理网卡出来连接到物理交换机上。

fig4.jpg
fig9.jpg

你还记得吗?在一个二层网络里面,最大的问题是广播。一个数据中心的物理机已经很多了,广播已经非常严重,需要通过 VLAN 进行划分。如果使用了虚拟机,假设一台物理机里面创建 10 台虚拟机,全部在一个二层网络里面,那广播就会很严重,所以除非是你的桌面虚拟机或者数据中心规模非常小,才可以使用这种相对简单的方式。

1.3.2.2 NAT

fig5.jpg

在这种方式下,你登录到虚拟机里面查看 IP 地址,会发现虚拟机的网络是虚拟机的,物理机的网络是物理机的,两个不相同。虚拟机要想访问物理机的时候,需要将地址 NAT 成为物理机的地址。

除此之外,它还会在你的笔记本电脑里内置一个 DHCP 服务器,为笔记本电脑上的虚拟机动态分配 IP 地址。因为虚拟机的网络自成体系,需要进行 IP 管理。为什么桥接方式不需要呢?因为桥接将网络打平了,虚拟机的 IP 地址应该由物理网络的 DHCP 服务器分配。

fig6.jpg

虚拟机是你的电脑,路由器和 DHCP Server 相当于家用路由器或者寝室长的电脑,物理网卡相当于你们宿舍的外网网口,用于访问互联网。所有电脑都通过内网网口连接到一个网桥 br0 上,虚拟机要想访问互联网,需要通过 br0 连到路由器上,然后通过路由器将请求 NAT 成为物理网络的地址,转发到物理网络。

如果是你自己登录到物理机上做个简单配置,你可以简化一下。例如将虚拟机所在网络的网关的地址直接配置到 br0 上,不用 DHCP Server,手动配置每台虚拟机的 IP 地址,通过命令 iptables -t nat -A POSTROUTING -o ethX -j MASQUERADE,直接在物理网卡 ethX 上进行 NAT,所有从这个网卡出去的包都 NAT 成这个网卡的地址。通过设置 net.ipv4.ip_forward = 1,开启物理机的转发功能,直接做路由器,而不用单独的路由器,这样虚拟机就能直接上网了。

fig7.jpg

1.3.3 隔离问题

如果一台机器上的两个虚拟机不属于同一个用户,怎么办呢?好在 brctl 创建的网桥也是支持 VLAN 功能的,可以设置两个虚拟机的 tag,这样在这个虚拟网桥上,两个虚拟机是不互通的。

但是如何跨物理机互通,并且实现 VLAN 的隔离呢?由于 brctl 创建的网桥上面的 tag 是没办法在网桥之外的范围内起作用的,于是我们需要寻找其他的方式。

有一个命令vconfig,可以基于物理网卡eth0创建带VLAN的虚拟网卡,所有从这个虚拟网卡出去的包,都带这个VLAN,如果这样跨物理机的互通和隔离就可以通过这个网卡来实现了。

fig8.jpg

首先为每个用户分配不同的 VLAN,例如有一个用户 VLAN 10,一个用户 VLAN 20。在一台物理机上,基于物理网卡,为每个用户用 vconfig 创建一个带 VLAN 的网卡。不同的用户使用不同的虚拟网桥,带 VLAN 的虚拟网卡也连接到虚拟网桥上。

这样是否能保证两个用户的隔离性呢?不同的用户由于网桥不通,不能相互通信,一旦出了网桥,由于 VLAN 不同,也不会将包转发到另一个网桥上。另外,出了物理机,也是带着 VLAN ID 的。只要物理交换机也是支持 VLAN 的,到达另一台物理机的时候,VLAN ID 依然在,它只会将包转发给相同 VLAN 的网卡和网桥,所以跨物理机,不同的 VLAN 也不会相互通信。

使用 brctl 创建出来的网桥功能是简单的,基于 VLAN 的虚拟网卡也能实现简单的隔离。但是这都不是大规模云平台能够满足的,一个是 VLAN 的隔离,数目太少。前面我们学过,VLAN ID 只有 4096 个,明显不够用。另外一点是这个配置不够灵活。谁和谁通,谁和谁不通,流量的隔离也没有实现,还有大量改进的空间。

2. 云中网络Qos

流量控制技术,来实现Quality of Service,从而保障大多数人的服务质量

fig10.jpg

我们能控制的只有出方向,通过Shaping,将出的流量控制成自己想要的模样。而进入的方向无法控制,只能通过Policy将包丢弃。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:网络协议(九)-云

文章字数:2.3k

本文作者:Leilei Chen

发布时间:2020-02-02, 11:52:09

最后更新:2020-02-02, 14:06:58

原始链接:https://www.llchen60.com/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE-%E4%B9%9D-%E4%BA%91/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏