主要内容

预备知识
1.虚拟化
2.云计算
Openstack核心
1.架构
2.认证Keystone
3.镜像Glance
4.计算Nova
5.存储Cinder
6.网络Neutron

作者公众号:cloudman6

第一章虚拟化

虚拟化是云计算的基础。虚拟机共享物理机的硬件资源,但逻辑上是相互隔离的。
物理机我们一般称为宿主机(HOST)宿主上的虚拟机称为客户机(Guest)
Host将自己的硬件资源虚拟化并提供给Guest是通过 一个叫Hypervisor的程序实现的。

1.1 1型虚拟化

Hypervisor直接安装在物理机上,多个虚拟机在Hypervisor上运行。Hypervisor实现方式一般是一个特殊定制的Linux系统,Xen VMWare的ESXi都属于这个类型

1.2 2型虚拟化

物理机首先安装常规的操作系统,比如redhat,ubuntu,windows.Hypervisor作为OS上的一个程序模块运行,并对虚拟机进行管理。KVM,VirtualBox,和VMWare Workstation都属于这个类型

1.3KVM
1.3.1 基本概念
KVM

KVM全称是Kerbek-Based Virtual Machine.也就是说KVM是基于Linux内核实现的。
KVM有一个内核模块叫kvm.ko,只用于管理虚拟CPU和内存。
那IO的虚拟化,比如存储和网络设备的实现是由Linux内核和Qemu来实现
什么是I/o 意思就是KVM本身只关注虚拟机调度和内存管理这两个方面。IO外设的任务交给Linux内核和Qemu。

Libvirt

Libvirt简单来说就是KVM的管理工具。
Libvirt除了能管理KVM这种Hypervisor,还能管理Xen,VirtualBox等。
Openstack底层也使用Libvirt.
Libvirt包含了3个东西:后台daemon程序libvirtd,API库和命令行工具virsh。

  1. libvirtd是服务程序,接收和处理API请求。
  2. API库使得其他人可以开发基于Libvirt的高级工具,比如virt-manager,这个是图形化的KVM管理工具
  3. virsh是我们经常要用的KVM命令行工具

virsh 和 virt-manager是基础一定要会


1.3.2KVM实操
1.准备KVM实验环境

先装Linux(ubuntu\Redhat\。。。。。)
基本的操作系统装好后,安装KVM需要的包:

sudo apt-get install qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan

各个安装包的功能

  1. qemu-kvm和qemu-system是KVM和QEMU的核心包,提供CPU,内存和IO虚拟化的功能
  2. libvirt-bin就是libvirt,用于管理KVM等Hypervisor
  3. virt-manager是KVM图形化管理工具
  4. bridge-utils和vlan,主要是网络虚拟化需要,KVM网络虚拟化的实现是基于linux-bridge和VLAN

配置源/etc/apt/sources.list

deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

在虚拟机上做实验的

需要把CPU的虚拟化功能打开。如VMWare

虚拟化反亲和组 虚拟化的亲密关系_虚拟化


Vitualbox开启虚拟化链接 用以下命令确认CPU支持虚拟化:

# egrep -o ‘(vmx|svm)’ /proc/cpuinfo

# vmx

确认Libvirtd服务已经启动
# service libvirt-bin status
libvirt-bin start/rinning,process 1478

2.启动第一个KVM虚机

开始前可以下载下虚拟机镜像路径为:

http://download.cirros-cloud.net/ 下载cirros-0.3.3-x86_64-disk.img

放到/var/lib/libvirt/images目录下 KVM默认查找镜像的地方

首先通过命令virt-manager启动图形界面

# virt-manager

虚拟化反亲和组 虚拟化的亲密关系_Storage_02


单击上图小电脑标志创建虚拟机

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_03


第一项表示安装新的OS 最后一项表示已经有安装好的镜像文件

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_04

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_05


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_06

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_07


virt-manager可以对虚机进行各种管理操作,界面直观友好,很容易上手

同时我们也可以用命令virsh管理虚机,比如查看宿主机上的虚机:
如 输入: virsh list

3.远程管理KVM虚机

virt-manager可以管理其他宿主机上的虚机。只需要简单地将宿主机添加进来。

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_08


虚拟化反亲和组 虚拟化的亲密关系_虚拟化_09


注意修改配置 :

因为KVM(准确的来说是LIbvirt)默认不接受远程管理,需要按下面的内容配置被管理宿主机中的两个文件

/etc/default/libvirt-bin(我是找不到这个路径)我的路径是/etc/default/libvirtd

/etc/libvirt/libvirtd.conf

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_10


虚拟化反亲和组 虚拟化的亲密关系_Storage_11


然后重启Libvirtd服务就可以远程管理了

service libvirt-bin restart(这个指令我用不了)

虚拟化反亲和组 虚拟化的亲密关系_Storage_12

1.4 KVM虚拟化原理
1.4.1CPU虚拟化

KVM的虚拟化是需要CPU硬件支持的。

通过egrep -o ‘(vmx|svm)’ /proc/cpuinfo

如果显示 vmx或者svm则表示支持。

一个KVM虚机在宿主机中其实是一个qemu-kvm进程,与其他LINUX进程一样被调度.

比如,在虚机上执行ps就能看到相应的进程。

虚拟机中的每一个vCPU对应qemu-kvm进程中的一个线程。

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_13


如上图,在这个例子中宿主机有两个物理CPU,上面起了两个虚机VM1和VM2.

VM1有两个VCPU,VM2有四个VCPU.可以看到VM1,VM2分别有两个和四个线程在物理CPU上调度.

即这里也演示了另一个知识点,即虚拟机的vCPU总数可以超过物理CPU的数量,这个叫CPU的overcommit(超配)

KVM允许overcommit,这个特性使得虚机能够充分利用宿主机的CPU资源,但前提是在同一时刻不能所有的虚机都满负载荷运行。

当然,如果每个虚机都很忙,反而会影响整体性能。

1.4.2内存虚拟化

KVM通过内存虚拟化共享物理系统内存,动态分配给虚拟机。

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_14


为了在一台机器上运行多个虚拟机,KVM需要实现VA(虚拟内存)-》PA(物理内存)-》MA(机器内存)之间的地址转换。虚机OS控制虚拟地址到客户内存物理地址的映射(va->pa),但是虚机OS不能直接访问机器内存,因此KVM需要负责映射客户物理内存到实际机器内存(PA -> MA).内存也是可以overcommit的。

1.4.3存储虚拟化

KVM的存储虚拟化是通过存储池和卷来管理的
Storage Pool是宿主机上可以看到的一片存储空间,可以是多种类型。
Volume是Storage Pool中划分出的一块空间,宿主机将Volume分配给虚拟机,Volume在虚拟机中看到的就是一块硬盘。

不同类型的Storage Pool

1.目录类型的 Storage Pool

文件目录是最常用的Storage Pool类型。
KVM将宿主机目录 /var/lib/libvirt/images/ 作为默认的Storage Pool
那么volume是什么呢?
答案就是该目录下面的文件了,一个文件就是一个volume
就如同创建一个虚机时,就是将镜像文件放到了这个目录下,因此放置的cirros_…_.img也就是volume,对虚拟机来说就是他的启动磁盘了。

虚拟化反亲和组 虚拟化的亲密关系_openstack_15


KVM所有可以使用的Storage Pool都定义在宿主机的/etc/libvirt/storage目录下,每一个Pool一个xml文件,默认有一个default.xml

如下(有点模糊 PDF版本)

虚拟化反亲和组 虚拟化的亲密关系_ubuntu_16


注意:Storage Pool的类型是“dir”,目录的路径就是 /var/lib/libvirt/images

下面我们为虚机添加一个新的磁盘,看看有什么变化。

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_17


虚拟化反亲和组 虚拟化的亲密关系_openstack_18

在/var/lib/libvirt/images多了一个对应之前创建大小的磁盘

虚拟化反亲和组 虚拟化的亲密关系_Storage_19


使用文件做volume有很多优点:存储方便,移植性好,可复制,可远程访问。

远程访问指的是:镜像文件不一定都要放置到宿主机本地文件系统中,可以存储在通过网络连接的远程文件系统,比如NFS,或者是分布式文件系统中比如GlusterFS.

这样镜像文件就可以在多个宿主机之间共享,便于虚机在不同宿主机之间做Live Migration;如果是分布式文件系统,多副本的特性还可以保证镜像文件的高可用。

KVM支持多种volume文件格式,在添加volume时可选择。

虚拟化反亲和组 虚拟化的亲密关系_Storage_20


raw是默认格式,即原始磁盘镜像格式,移植性好,性能好,但大小固定,不能节省磁盘空间。

qcow2是推荐使用的格式,cow表示copy on write,能够节省磁盘空间,支持AES加密,支持zlib压缩,支持多快照,功能很多。

vmdk是VMWare的虚拟磁盘格式,也就是说VMWare虚机可以直接在KVM上运行。

2.LVM 类型的 Storage Pool

基础知识了解:
LVM是Linux中的逻辑卷管理功能,其基础是内核的Device Mapper功能。LVM为Linux提供了极其灵活的分区管理功能,可以突破MBR、GPT分区中对于分区调整的种种限制。

卷组(VG):Volume Group,是连接物理存储和逻辑存储的中间层,它将一个及以上的PV划分为若干块(Extent)来分配给逻辑卷(LV)使用。
两种卷:
PV:Physical Volume,物理卷,是LVM格式的块设备(物理磁盘、物理分区、物理RAID、软RAID虚拟设备),其上没有传统的文件系统,而是按照LVM需要的格式组织数据。
LV:Logical Volume,逻辑卷,是在VG上建立的供用户使用的数据卷,其空间由若干等大的逻辑单元(LE)组成。
两种单元:
PE:Physical Extent,物理单元,VG将PV纳入自己的管辖时,会把PV分割为等大的单元,这些单元称为PE,默认大小为4MiB。PE的大小取决于VG的设置,而非PV本身。
LE:Logical Extent,逻辑单元,是LV的组成单元,是PE的映射。
PE-LE是LVM对存储空间管理的最小单元,也是LVM灵活性的基石。通过LE的分配与释放,我们可以灵活的调整LV的大小;通过PE-LE映射关系的变更,我们可以将一个LV的数据移动到另一个LV中,从而实现精简卷和快照功能。

不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上VG(卷组 Volume Group (VG) 是计算机上的术语(操作系统的VG概念)
一个VG是由许多物理分区组成的(可能来自多个物理卷或硬盘))中的LV也可以作为虚拟磁盘分配给虚拟机使用。不过,LV由于没有磁盘的MRB引导记录,不能作为虚拟机的启动盘,只能作为数据盘使用。
这种配置下,宿主机上的VG就是一个Storge Pool,VG中的LV就是Volume.
LV的优点是有较好的性能;不足的地方是管理和移动性方面不如镜像文件,而且不能通过远程使用。

在宿主机上创建一个容量为10GB的VG,命名为HostVG

输入 vgdisplay

虚拟化反亲和组 虚拟化的亲密关系_Storage_21


然后创建一个Storage Pool的定义文件 /etc/libvirt/storage/ubuntu-vg.xml

查看当前pool: virsh pool-list --all

启用之前定义的ubuntu-vg.xml:virsh pool-define /etc/libvirt/storage/ubuntu-vg.xml

(这边我也出问题了 看不清配置文件的内容。。就不写了)

3.其他类型的Storage Pool

KVM还支持iSCSI,Ceph等多种类型的Storage Pool,这里就不一一介绍了,最常用的就是目录类型。

1.5网络虚拟化

这部分很难,但是很重要。

虚拟化反亲和组 虚拟化的亲密关系_Storage_22


这是Openstack官网给出的计算节点(可以理解为KVM的宿主机)虚拟网络的逻辑图,上面的网络设备很多,层次也很复杂。

其中最重要的两个东西是:Linux Bridge 和 VLAN.

1.5.1 Linux Bridge
1.基本概念

假设宿主机有1块与外网连接的物理网卡eth0,上面跑了一个虚机VM1,现在有一个问题是:

如何让VM1能够访问外网?

至少有两种方案:

(1)将物理网卡eth0直接分配给VM1

但实施这个方案随之带来的问题很多:宿主机就没有网卡,无法访问了;新虚拟机 ,比如VM2也没有网卡。

(2)给VM1分配一个虚拟网卡vnet0,通过Linux Bridge br0 将 eth0 和 vnet0连接起来,如图

虚拟化反亲和组 虚拟化的亲密关系_Storage_23


Linux Bridge是Linux上用来做TCP/IP二层协议交换的设备,其功能大家可以理解为是一个二层交换机或者HUB.多个网络设备可以连接到同一个LInux Bridge,当某个设备收到数据包时,Linux Bridge会将数据转发给其他设备。

在上面这个例子中,当有数据到达eth0时,br0会将数据发给vnet0,这样VM1就能收到外网的数据。

反过来,VM1发送数据给vnet0,br0也会将数据转发到eth0,从而实现vm1与外网通信。

现在我们增加一个虚机VM2,如图

虚拟化反亲和组 虚拟化的亲密关系_openstack_24


vnet1的网卡也连接到了br0上。现在VM1和VM2之间可以通信,同时VM1和VM2也都可以与外网通信。

2.动手实践虚拟网络

实现上图的网络拓扑

3.配置Linux Bridge br0

编辑 /etc/network/interfaces,配置br0

  1. 之前宿主机的IP是通过dhcp配置在eth0上的;创建Linux Bridge后IP就必须放在br0上了
  2. 放在br0的配置信息中注意最后一行bridge_ports eth0,其作用就是将eth0挂到br0上。

根据自己有IP的网卡配置 我的配置如下

auto lo
iface lo inet loopback

auto enp0s8
iface enp0s8 inet manual

auto br0
iface br0 inet dhcp
        bridge_stp off
        bridge_waitport 0
        bridge_fd 0
        bridge_ports enp0s8

配置完ifconfig 就可以看到ip已经到了br0上

使用brctl show 查看当前linux配置。eth0 已经挂到了br0上

虚拟化反亲和组 虚拟化的亲密关系_Storage_25


除了br0,大家应该注意到还有一个virbr0的Bridge,而且virb0上已经配置了Ip.关注一下后面再讲

虚拟化反亲和组 虚拟化的亲密关系_Storage_26


先起两个虚拟机并关机

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_27

4.配置VM1

在virt-manager中查看VM1的网卡配置。

虚拟化反亲和组 虚拟化的亲密关系_ubuntu_28


接着启动VM1(generic):

virsh start generic

虚拟化反亲和组 虚拟化的亲密关系_openstack_29


虚拟化反亲和组 虚拟化的亲密关系_Storage_30


brctl show告诉我们,br0下面添加了一个vnet0设备,通过virsh确认这就是generic的虚拟网卡

root@zsy-VirtualBox:/var/lib/libvirt/images# virsh domiflist generic
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br0        rtl8139     52:54:00:73:a3:36

generic的IP是DHCP获得的(设置静态IP也是可以的),通过virt-manager控制台登录VM1,查看IP.(我这里虚机分配不到ip地址实例一直进不去(后面又可以了))

只能按照原作者的意思来就是:

ifconfig查看当前网卡

虚拟化反亲和组 虚拟化的亲密关系_ubuntu_31


vm1通过dhcp拿到的IP是192.168.111.106,与宿主机(IP:192.168.111.107)是同一个网段。ping外网也是成功的

虚拟化反亲和组 虚拟化的亲密关系_Storage_32


在VM1中虚拟网卡是eth0并不是vnet0

注意:vnet0是该虚拟网卡在宿主机中对应的设备名称,其类型是TAP设备。

可以后的尝试

虚拟化反亲和组 虚拟化的亲密关系_openstack_33


互ping成功

虚拟化反亲和组 虚拟化的亲密关系_Storage_34

5.配置VM2

跟VM1一样,VM2的虚拟网卡也挂在br0上,启动VM2查看网卡信息。
virsh start VM2
brctl show
从上面的显示可以看到br0字段下面多了一个vnet1,通过virsh确认这就是VM2的虚拟网卡。
virsh domiflist VM2
然后执行这两个互ping再ping外网都能通。
因此我们得出
通过br0这个LInux Bridge,我们实现了VM1和VM2,宿主机和外网这四者之间的数据通信。

6.理解virbr0

virbr0是KVM默认创建的一个Bridge,其作用是为连接其上的虚机网卡提供NAT访问外网的功能。
virb0默认分配了一个192.168.122.1,并为连接其上的其他虚拟网卡提供DHCP服务。
下面演示如何使用virbr0
在virt-manager打开VM1的配置界面,网卡Source device选择“default”,将VM1的网卡挂在virbr0上

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_35

brctl show可以查看 vnet0已经挂在了virbr0上了

虚拟化反亲和组 虚拟化的亲密关系_Storage_36


用virsh domiflist VM1确认vnet就是VM1的虚拟网卡

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_37


virbr0使用dnsmasq提供DHCP服务,可以在宿主机中查看该进程信息

ps -elf | grep dnsmasq

虚拟化反亲和组 虚拟化的亲密关系_Storage_38


在/var/lib/libvirt/dnsmasq/目录下有一个default.leases文件,当VM1成功获得DHCP的IP后,可以在该文件中查看到相应的信息。

虚拟化反亲和组 虚拟化的亲密关系_Storage_39


虚拟化反亲和组 虚拟化的亲密关系_openstack_40


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_41

1.5.2 VLAN
1.基本概念

LAN表示Local Area Network,本地局域网,通常使用Hub和Switch来连接LAN中的计算机。

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_42


VLAN的隔离是二层隔离,A和B无法相互访问的是二层广播包(比如arp)无法跨越VLAN边界。

但是在三层(比如IP)是可以通过路由器互通的。

Access口:

虚拟化反亲和组 虚拟化的亲密关系_openstack_43


Trunk口

虚拟化反亲和组 虚拟化的亲密关系_openstack_44

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_45


虚拟化反亲和组 虚拟化的亲密关系_ubuntu_46


这样配置的效果是:

  1. 宿主机用软件实现了交换机,上面定义了一个VLAN10
  2. eth0.10,brvlan10和vnet0都分别接到了VLAN10的ACCESS口上。而eth0就是一个Trunk口
  3. VM1通过vnet0发出来的数据包会被打上VLAN10的标签

eth0.10的作用是:定义了VLAN10

brvlan10的作用是:Bridge上的其他网络设备自动加入到VLAN10中。

我们再增加一个VLAN20,如图1-46所示。

虚拟化反亲和组 虚拟化的亲密关系_openstack_47


图上交换机有两个VLAN.VM1和VM2分别属于VLAN10和VLAN20.对于新创建的虚机只需要将对应的虚拟网卡放入对应的bridge中就能控制其所属的VLAN.VLAN设备总是以母子的关系出现,母子设备之间是一对多的关系。

一个母设备(eth0)可以对应多个子设备(eth0.10,eh0.20…)而一个子设备只有一个母设备。

下面我们来看如何在实验环境中实施和配置VLAN网络。

2.配置VLAN

编辑 /etc/network/interface,配置eth0.10和brvlan10,eth0.20和brvlanw0.
下面用vmdiff展示了对/etc/network/interfaces

虚拟化反亲和组 虚拟化的亲密关系_openstack_48


重启宿主机ifconfig各个接口

虚拟化反亲和组 虚拟化的亲密关系_Storage_49


用brctl show查看当前linux bridge配置

eth0.10 eth0.20分别挂在brvlan10和brvlan20上了。

如图

虚拟化反亲和组 虚拟化的亲密关系_虚拟化_50


虚拟化反亲和组 虚拟化的亲密关系_虚拟化_51

3.配置VM1(流程类似 直接截图了)

虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_52


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_53


虚拟化反亲和组 虚拟化的亲密关系_openstack_54


虚拟化反亲和组 虚拟化的亲密关系_虚拟化_55


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_56


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_57


虚拟化反亲和组 虚拟化的亲密关系_虚拟化反亲和组_58


虚拟化反亲和组 虚拟化的亲密关系_Storage_59

1.5.3 Linux Bridge + VLAN = 虚拟交换机

现在对KVM的网络虚拟化做个总结

  1. 物理交换机存在多个VLAN,每个VLAN拥有多个端口。
    同一VLAN端口之间可以交换转发,不同VLAN端口之间隔离。所以交换机包含两层功能:交换与隔离
  2. LINUX的VLAN设备实现的是隔离功能,但没有交换功能。
    一个VLAN母设备(比如eth0)不能拥有两个相同ID的VLAN子设备,因此也就不可能出现数据交换情况。
  3. Linux Bridge专门实现交换功能。
    将同一个VLAN的子设备都挂载到一个Bridge上,设备之间就可以交换数据了。总结起来,LInux Bridge加VLAN在功能层面完整模拟现实世界的二层交换机。