KVM高级功能部署

        企业内部为了使服务器资源达到最大化利用,通常都会进行KVM 虚拟化,每台服务器上运行多台 KVM 虚拟机。随着 KVM 虚拟机数量的不断增多,个别服务器会出现资源过载现象,这时候就需要对部分KVM 虚拟机进行迁移,迁移到负载相对较低的服务器上。为了解决以上问题,针对可停机的KVM 虚拟机,可使用静态迁移的方式来迁移KVM虚拟机。针对在线提供服务、不可停机的KVM 虚拟机,可使用基于共享存储的动态迁移或基于数据块的动态迁移来完成迁移工作。最终按业务类型将虚拟机重新调配、合理布局,以保证服务器一直处于良好的运行状态。除了迁移之外,还可以在KVM 宿主机上开启KSM内核同页合并,以达到节省内存、降低负载的目的。

一、KVM虚拟机迁移

        KVM 虚拟机迁移,是将某一虚拟机上的环境和软件完全复制到另一台物理机上继续运行。KVM 虚拟机迁移可以优化系统负载、重新规划 KVM 虚拟机布局并简化 KVM 虚拟机的管理维护工作。
        KVM 虚拟机迁移的主要应用场景如下所示。
        当一台 KVM 宿主机的负载比较高时,可将源KVM 宿主机上的部分虚拟机迁移到负载较低的 KVM 宿主机中,以保证服务质量。
        通过 KVM 虚拟机迁移将多台负载较低的KVM 宿主机上的 KVM 虚拟机集中迁移到某一台 KVM 宿主机上,从而达到节约资源的目的。
        在升级 KVM 宿主机硬件设备时,可以将 KVM 宿主机上运行的 KVM 虚拟机迁移到其他KVM 宿主机上,以解决对硬件的依赖,从而实现业务不中断情况下对物理硬件设备的升级。
        跨地域迁移,实现 KVM 虚拟机的远程迁移。根据迁移方式的不同,可将迁移分为静态迁移(staticmagration)和动态迁移(livemigration)。二者的区别是:静态迁移时会有一段时间虚拟机中的服务是不可用的,而动态迁移则没有明显的服务暂停时间。

1.静态迁移

        静态迁移需要先关闭要迁移的 KVM 虚拟机,并拷贝它的磁盘文件和配置文件到目标KVM 宿主机,然后恢复启动,从而实现静态迁移。如果 KVM 虚拟机的磁盘文件存储在 KVM宿主机本地,在静态迁移时需要拷贝磁盘文件和配置文件;如果 KVM 虚拟机的磁盘文件存储在共享存储上,在静态迁移时,只需要拷贝 KVM 虚拟机的配置文件,KVM 虚拟机的磁盘文件可通过挂载共享存储到本地目录的方式来获取。针对KVM 虚拟机磁盘文件存储位置的不同,在静态迁移时需要做适当的调整。

2.动态迁移

        动态迁移是保证 KVM 虚拟机上运行的应用正常提供服务的同时,让KVM 虚拟机在不同的 KVM 宿主机之间进行迁移。动态迁移的过程仅有非常短暂的停机时间,甚至可以忽略不计,同时 KVM 虚拟机上已经打开的应用连接不会断开,依然保持不变。KVM 的动态迁移有两种方式:一种是基于共享存储的动态迁移,另一种是基于数据块的动态迁移。

(1)基于共享存储的动态迁移

        基于共享存储的动态迁移是在 KVM 虚拟机迁移开始后,被迁移的KVM 虚拟机依然保持在源 KVM 宿主机上运行。与此同时,KM 虚拟机的内存页被传输到目标 KVM 宿主机之上。QEMUIKVM 会监控并记录迁移过程中所有已被传输的内存页的任何修改,并在所有内存页传输完成后再开始传输在前面传输过程中被更改的内存页内容。QEMUIKVM 也会评估迁移过程中的传输速度,当剩余的内存数据量能够在一个可设定的时间周期内完成传输,QEMU/KVM 将会关闭源宿主机上的 KVM 虚拟机,再将剩余的数据量传输到目标宿主机,最后通过传输过来的内存内容在目标宿主机上恢复 KVM 虚拟机的运行状态。如此即可完成KVM 基于共享存储的动态迁移。如果 KVM 虚拟机中内存使用量非常大且修改频繁,内存中数据被不断修改的速度大于 KVM 能够传输的内存速度,该情况下无法使用动态迁移,只能使用静态迁移方法来进行 KVM 虚拟机迁移。

(2)基于数据块的动态迁移

        如果对使用本地存储的KVM 虚拟机进行在线迁移,就要用到基于数据块的动态迁移。上述基于共享存储的动态迁移,为了实现动态迁移,源KVM 宿主机和目标宿主机需要连接共享存储服务,而基于数据块的动态迁移,共享存储不再是动态迁移的必要条件。在迁移过程中,KVM 虚拟机只使用本地存储,不再需要共享存储的支持,因此迁移环境比较简单,迁移的源宿主机和目标宿主机只需要保持以太网连接即可。因为少了共享存储,所以降低了动态迁移的难度。 

二、KSM内核同页合并

        KSM(KernelSamePage Merging)被称为内核同页合并。KSM 允许内核在两个或多个进程之间共享完全相同的内存页。KSM 让内核扫描正在运行中的程序并比较它们的内存,如果发现它们的内存区域或内存页是完全相同的,就将相同的内存合并为一个单一的内存页,并将其标识为“写时复制(copy-on-write)”,这样可以起到节省系统内存使用量的作用。如果有进程试图去修改被合并且被标识为"写时复制”的内存页,就为该进程复制出一个新的内存页供其使用。
        在 QEMU/KVM 中,一个 KVM 虚拟机就是一个 QEMU 进程,所以使用 KSM 也可以实现多个 KVM 虚拟机之间相同内存合并。如果在同一 KVM 宿主机上的多个 KVM 虚拟机运行的是相同的操作系统或应用程序,则 KVM 虚拟机之间的相同内存页数量就可能比较多,这种情况下使用 KSM 的效果就会更加显著。在 KVM 环境下使用KSM ,只有那些相同的内存页才是可以被共享合并的,并且KSM 只会识别并合并那些不会干扰客户机运行、不会影响 KVM 宿主机或 KVM 虚拟机的安全内存页。因此,在 KVM 虚拟化环境中,KSM 能够提高内存的利用率。
        KSM 最初是为了在KVM 虚拟化中使用而开发的,不过它对非虚拟化系统依然非常有用。KSM 可以提高KVM 宿主机中内存的使用效率,所以一般建议开启 KSM 功能。由于KSM 必须有一个或多个进程去检测和找出完全相同且可以用于合并的内存页,所以 KSM虽然能够让内存使用量降低,但是 KVM 宿主机中的 CPU 使用量会有一定程度的升高,因此可能会带来隐蔽的性能问题。在实际生产环境中使用KSM 需要进行适当配置,以便达到较好的平衡。KSM 节省内存的效果与 KVM 虚拟机操作系统及KVM 虚拟机中运行的应用程序有关,如果 KVM 虚拟机上的操作系统及其上运行的应用程序相同,节省内存的效果就会很显著,甚至有可能节省超过 50%的内存。反之,如果KVM 虚拟机操作系统不同,且运行的应用程序也都大不相同,KSM 节省内存的效果就不明显,节省的内存甚至可能达不到5%。
        在使用 KSM 时,为了防止内存过载,最好保证系统的交换分区(swapspace)足够大。虽然 KSM 可以通过内存页合并而减少内存使用量,但是KVM 虚拟机在运行过程中可能会修改 KSM 合并的内存页。修改这些内存页采用的方式是将这些内存页先复制出来,再进行修改,这样就会占用内存空间,因此可能会导致系统内存不足,这时就需要足够的交换空间来保证系统的正常运行。

三、案例实施 

1.静态迁移

        使用源宿主机 kvm01 和目标宿主机 kvm02 来完成静态迁移。首先在源宿主机 kvm01上创建虚拟机 test01,虚拟机 test01 的数据放在本地磁盘。然后将虚拟机 test01 从源宿主机 kvm01 迁移到目标宿主机 kvm02上,并进行一些相应的配置。

(1)在源宿主机kvm01上进行迁移前的准备工作

        创建虚拟机test01

[root@kvm1 ~]# mkdir -p /data_kvm/store
[root@kvm01 ~]# virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data_kvm/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c /opt/CentOS-7-x86_64-DVD-2009.iso --vnc --vncport=5901 --vnclisten=0.0.0.0

        virt-install 安装命令各选项的具体作用如下所示:
        -n:指定虚拟机的名字。 
        -r:指定内存大小。
        --vcpu:指定虚拟 CPU 个数。
        --disk:指定磁盘文件放置位置及大小。
        -w:制定所使用的网桥。
        --autostart:设置虚拟机在宿主机开机时启动。
        -c:指定镜像文件。
        --vncport:通过 vnc viewer 连接的端口。
        --vnclisten:通过 vnc
        --accelerate:当安装qemu客户机时,如果支持可用kvm或kqemu内核加速能力,KVM加速器

         上述命令执行后忽略如下所示报错信息,打开VNC Viewer 创建的连接“192.168.9.201:5901”。

WARNING 无法连接到图形控制台:没有安装 virt-viewer。请安装'virt-viewer'软件包。
WARNING 没有控制台用于启动客户机,默认为--wait-1
开始安装.
正在分配'test01.qcow2'                                    10 GB 00:00:01
ERROR unsupported format character '英(0xffffffe7) at index 47
域安装失败,您可以运行下列命令重启您的域:
'virsh start virsh --connect qemu:///system start test01'
否则请重新开始安装。

        通过 VNC Viewer 安装 test01 虚拟机的具体过程省略,等虚拟机的操作系统安装完成后,test01虚拟机就安装完成了。

(2)提取磁盘和配置文件

        在宿主机 kvm01 上,将虚拟机 test01 的磁盘文件和 xml 配置文件上传到目标宿主机kvm02 上。
        导出虚拟机 test01 的 xml 配置文件

virsh dumpxml test01> test01.xml

        定位虚拟机 test01 的磁盘文件 

virsh domblklist test01

         拷贝配置文件和磁盘文件到目标宿主机 kvm02上

[root@kvm01 ~]# scp test01.xml 192.168.10.202:/etc/libvirt/qemu/
[root@kvm01 ~]# scp /data/store/test01.qcow2 192.168.10.202:/data/store/

 (3)配置和启动目标虚拟机

         重新定义虚拟机 test01

[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
[root@kvm02 ~]# virsh list --all
[root@kvm02 ~]# virsh start test01

 2.基于共享存储的动态迁移

        在 kvmnfs 服务器上部署 NFS 服务并创建共享目录实现共享存储。在源宿主机 kvm01和目标宿主机 kvm02上分别挂载共享目录。被迁移虚拟机的磁盘文件存储在共享目录内,最终实现虚拟机从源宿主机 kvm01 迁移到目标宿主机 kvm02 上。

(1)配置NFS共享存储

        在 kvmnfs 服务器上面安装 NFS 服务

[root@kvmnfs ~]# yum -y install nfs-utils

        配置共享目录

[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.9.0/24(rw,sync,no root squash)

        启动并查看NFS服务

[root@kvmnfs ~]# systemctl enable nfs
[root@kvmnfs ~]# systemctl enable rpcbind
[root@kvmnfs ~]# systemctl start nfs
[root@kvmnfs ~]# systemctl start rpcbind
[root@kvmnfs ~]# showmount -e localhost
Export list for localhost:
/data 192.168.9.0/24

(2)挂载NFS目录

        在 kvm01 和 kvm02 两台宿主机上,先创建本地数据目录,之后再分别挂载 NFS 目录,并设置开机自动挂载。下面以宿主机kvm01 为例进行操作演示。

[root@kvm01 ~]# mkdir /data/kgc
[root@kvm01 ~]# mount -t nfs 192.168.9.63:/data /data/kgc
[root@kvm01 ~]# mount
[root@kvm01 ~]# vim /etc/fstab

192.168.9.63:/data/data/kgc    nfs    defaults    0 0

 (3)通过现有磁盘文件生成虚拟机

        将实验用到的系统镜像上传到KVM主机的root家目录中。这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2),这个镜像可以直接部署到kvm或openstack的平台中。
        部署虚拟机

[root@kvm01 ~]# cp /opt/CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/store/test02.qcow2
[root@kvm01 ~]# yum -y install libguestfs-tools
[root@kvm01 ~]# virt-customize -a /data_kvm/store/test02.qcow2 --root-password password:aptech
[root@kvm01 ~]# virt-install --name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/store/test02.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd

(4)动态迁移

        在源宿主机kvm上执行迁移命令

[root@kvm01 ~]# virsh edit test02

......
<disk type='file' device='disk'> 
<driver name='qemu' type='qcow2' cache='none'/>         //添加cache='none'		
<source file='/data/kgc/test02.qcow2'/> 
<target dev='vda' bus='virtio'/> 
......

[root@kvm01 ~]# virsh start test02 
[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.10.202/system tcp://192.168.10.202

(5)生成配置文件

        创建虚拟机 test02 配置文件

[root@kvm02 ~]# virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml 

        定义虚拟机 test02 配置文件

[root@kvm02 qemu]# virsh define /etc/libvirt/qemu/test02.xml

3.基于数据块的动态迁移

(1)依赖包安装

        CentOS7默认安装的 qemu-kvm 包是不支持数据块动态迁移的,需要单独安装qemu-kvm-ev。在 kvm01 和 kvm02 两台宿主机中都需要安装 qemu-kvm-ev。安装后重启系统,重启后注意检查防火墙的状态,要处于关闭状态。

(2)迁移前准备工作

       源宿主机 kvm01

[root@kvm01 ~]# vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02

[root@kvm01 ~]# virsh list --all 
[root@kvm01 ~]# virsh shutdown test01

[root@kvm01 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2 

        目标宿主机kvm02

[root@kvm02 ~]# vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02

(3)在 kvm02 主机上检查资源池

[root@kvm02 store]# virsh pool-list --all

(4)在 kvm02 主机上创建同名磁盘文件

[root@kvm02 ~]# mkdir -p /data_kvm/store
[root@kvm02 store]# qemu-img create -f qcow2 /data_kvm/store/test03.qcow2 20G

(5)在 kvm01 主机上执行迁移操作

[root@kvm01 ~]# virsh start test03
[root@kvm01 ~]# virsh migrate test03 qemu+ssh://192.168.10.202/system --live --persistent --undefinesource --copy-storage-all --verbose

  • 25
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值