主要内容
预备知识
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。
- libvirtd是服务程序,接收和处理API请求。
- API库使得其他人可以开发基于Libvirt的高级工具,比如virt-manager,这个是图形化的KVM管理工具
- 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
各个安装包的功能
- qemu-kvm和qemu-system是KVM和QEMU的核心包,提供CPU,内存和IO虚拟化的功能
- libvirt-bin就是libvirt,用于管理KVM等Hypervisor
- virt-manager是KVM图形化管理工具
- 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
单击上图小电脑标志创建虚拟机
第一项表示安装新的OS 最后一项表示已经有安装好的镜像文件
virt-manager可以对虚机进行各种管理操作,界面直观友好,很容易上手
同时我们也可以用命令virsh管理虚机,比如查看宿主机上的虚机:
如 输入: virsh list
3.远程管理KVM虚机
virt-manager可以管理其他宿主机上的虚机。只需要简单地将宿主机添加进来。
注意修改配置 :
因为KVM(准确的来说是LIbvirt)默认不接受远程管理,需要按下面的内容配置被管理宿主机中的两个文件
/etc/default/libvirt-bin(我是找不到这个路径)我的路径是/etc/default/libvirtd
/etc/libvirt/libvirtd.conf
然后重启Libvirtd服务就可以远程管理了
service libvirt-bin restart(这个指令我用不了)
1.4 KVM虚拟化原理
1.4.1CPU虚拟化
KVM的虚拟化是需要CPU硬件支持的。
通过egrep -o ‘(vmx|svm)’ /proc/cpuinfo
如果显示 vmx或者svm则表示支持。
一个KVM虚机在宿主机中其实是一个qemu-kvm进程,与其他LINUX进程一样被调度.
比如,在虚机上执行ps就能看到相应的进程。
虚拟机中的每一个vCPU对应qemu-kvm进程中的一个线程。
如上图,在这个例子中宿主机有两个物理CPU,上面起了两个虚机VM1和VM2.
VM1有两个VCPU,VM2有四个VCPU.可以看到VM1,VM2分别有两个和四个线程在物理CPU上调度.
即这里也演示了另一个知识点,即虚拟机的vCPU总数可以超过物理CPU的数量,这个叫CPU的overcommit(超配)
KVM允许overcommit,这个特性使得虚机能够充分利用宿主机的CPU资源,但前提是在同一时刻不能所有的虚机都满负载荷运行。
当然,如果每个虚机都很忙,反而会影响整体性能。
1.4.2内存虚拟化
KVM通过内存虚拟化共享物理系统内存,动态分配给虚拟机。
为了在一台机器上运行多个虚拟机,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,对虚拟机来说就是他的启动磁盘了。
KVM所有可以使用的Storage Pool都定义在宿主机的/etc/libvirt/storage目录下,每一个Pool一个xml文件,默认有一个default.xml
如下(有点模糊 PDF版本)
注意:Storage Pool的类型是“dir”,目录的路径就是 /var/lib/libvirt/images
下面我们为虚机添加一个新的磁盘,看看有什么变化。
在/var/lib/libvirt/images多了一个对应之前创建大小的磁盘
使用文件做volume有很多优点:存储方便,移植性好,可复制,可远程访问。
远程访问指的是:镜像文件不一定都要放置到宿主机本地文件系统中,可以存储在通过网络连接的远程文件系统,比如NFS,或者是分布式文件系统中比如GlusterFS.
这样镜像文件就可以在多个宿主机之间共享,便于虚机在不同宿主机之间做Live Migration;如果是分布式文件系统,多副本的特性还可以保证镜像文件的高可用。
KVM支持多种volume文件格式,在添加volume时可选择。
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 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网络虚拟化
这部分很难,但是很重要。
这是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连接起来,如图
Linux Bridge是Linux上用来做TCP/IP二层协议交换的设备,其功能大家可以理解为是一个二层交换机或者HUB.多个网络设备可以连接到同一个LInux Bridge,当某个设备收到数据包时,Linux Bridge会将数据转发给其他设备。
在上面这个例子中,当有数据到达eth0时,br0会将数据发给vnet0,这样VM1就能收到外网的数据。
反过来,VM1发送数据给vnet0,br0也会将数据转发到eth0,从而实现vm1与外网通信。
现在我们增加一个虚机VM2,如图
vnet1的网卡也连接到了br0上。现在VM1和VM2之间可以通信,同时VM1和VM2也都可以与外网通信。
2.动手实践虚拟网络
实现上图的网络拓扑
3.配置Linux Bridge br0
编辑 /etc/network/interfaces,配置br0
- 之前宿主机的IP是通过dhcp配置在eth0上的;创建Linux Bridge后IP就必须放在br0上了
- 放在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上
除了br0,大家应该注意到还有一个virbr0的Bridge,而且virb0上已经配置了Ip.关注一下后面再讲
先起两个虚拟机并关机
4.配置VM1
在virt-manager中查看VM1的网卡配置。
接着启动VM1(generic):
virsh start generic
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查看当前网卡
vm1通过dhcp拿到的IP是192.168.111.106,与宿主机(IP:192.168.111.107)是同一个网段。ping外网也是成功的
在VM1中虚拟网卡是eth0并不是vnet0
注意:vnet0是该虚拟网卡在宿主机中对应的设备名称,其类型是TAP设备。
可以后的尝试
互ping成功
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上
brctl show可以查看 vnet0已经挂在了virbr0上了
用virsh domiflist VM1确认vnet就是VM1的虚拟网卡
virbr0使用dnsmasq提供DHCP服务,可以在宿主机中查看该进程信息
ps -elf | grep dnsmasq
在/var/lib/libvirt/dnsmasq/目录下有一个default.leases文件,当VM1成功获得DHCP的IP后,可以在该文件中查看到相应的信息。
1.5.2 VLAN
1.基本概念
LAN表示Local Area Network,本地局域网,通常使用Hub和Switch来连接LAN中的计算机。
VLAN的隔离是二层隔离,A和B无法相互访问的是二层广播包(比如arp)无法跨越VLAN边界。
但是在三层(比如IP)是可以通过路由器互通的。
Access口:
Trunk口
这样配置的效果是:
- 宿主机用软件实现了交换机,上面定义了一个VLAN10
- eth0.10,brvlan10和vnet0都分别接到了VLAN10的ACCESS口上。而eth0就是一个Trunk口
- VM1通过vnet0发出来的数据包会被打上VLAN10的标签
eth0.10的作用是:定义了VLAN10
brvlan10的作用是:Bridge上的其他网络设备自动加入到VLAN10中。
我们再增加一个VLAN20,如图1-46所示。
图上交换机有两个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
重启宿主机ifconfig各个接口
用brctl show查看当前linux bridge配置
eth0.10 eth0.20分别挂在brvlan10和brvlan20上了。
如图
3.配置VM1(流程类似 直接截图了)
1.5.3 Linux Bridge + VLAN = 虚拟交换机
现在对KVM的网络虚拟化做个总结
- 物理交换机存在多个VLAN,每个VLAN拥有多个端口。
同一VLAN端口之间可以交换转发,不同VLAN端口之间隔离。所以交换机包含两层功能:交换与隔离 - LINUX的VLAN设备实现的是隔离功能,但没有交换功能。
一个VLAN母设备(比如eth0)不能拥有两个相同ID的VLAN子设备,因此也就不可能出现数据交换情况。 - Linux Bridge专门实现交换功能。
将同一个VLAN的子设备都挂载到一个Bridge上,设备之间就可以交换数据了。总结起来,LInux Bridge加VLAN在功能层面完整模拟现实世界的二层交换机。