1、什么是虚拟化?
虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。
那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
这个主要是通过一个叫做 Hypervisor 的程序实现的。
2、虚拟化的分类
根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:
1)1型虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。
2)2型虚拟化
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。
两种类型的对比:
1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
3、KVM
1)基本概念
KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。
那 IO 的虚拟化,比如存储和网络设备由谁实现呢?
这个就交给 Linux 内核和Qemu来实现。
说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。
2)Libvirt
Libvirt 是啥? 简单说就是 KVM 的管理工具。
其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
OpenStack 底层也使用 Libvirt。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
libvirtd是服务程序,接收和处理 API 请求;
API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。
3)KVM实际操作
a、准备KVM实验环境
b、启动第一个虚机
c、远程管理虚机
4)KVM虚拟化原理
a、CPU虚拟化
一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。
图
虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。
虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。
KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。
b、内存虚拟化
KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。
为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。
虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。
图
c、存储虚拟化
KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。
Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型。
Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。
a)目录类型的 Storage Pool
b)LVM类型的 Storage Pool
c)其他类型的Storage Pool
d、网络虚拟化
a)Linux Bridge
(a)基本概念
假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是:
如何让 VM1 能够访问外网?
至少有两种方案
1)将物理网卡eth0直接分配给VM1,但随之带来的问题很多:
宿主机就没有网卡,无法访问了;
新的虚机,比如 VM2 也没有网卡。
2)推荐的方案:给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来
图
Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。
多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。
在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据;
反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。
(b)动手实践虚机网络
(c)理解virbr0
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。
b)VLAN
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。
一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。
一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN。
一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。
计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。
简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
举个例子:有两组机器,Group A 和 B。
我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。
方法一:使用两个交换机,A 和 B 分别接到一个交换机。
方法二:使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
请注意:
VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。
但在三层(比如IP)上是可以通过路由器让 A 和 B 互通的。概念上一定要分清。
现在的交换机几乎都是支持 VLAN 的。
通常交换机的端口有两种配置模式: Access 和 Trunk。
Access 口
这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。
不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。
Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。
Access 口只能属于一个 VLAN。
Trunk 口
假设有两个交换机 A 和 B。
A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3
那如何让 AB 上相同 VLAN 之间能够通信呢?
办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。
VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
现在看看 KVM 虚拟化环境下是如何实现 VLAN 的
图
eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备(软件实现了一个交换机(当然是虚拟的))与之相连。
eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。
eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。
这样的配置其效果就是:
宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。
eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。
而 eth0 就是一个 Trunk 口。
VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。
eth0.10 的作用是:定义了 VLAN10
brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中
c)Linux Bridge + VLAN = 虚拟交换机
对 KVM 的网络虚拟化做个总结。
1、物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。
同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。
所以交换机其包含两层功能:交换与隔离。
2、Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。
一个 VLAN 母设备(比如 eth0)不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。
3、Linux Bridge 专门实现交换功能。
将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。
总结起来,Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。
eth0 相当于虚拟交换机上的 trunk 口,允许 vlan10 和 vlan20 的数据通过;
eth0.10,vent0 和 brvlan10 都可以看着 vlan10 的 access 口
eth0.20,vent1 和 brvlan20 都可以看着 vlan20 的 access 口
二、云计算
1、基本概念
计算(CPU/内存)、存储和网络是 IT 系统的三类资源。
通过云计算平台,这三类资源变成了三个池子。
当需要虚机的时候,只需要向平台提供虚机的规格。
平台会快速从三个资源池分配相应的资源,部署出这样一个满足规格的虚机。
虚机的使用者不再需要关心虚机运行在哪里,存储空间从哪里来,IP是如何分配,这些云平台都搞定了。
云平台是一个面向服务的架构,按照提供服务的不同分为 IaaS、PaaS 和 SaaS。
(1)IaaS(Infrastructure as a Service)基础设施即服务;提供的服务是虚拟机。
IaaS 负责管理虚机的生命周期,包括创建、修改、备份、启停、销毁等。
使用者从云平台得到的是一个已经安装好镜像(操作系统+其他预装软件)的虚拟机。
使用者需要关心虚机的类型(OS)和配置(CPU、内存、磁盘),并且自己负责部署上层的中间件和应用。
典型的 IaaS 例子有 AWS、Rackspace、阿里云等
(2)PaaS(Platform as a Service)平台即服务;提供的服务是应用的运行环境和一系列中间件服务(比如数据库、消息队列等)。
使用者只需专注应用的开发,并将自己的应用和数据部署到PaaS环境中。
PaaS负责保证这些服务的可用性和性能。
典型的 PaaS 有 Google App Engine、IBM BlueMix 等
(3)SaaS(Software as a Service)软件即服务;提供的是应用服务。
使用者只需要登录并使用应用,无需关心应用使用什么技术实现,也不需要关系应用部署在哪里。
SaaS的使用者通常是应用的最终用户。
典型的 SaaS 有 Google Gmail、Salesforce 等
2、云计算和openstack
OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.
以上是官网对 OpenStack 的定义,OpenStack 对数据中心的计算、存储和网络资源进行统一管理。
由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。
原文地址:http://blog.51cto.com/10630401/2121520