数据中心里面有着一片一片的机器,用网络连接起来,机器数目很多,人们发现,维护这么多的极其挺麻烦的
比如如下的特点就不太合适
1.采购上的不灵活,如果客户采购了一台电脑,就需要上架,插网线,安装系统,而且买完了,不能退货,哪怕业务不弄了,机器还是在数据中心里面留着
2.运维不灵活,一旦需要扩容CPU,内存,硬盘,都需要手动的去扩容
3.规格不灵活,一个服务器,机器往往具有上百G的内存,但是一个应用只需要4核8G,所以很多应用混合的部署在上面,端口容易出现冲突
4.复用不灵活,一个机器,一个用户不用,需要给另一个用户,需要重装操作系统,直接使用原本的操作系统可能遗留很多的数据
于是为了避免物理机出现的难以替换,难以复用,难以扩容,人们发明了一种虚拟机的东西,基于其产生了云计算技术.
虚拟机很简单,个人电脑也可以搭建,如果对于虚拟机没有什么概念,可以下载一个桌面虚拟机的软件,动手尝试下,灵活的指定CPU的数目,内存的大小,硬盘的大小,一个笔记本可以创建多台虚拟电脑,不用的时候,删除就完事了
在数据中心多台服务器之中,可以利用qemu-kvm(emu-Emulator”模拟器”),在一个巨大的物理机里面,掏出一台台小的机器,一键创建虚拟机,一键删除虚拟机,自定义虚拟机的配置
我们拿物理机的购买比喻为自己去拿地盖房子,那么虚拟机就好比是租一个公寓,更加的灵活,谁买随卖
在这个qemu-kmv的技术中,利用的是软件模拟硬件,模拟出一套CPU,内存,网络,硬盘的机器,让虚拟机内部的应用以为自己是在使用独立的设备,实际上还是使用的公共的设备
多个虚拟机轮流使用物理机的CPU,内存也是虚拟机内存映射的方式,映射到物理内存上,硬盘则是在文件系统上创建一个N个G的文件,做为虚拟机的硬盘]
虚拟机就好比一个骗子,向上骗取虚拟机内部的应用,让其自我感觉独享一个资源,其实还是利用的物理机的公共资源
那么解决了物理资源的问题,虚拟机的网络如何物理机连接起来?
虚拟机为了发送数据,需要一个虚拟化的网卡,将网络包转换为文件流,写入字符设备,就好像写一个文件,内核中TUN/TAP的字符设备驱动,会从这个文件流中读取到写入流转到TUN/TAP的虚拟网卡驱动,这个驱动将文件流再次转为网络包,交给TCP/IP协议栈,最终从虚拟TAP网卡出来,形成了标准的网络包
那么虚拟机的网卡如何接到庞大的数据中心网络中
云中网络需要注意什么点
1.共享,尽管每个虚拟机都有一个或者多个虚拟网卡,但是一个物理机可能就一个网卡,如何共享出口呢?
2.隔离,分为了两个方面,一个是安全隔离,两个虚拟机可能属于两个用户,怎么保证一个用户的数据不被另一个用户窃听呢?一个是流量隔离,两个虚拟机,如果一个疯狂下片,会不会导致另一个上不了网呢?
3.互通,对于一个机器上两个虚拟机,属于同一个用户的话,如何通信,不同物理机上的两个虚拟机,属于一个用户,如何通信
4.灵活,虚拟机和物理不同,经常创建和删除,从一个机器漂移到另一台机器,有的互通,有的不互通,需要灵活性能特别好,能够灵活的配置
1.共享和互通问题
物理机上有多个虚拟机,必然有多个虚拟网卡,这些虚拟网卡如何连在一起,进行互相访问,并且访问外网呢?
可以这样理解解决,物理机就是宿舍,虚拟机就是个人的电脑,这些电脑连接必然需要一个交换机
在物理机上,有一个虚拟的交换机,在Linux上有一个命令叫做brctl,可以创建虚拟的网桥,brctl addbr br0,创建后,将两个虚拟机的虚拟机网卡,连接到虚拟网桥 brctl addif br0 tap0,这样两个虚拟机配置相同的子网网段,就可以彼此通信了
如何连接外网呢?
一种方式就是桥接:一旦使用了这种方式,就会形成下面的结构
每个虚拟机都有虚拟网卡,在笔记本电脑上,会多了几个网卡,就是虚拟机的交换机,这个虚拟机交换机将多个虚拟机连接起来,在桥接下,物理网卡也连接到这个虚拟交换机上
然后网络创建了成功,登录虚拟机看IP发现,虚拟机的地址和笔记本和旁边的同事的电脑网段是一个网段,就好比物理机和虚拟机放在同一个网桥上,相当于这个网桥上有三个机器,是一个网段的
在数据中心里面,采用的也是类似的技术,每个机器上创建一个虚拟交换机成为一个网桥br0,虚拟机的网卡都练到物理交换机上
或者说,虚拟机和物理网络具有相同的网段
在这种方式下,不仅仅解决了同一台设备的互通问题,也解决了跨物理机的互通问题,因为都在一个二层网络中,用彼此的网段访问就可以了,但是可能出现的问题就是广播问题,一个数据中心的物理机很多了,广播很严重,通过VLAN来划分,如果物理机再划分了虚拟机的话,那么广播更加麻烦
另一种方法就是NAT方式,如果在桌面虚拟化软件中使用NAT模式,
将虚拟机的网络划分为一个独立的网络,并且需要一个NAT网关服务,在虚拟机访问物理机的时候,需要进行NAT转换为物理机的地址,而且会在物理机内置一个DHCP的服务器,可以给虚拟机动态的分配IP,虚拟机的网络自成体系,形成如下的体系
可以比作为,虚拟机是你的电脑,路由器和DHCP Server是家用的路由器和寝室长电脑,物理网卡就好比宿色的网口,用于访问互联网,所有的电脑通过内网网口,连接到一个网桥br0,想要上网的话,就通过路由器将请求的NAT成为物理网络的地址,转发到物理网络
在自己的物理机上配置就不用那么困难了,可以简化一下,将虚拟机所在网关的地址直接配置到br0上,手动的配置每一台的虚拟机的IP地址,通过命令 iptables -t nat -A POSTROUTING -o ehX -j MASQUERADE,直接在物理网卡ethX上进行NAT就可以,所有从这个网卡出去的包NAT成这个网卡的地址,并且设置net-ipv4.ip_forward =1,开启物理机的转发功能,直接做路由器,不用单独的路由器,虚拟机可以直接上网了
隔离问题
解决了互联问题,隔离的问题如何解决呢?
如果一个机器上的两个虚拟机属于不同的用户,怎么办呢?可以再brctl创建的网桥上支持VLAN功能,可以设置多个虚拟机的tag,在这个虚拟网桥上,两个虚拟机是不通的
如何跨物理机互通,并且实现VLAN的隔离呢?由于brctl创建的网桥上面的tag范围只是这个网桥,于是考虑其他的方式
有一个命令vconfig,可以给予物理网卡eth0创建带有VLAN的虚拟网卡,所有这个虚拟网卡发出去的包,都会带着个VLAN,如果这样, 跨物理机的互联和隔离通过这个网卡实现,都带着这个VLAN,这样,跨物理机的互通和隔离就可以通过这个网卡实现
首先为每个用户分配不同的VLAN,例如有一个用户VLAN10,一个用户VLAN20,在一个物理机上,基于物理网卡,为每个用户用vconfig创建一个带有VLAN的网卡,不同的用户使用不同的虚拟网桥,带VLAN的虚拟网卡也连接到虚拟网桥上
那么就可以保证了多个用户之间的隔离性了,不同的用户由于网桥不同,不能彼此通信,一旦出了网桥,因为VLAN不同,也不会被桥内其他人知道,即使出了物理机,也是带着VLAN ID,所以跨物理机,不同的VLAN也不会互相通信
使用brctl的网桥很简单,基于VLAN的虚拟网卡也很简单隔离,但是这都不是大规模的云平台能够满足的,一个是vlan的数目太少,只有4096个,另一个是配置不够灵活,不能灵活的实现流量的隔离
本章小结:
云计算的关键技术是虚拟化,我们注意的是,虚拟机通过打开了TUN/TAP字符设备的方式,将虚拟机内外连接
云中的网络重点是四个方面,共享,隔离,互通,灵活,共享和互通可以使用NAT和桥接的方式,隔离通过VLAN的方式
课后思考:
1.我们说了虚拟机的系统,在数据中心,有一个著名的开源软件OpenStack,这一节的网络连通对应的OpenStack的哪个模型呢?
2.如何更加的灵活的配置网络呢?
1.openStack的网络模式有三种 flat ,flat dhcp ,vlan 对应到kvm的两种模式,nat和桥接,openstack,vlan模式 = kvm的桥接模式,虚拟机实例增加访问控制,可以使用iptables
OpenStack 的早期网络模式有Flat,Flat DHCP ,VLAN 后来才有的VPC,使用VXLAN和GRE进行隔离