案例:KVM高级功能部署

2.1案例分析

2.1.1案例概述

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

2.1.2案例前置概念

将虚拟机环境和软件复制到另一物理机继续运行,可优化系统负载、规划布局、简化管理维护。

应用场景

  • 宿主机负载高时迁移部分虚拟机保证服务质量;集中迁移低负载宿主机上的虚拟机节约资源;升级宿主机硬件时迁移虚拟机实现业务不中断;跨地域远程迁移。

1.KVM虚拟机迁移

(1)静态迁移

关闭虚拟机,拷贝磁盘和配置文件到目标宿主机再启动。若磁盘存本地,需拷贝磁盘和配置文件;若存共享存储,仅拷贝配置文件,磁盘文件通过挂载共享存储获取。

(2)动态迁移

保证虚拟机应用正常服务,在不同宿主机间迁移,停机时间短,已打开的应用连接不断开。

  • 基于共享存储的动态迁移:迁移开始后,虚拟机在源宿主机运行,内存页传输到目标宿主机,QEMU/KVM 监控记录内存页修改,传输完所有内存页后,传输修改的内存页,评估传输速度,当剩余内存数据可在设定时间内传输完,关闭源宿主机虚拟机,传输剩余数据,在目标宿主机恢复运行。若虚拟机内存使用大且修改频繁,传输速度跟不上修改速度,则无法使用动态迁移,只能用静态迁移。
  • 基于数据块的动态迁移:用于本地存储虚拟机的在线迁移,源和目标宿主机无需共享存储,仅需以太网连接,迁移环境简单,降低迁移难度。

2.KSM内核同业合并

  • KSM 允许内核在两个或多个进程间共享相同内存页,扫描运行程序内存,合并相同内存页,标识为 “写时复制”,节省内存。若进程修改合并的内存页,为其复制新内存页。
  • 在 QEMU/KVM 中,虚拟机是 QEMU 进程,可实现多个虚拟机间相同内存合并。同一宿主机上运行相同操作系统或应用程序的虚拟机,使用 KSM 效果更显著,能提高内存利用率。
  • KSM 最初为 KVM 虚拟化开发,对非虚拟化系统也有用,可提高宿主机内存使用效率,一般建议开启。但 KSM 需进程检测合并内存页,会使宿主机 CPU 使用量升高,可能带来性能问题,生产环境需适当配置平衡。
  • KSM 节省内存效果与虚拟机操作系统和应用程序有关,相同则效果显著,可节省超 50% 内存;不同则效果不明显,可能不足 5%。使用 KSM 时,需保证交换分区足够大,防止内存过载。

2.1.3案例环境

1.本案例环境

  • 用三台服务器模拟 KVM 虚拟机迁移,网络拓扑为动态迁移,kvm01、kvm02 连接 NFS 共享存储。
  • 案例环境如下表:
主机 操作系统 IP地址 主要软件
kvm01 CentOS 7.3 x86_64 192.168.9.61 Qemu-kvm、libvirt|
kvm02 CentOS 7.3 x86_64 192.168.9.62 Qemu-kvm、libvirt、qemu-kvm-ev
kvmnfs CentOS 7.3 x86_64 192.168.9.63 nfs-utils

2.案例需求

  • 通过静态迁移实现 KVM 虚拟机迁移。
  • 通过基于共享存储的动态迁移方式实现迁移。
  • 通过基于数据块的动态迁移方式实现迁移。
  • 实现 KSM 内存优化。

3.案例实现现思路

  • 拷贝磁盘和配置文件实现静态迁移。
  • 配置 NFS 共享服务实现基于共享存储的动态迁移。
  • 基于数据块实现动态迁移。
  • 针对同类型虚拟机和应用使用 KSM 优化内存。

2.2实例实施

2.2.1动静迁徙

使用源宿主机 kvm01 和目标宿主机 kvm02 完成静态迁移,在 kvm01 上创建虚拟机 test01(数据放本地磁盘),再迁移到 kvm02。

1.在源宿主机上准备虚拟据

(1)创建虚拟机test01

创建虚拟机 test01 的方法既可以参考之前章节使用 virt-manager 图形界面创建虚拟机,也可以在文本模式下使用 virt-install 命令来创建虚拟机。本章使用 virt-install 命令在源宿主机 kvm01 上创建虚拟机 test01,在执行 virt-install 命令之前,需要提前准备 VNC Viewer 软件,其主要作用是在本地 Windows 上连接 KVM 虚拟机,方便管理。

具体操作命令如下:

virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c/data/iso/CentOS-7-x86_64-Minimal-1611.iso --vnc --vncport=5901 --vnclisten=0.0.0.0

virt-install 安装命令各选项的具体作用如下:

  • -n:指定虚拟机的名字。
  • -r:指定内存大小。
  • --vcpus:指定虚拟 CPU 个数。
  • --disk:指定磁盘文件放置位置及大小。
  • -w:指定所使用的网桥。
  • --autostart:设置虚拟机在宿主机开机时启动。
  • -c:指定镜像文件。
  • --vncport:通过 vnc viewer 连接的端口。
  • --vnclisten:通过 vnc viewer 连接的 IP。
(2)配置虚拟机test01可通过console登录

如果在宿主机 kvm01 上想要实现通过 virsh console 命令连接到虚拟机 test01,需要在 test01 虚拟机上进行如下配置:

grubby --update-kernel=ALL --args="console=ttyS0"  # 添加ttyS0终端
reboot
(3)标记虚拟机test01当前IP地址
virsh console test01
Connected to domain test01
Escape character is ^]  # 输入Enter键
ifconfig

从命令执行结果中可以得知,迁移前虚拟机 test01 的 IP 地址是 192.168.9.97。若想从虚拟机 test01 中退出,可以使用 “Ctrl+]” 组合键来实现。

2.提取磁盘和配置文件

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

(1)查看虚拟机test01当前状态
virsh list --all
(2)关闭虚拟机test01
virsh shutdown test01
Domain test01 is being shutdown
(3)导出虚拟机test01的xml配置文件
virsh dumpxml test01 > test01.xml
(4)定位虚拟机test01的磁盘文件
virsh domblklist test01
(5)拷贝配置文件和磁盘文件到目标宿主机KVM02上
scp test01.xml 192.168.9.62:/etc/libvirt/qemu/
scp /data/store/test01.qcow2 192.168.9.62:/data/store/

3.配置和启动目标虚拟机

在目标宿主机 kvm02 上,对拷贝过来的虚拟机 test01 的数据进行重新定义,启动之后验证虚拟机 test01 的 IP 地址信息是否正确。

(1)查看被迁移过来的配置文件和磁盘文件
ls -l /etc/libvirt/qemu
ls -l /data/store/
(2)重新定义虚拟机test01
virsh define /etc/libvirt/qemu/test01.xml
(3)启动虚拟机test0
virsh start test01
Domain test01 started
(4)连接虚拟机test01并验证IP地址信息
virsh console test01
Connected to domain test01
Escape character is ^]  # 输入Enter键进入test01
ifconfig

2.2.2基于共享存储的动态迁移

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

1.配置NFS共享存储

(1)在kvmnfs服务器上面安装NFS服务
yum -y install nfs-utils
(2)配置共享目录
mkdir /data
vim /etc/exports
/data 192.168.9.0/24(rw,sync,no_root_squash)
(3)启动并查看NFS服务
systemctl enable nfs
systemctl enable rpcbind
systemctl start nfs
systemctl start rpcbind
showmount -e localhost

2.挂载NFS目录

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

(1)源宿主机kvm01查看NFS共享目录
showmount -e 192.168.9.63
(2)源宿主机kvm01上创建kgc目录
mkdir /data/kgc
(3)源宿主机kvm01上挂载共享目录
mount -t nfs 192.168.9.63:/data /data/kgc
(4)源宿主机kvm01上设置自动挂载
vim /etc/fstab
192.168.9.63:/data /data/kgc nfs defaults 0 0

3.创建动态迁移的虚拟机

(1)创建虚拟机test02
virsh list --all
virsh domblklist test02
(2)登录虚拟机test02并查看IP地址
virsh console test02
Connected to domain test02
Escape character is ^]  # 输入Enter键
ifconfig

4.动态迁移

(1)查看kvm01,kvm02两台宿主机上虚拟机的运行状态
virsh list --all  # 在kvm01上执行
virsh list --all  # 在kvm02上执行
(2)在源宿主机kvm01上执行迁移命令
virsh migrate --live --verbose test02 qemu+ssh://192.168.9.62/system tcp://192.168.9.62
(3)查看迁移过程是否中断

迁移过程中,ping 命令的结果显示只丢失了一个包,迁移中断的时间可以忽略不计。

(4)查看迁移后虚拟机的状态
virsh list --all  # 在kvm01上执行
virsh list --all  # 在kvm02上执行

5.生成配置文件

(1)创建虚拟机test02配置文件
virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml
(2)定义虚拟机test02配置文件
virsh define /etc/libvirt/qemu/test02.xml

6.验证迁移结果

virsh console test02
Connected to domain test02
Escape character is ^]  # 输入回车
ifconfig

2.2.3基于数据块的动态迁移

1.依赖包安装

CentOS7 默认安装的 qemu-kvm 包是不支持数据块动态迁移的,需要单独安装 qemu-kvm-ev。在 kvm01 和 kvm02 两台宿主机中都需要安装 qemu-kvm-ev。下面以源宿主机 kvm01 为例进行 qemu-kvm-ev 的安装操作演示。

yum -y install centos-release-qemu-ev
yum -y install qemu-kvm-ev

2.迁移前准备工作

(1)源宿主机 kvm01 上的准备
cat /etc/hosts
192.168.9.61 kvm01  # 填写主机名和IP地址的对应关系
virsh list --all
virsh start test01
virsh list --all
(2)目标宿主机 kvm02 上的准备
cat /etc/hosts
192.168.9.61 kvm01
192.168.9.62 kvm02
virsh list --all
virsh undefine test01
cd /data/store/
rm -rf test01.qcow2
virsh list --all

3.检查资源池

virsh pool-list --all

4.创建同名磁盘文件

qemu-img create -f qcow2 /data/store/test01.qcow2 10G

5.执行迁移操作

virsh migrate test01 qemu+ssh://192.168.9.62/system --live --persistent --undefinesource --copy-storage-all --verbose

6.验证迁移操作

virsh list --all  # 在kvm01上执行
virsh list --all  # 在kvm02上执行

2.2.4KSM

当前主流的操作系统大多都支持 KSM,因为 KSM 可以合并相同的内存页,减少虚拟机内存的使用量。这样有利于提高 CPU 的工作效率,加快数据缓存效率,同时可以节省更多的内存空间来缓存额外的磁盘数据。

KSM 适用于宿主机过载的情况下。KSM 通过减少每个虚拟机实际占用的内存数,可以让多个虚拟机分配的内存数量之和大于物理内存数量。而对于相同类型的虚拟机,在物理内存量不变的情况下,可以在一个宿主机中创建更多虚拟机,从而提高虚拟化部署的密度,同时也可以提高物理资源的利用效率。

1.KSM服务介绍

KSM 是在 Linux2.6 内核版本中被添加进去的,目前大多数常用的、主流的 Linux 发行版都默认支持 KSM 技术,执行以下命令即可检查当前 Linux 系统是否支持 KSM:

egrep -i ksm /boot/config-3.10.0-514.el7.x86_64
# 结果为y则表示支持

KSM 服务在 CentOS7 内是以 ksmd 作为守护进程的,针对该服务的一些配置文件,都在目录 “/sys/kernel/mm/ksm” 下。

ls -l /sys/kernel/mm/ksm/

KSM 的常用配置的作用分别如下:

  • max_page_sharing:设置每个 KSM 页面允许的最大共享数量。这个配置设置了重复数据删除限制,以避免虚拟内存 mmap 列表变得太大。max_page_sharing 最小值为 2,因为新创建的 KSM 页面至少有两个共享器。
  • merge_across_nodes:指定是否可以合并来自不同 numa 节点的页面。当设置为 0 时,ksm 只合并物理页面并驻留在同一 numa 节点的内存区域中,可以降低访问共享页面的延迟。
  • pages_to_scan:在 KSM 进程休眠之前会去扫描的内存数量。
  • run:控制 ksmd 进程是否运行,默认值为 0。要激活 ksm 必须设置其值为 1。如果设置为 0,表示停止运行 ksmd,但会保留已经合并的内存页;如果设置为 1,表示马上运行 ksmd 进程;设置为 2 表示停止运行 ksmd,并分离已经合并的所有内存页,但是保留已经注册为合并的内存区域给下一次使用。
  • sleep_millisecs:设置 ksmd 进程休眠的时间(单位:毫秒),即为 ksmd 进程两次运行之间的间隔。
  • stable_node_chains_prune_millisecs:在 stable_node"链" 中链接的整个 stable_node"dups" 列表被周期性地扫描,以删除陈旧的 stable_nodes。该参数的值用于调节重复扫描的时间(单位:毫秒)。

2.配置KSM优化内存

在目标宿主机 kvm02 上,有 test01 和 test02 两台虚拟机。现在通过克隆的方式再创建两台新的虚拟机。然后开启这四台虚拟机,等四台虚拟机都启动后,观察内存使用情况。等内存使用量不再变化后,启动 KSM 服务,过 5 分钟,观察内存使用量的变化情况。

(1)克隆虚拟机

virt-clone -o test02 -n test03 -f /data/store/test03.qcow2
# 类似操作克隆test04

(2)记录开启 KSM 之前内存使用情况

free -m
# 确保虚拟机都启动好后,内存不再变化

(3)启动 KSM 服务
在 CentOS7 系统中,通过 ksm 和 ksmtuned 两个服务来动态调节 KSM 的运行情况,要想保证两个服务的存在,需要 qemu-kvm-common 这个 RPM 包的支持。执行以下命令启动 ksm 和 ksmtuned 这两个服务。

systemctl start ksm
systemctl start ksmtuned

当 ksm 服务启动后,需要检查 /sys/kernel/mm/ksm/run 文件的值是否为 1,若为 0 则 KSM 功能不会生效,需要将其置为 1。

echo 1 > /sys/kernel/mm/ksm/run

(4)对比 KSM 开启之后的内存使用情况

free -m

对比 KSM 开启前后内存的使用情况,“used” 从开始的 2213M 降到了 1491M,说明节约了系统内存。

至此,KVM 虚拟机的各种迁移及 KSM 内存优化已经介绍完成。

你可能感兴趣的:(kvm)