Too young, too simple. Sometimes, naive & stupid

云计算网络

物理机 -> 虚拟机

所谓云计算,其实就是基于虚拟化产生的一种消费方式,可以这样一句话概括:

N个物理区域中,分别运行着M * N个节点的虚拟化节点,由这些节点组成了一个或多个虚拟化集群,在这个集群上运行着N多个虚拟机实例,向互联网上的消费者提供虚拟机实例以供计算,这就是公有云;自建自用,就是私有云;自建了还额花钱买了其他运营商提供的计算虚拟机实例,就是混合云(这里仅仅说的是计算资源,其他存储或网络资源同理)。

当然,如果你可以编排物理机,也是可以成为云计算的。(物理机好比拿地盖房子,虚拟机好比购买公寓)

如果你不知道虚拟化是什么,这样你下一个virtualbox安装体验一下,虚拟化软件就像你去电脑城买笔记本,你可以跟虚拟化软件说,我要几颗CPU,多大内存,多大硬盘,什么网卡(前提你有)。用的时候你一创建,不玩了你点删除,就没了。

生产环境,主流的虚拟化主要是这几种:VMware、Xen、KVM等。

这里说qemu-kvm,从名字上来看,emu就是Emulator(模拟器),主要模拟CPU、RAM(内存)、网络、硬盘,使得虚拟机感觉自己在使用独立的硬件资源,但真正使用的时候,肯定是要用物理设备的。

例如,多个虚拟机轮流使用物理CPU(这个具体可以google一下),内存是使用虚拟内存映射的方式,最终映射到物理内存上。硬盘简单一些,你笔记本有500GB,新建一个20GB空文件(当然,要根据要求的格式创建),这就是你虚拟机的磁盘。

虚拟化软件是什么?骗子,向上骗虚拟机里面的应用,让他们感觉自己是在用真实的硬件资源,其实自己啥也没有,全部向下从物理机里面取。

虚拟网卡原理

如何将虚拟机网络和物理网络连接呢?

首先,虚拟机要有网卡,对于qemu-kvm来说,是通过TUN/TAP实现的。

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

虚拟化既然是骗子,会将打开的这个文件,虚拟化成网卡,拿给虚拟机,虚拟机就将网络流量发往这个“网卡”。

虚拟机的网络流量会到骗子这里,骗子将网络包转换成文件流,写入字符设备,就像写文件一样,内核中的TUN/TAP字符设备会收到这个写入的文件流,交给TUN/TAP的虚拟网卡驱动,这个驱动将文件流转换成网络包,交给TCP/IP协议栈,最终从虚拟TAP网卡发出来,变成标准的网络包。

骗来骗去,转来转去,数据从虚拟机发到了虚拟机外面。

虚拟网卡怎么连接呢

有了虚拟TAP网卡。如何接入真实网络呢,这种网络需要注意哪些:

  • 共享: 尽管每个虚拟机都会有一个或多个虚拟网卡,但是物理机上可能只有有限的网卡。多个虚拟网卡设备如何共享一个出口呢?
  • 隔离: 一个是安全隔离,两个虚拟机可能属于两个用户,怎么保证用户A的数据不被用户B接收到呢;另一个隔离是流量隔离:两个虚拟机,如果一直迅雷下载,会不会影响到邻居虚拟机。
  • 互通:互通也是两个方面,同一宿主机上的两个虚拟机,属于同一个用户的话,如何通信;如果是不同宿主机呢?
  • 灵活:虚拟机和物理机不同,会经常创建、删除、迁移,互通或不同,需要能够灵活的配置。

共享与互通

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

在物理机上,应该有个虚拟交换机,Linux有brctl命令,可以创建虚拟的网桥,

1
brctl addbr br0

创建网桥后,将两个虚拟机的虚拟网卡连接到网桥上:

1
btctl addif br0 tap0

两台虚拟机配置为相同网段就可以互通了。

如何访问外网呢?有两种方式:

一种是桥接,桥接模式下,物理网卡也连接到这个虚拟交换机上。

在数据中心中,采取也是类似的隶属,只不过是Linux,每台机器都创建网桥br0,虚拟机的网卡都连接到br0,物理网卡也连接到br0上,所有的br0都通过物理网卡出来连接到物理交换机上。

这种方式下,不但解决了同一台机器的互通问题,也解决了跨主机通信的问题,因为都是一个二层网络,彼此用相同网段访问就可以了。不过只适合小规模。

二层网络最大的问题是广播,一个数据中心的物理机已经很多了,需要VLAN来解决广播风暴问题,那么就要使用另外一种方式,NAT。在这种方式下,你登录到虚拟机查看ip地址,会发现虚拟机的网络是虚拟机的,物理机的网络是物理机的,虚拟机访问物理机是需要将地址NAT为物理机的地址。

隔离问题

互通问题解决了,如果一台机器上的两个虚拟机不属于同一个用户,当然是选择VLAN,可以设置两个虚拟机的tag。

但是如何跨主机通信并且实现VLAN隔离呢?(brctl的tag是无法在网桥之外起作用的)

vconfig可以基于物理网卡来创建带VLAN的虚拟网卡,

首先为每个用户分配不同的VLAN,基于物理网卡,为每个用户创建带VLAN的网卡,不同的用户使用不同的网桥,带VLAN的虚拟网卡也连接到虚拟网桥上。

当然,网桥的功能相对简单,VLAN数目也是限制,不够灵活,真实生产环境几乎不会用这种方案。