KVM高级功能部署
一、理论
当KVM虚拟机数量的不断增多,会导致个别服务器出现资源过载现象,这时候需要使用KVM虚拟机迁移技术,将KVM虚拟机迁移到负载相对较低的服务器上。
迁移
静态迁移:
无共享存储,将虚拟机关机,上传到另一台服务器,手动开启虚拟机。(上传xml配置文件以及qcow2文件)。
有共享存储,将虚拟机关机,只上传xml配置文件,手动开启虚拟机。(只需上传xml配置文件)。
动态迁移:
数据块迁移,无共享存储,创建虚拟机存储池,来生成qcow2文件(必须与源机上的虚拟机qcow2文件名称相同),接着进行迁移,无需手动开启虚拟机,迁移过来就是运行中的。(这种方式需要手动dumpxml出来虚拟机的xml文件)
动态迁移,有共享存储,直接迁移,无需创建qcow2文件。迁移过来的虚拟机是运行中的。(这种方式需要手动dumpxml出来虚拟机的xml文件)
KSM(kernel samepage merging,内核同页合并)。它允许内核在两个或多个进程之间共享完全相同的内存页。以此来减少内存的占用。
二、实践
静态迁移环境
kvm01 192.168.10.101
kvm02 192.168.10.102动态迁移环境
kvm01 192.168.10.101
kvm02 192.168.10.102
nfs 192.168.10.103[root@kvm01 ~]# 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-Minimal-1810.iso --vnc --vncport=5901 --vnclisten=0.0.0.0 注:-n 指定虚拟机名字-r 指定内存 单位:MB--vcpus 指定虚拟机的核心数--disk path 指定虚拟机的size=10 指定磁盘大小,单位:GB-w 指定网络,,模式:网络接口--virt-type=kvm 指定虚拟机类型--accelerate 使用虚拟主机的内核为虚拟机加速--autostart 虚拟主机的启动后,虚拟机自动启动。-c 指定系统镜像位置--vnc 开启vnc--vncport 指定vnc监听端口--vnclisten 指定vnc监听地址windows上用vnc连接kvm01主机的ip及5901端口,开始安装。静态迁移
101
[root@kvm01 ~]# virsh dumpxml test01 > test01.xml
[root@kvm01 ~]# ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg test01.xml
[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------2 test01 运行[root@kvm01 ~]# virsh shutdown test01
域 'test01' 正在关闭[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------- test01 关闭102
[root@kvm02 ~]# mkdir -p /data_kvm/store101
[root@kvm01 ~]# scp test01.xml 192.168.10.102:/etc/libvirt/qemu/
The authenticity of host '192.168.10.102 (192.168.10.102)' can't be established.
ED25519 key fingerprint is SHA256:1IgAipGRNMnh+y4oUVED3caGGTMKfa2UdT/DdnDw4XI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.102' (ED25519) to the list of known hosts.Authorized users only. All activities may be monitored and reported.
root@192.168.10.102's password:
test01.xml 100% 8523 1.6MB/s 00:00[root@kvm01 ~]# scp /data_kvm/store/test01.qcow2 192.168.10.102:/data_kvm/store/
Authorized users only. All activities may be monitored and reported.
root@192.168.10.102's password:
test01.qcow2 100% 10GB 57.9MB/s 02:56 102
[root@kvm02 ~]# virsh list --allId 名称 状态
---------------------- test01 关闭[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
从 test01 定义的域 '/etc/libvirt/qemu/test01.xml'[root@kvm02 ~]# virsh list --allId 名称 状态
---------------------- test01 关闭[root@kvm02 ~]# virsh start test01
域 'test01' 已启动迁移完成,101和102的test01是完全相同的,只能在一台机器上跑,除非在不同的局域网。共享存储静态迁移
103 nfs
[root@bogon ~]# mkdir /data
[root@bogon ~]# chmod -R 777 /data/
[root@bogon ~]# vim /etc/exports
/data 192.168.10.0/24(rw,sync,no_root_squash)[root@bogon ~]# systemctl start nfs
[root@bogon ~]# systemctl start rpcbind101、102
[root@kvm01 ~]# mkdir /data_kvm/kgc
[root@kvm01 ~]# mount 192.168.10.103:/data /data_kvm/kgc/
[root@kvm01 ~]# mount
192.168.10.103:/data on /data_kvm/kgc type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.101,local_lock=none,addr=192.168.10.103)101
[root@kvm01 opt]# cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/kgc/test02.qcow2[root@kvm01 ~]# yum install /usr/bin/virt-customize[root@kvm01 ~]# virt-customize -a /data_kvm/kgc/test02.qcow2 --root-password password:aptech # 为root用户设置密码,否则无法登录系统。
[ 0.0] Examining the guest ...
[ 38.9] Setting a random seed
[ 39.0] Setting passwords
[ 45.0] SELinux relabelling
[ 76.5] Finishing off[root@kvm01 ~]# virt-install --name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/kgc/test02.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd --osinfo detect=on,require=off
WARNING Using --osinfo generic, VM performance may suffer. Specify an accurate OS for optimal results.
WARNING 无法连接到图形控制台:没有安装 virt-viewer。请安装 'virt-viewer' 软件包。
WARNING 没有控制台用于启动客户机,默认为 --wait -1开始安装......
创建域...... | 0 B 00:00:00 域仍在运行。安装可能正在进行中。
请等待安装完成。
^C域安装已被中断。
根据用户要求取消安装# 因为该镜像是已安装好的,这里无需安装。但是,必须等“创建域”出来才能取消,否则,停止虚拟机后,虚拟机会直接消失(去查看xml文件也是没有的)。[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------1 test02 运行- test01 关闭[root@kvm01 ~]# virsh dumpxml test02 > test02.xml[root@kvm01 ~]# scp test02.xml 192.168.10.102:/etc/libvirt/qemu/Authorized users only. All activities may be monitored and reported.
root@192.168.10.102's password:
test02.xml 100% 3988 607.8KB/s 00:00
[root@kvm01 ~]# virsh destroy test02
域 'test02' 已销毁102
[root@kvm02 ~]# virsh list --allId 名称 状态
---------------------1 test01 运行[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test02.xml
从 test02 定义的域 '/etc/libvirt/qemu/test02.xml'[root@kvm02 ~]# virsh start test02
域 'test02' 已启动[root@kvm02 ~]# virsh list --allId 名称 状态
---------------------1 test01 运行2 test02 运行# 这里的test02也不能在101上启动,否则会启动失败,因为它们的mac地址一样,ip地址还是同一局域网的,开启后会冲突。共享存储动态迁移
101
[root@kvm01 ~]# virt-clone -o test01 -n test03 -f /data_kvm/kgc/test03.qcow2
WARNING 设置图形设备端口为自动端口,以避免相互冲突。
正在分配 'test03.qcow2' 3% [- ] 0 B/s | 385 MB --:--:-- 正在分配 'test03.qcow2' 7% [= ] 154 MB/s | 732 MB 00:01:01 正在分配 'test03.qcow2' 9% [=- ] 181 MB/s | 1.0 GB 00:00:50 正在分配 'test03.qcow2' 12% [=- ] 194 MB/s | 1.2 GB 00:00:46 正在分配 'test03.qcow2' | 1.2 GB 00:00:04 ... 成功克隆 'test03'。[root@kvm01 qemu]# virsh start test03
域 'test03' 已启动[root@kvm01 qemu]# virsh list --allId 名称 状态
---------------------3 test03 运行- test01 关闭- test02 关闭[root@kvm01 kgc]# virsh migrate --live --verbose test04 qemu+ssh://192.168.10.102/system tcp://192.168.10.102
root@192.168.10.102's password:
迁移: [100.00 %]注:qemu+ssh://192.168.10.102/system
qemu+ssh 是连接协议,通过ssh通道连接目标主机的qemu虚拟化服务,ssh用于身份验证和命令执行,确保安全访问。
192.168.10.102 目标主机的ip地址。/system 这是libvirt的连接点(url路径部分),表示连接到目标主机的系统级虚拟化服务。
在libvirt中,/system对应系统服务(通常由libvirtd守护进程管理),可操作所有虚拟机。
与之对应的是/session,表示用户会话级服务,权限受限,只能管理当前用户启动的虚拟机。虚拟机迁移需要root权限或等效权限,因此必须连接到系统服务(/system)102 # 迁移过来后,发现虚拟机还是开启状态。
[root@kvm02 ~]#
[root@kvm02 ~]# virsh list --allId 名称 状态
---------------------1 test01 运行4 test03 运行- test02 关闭# 发现没有test03的配置文件,因为是基于共享存储的动态迁移。
[root@kvm02 ~]# ls /etc/libvirt/qemu
autostart networks test01.xml test02.xml# 手动生成,生成后就可以随意启动与关机。
[root@kvm02 qemu]# virsh dumpxml test03 > test03.xml
[root@kvm02 qemu]# ls
autostart networks test01.xml test02.xml test03.xml基于数据块的迁移
101、102
[root@kvm01 ~]# vim /etc/hosts
192.168.10.101 kvm01
192.168.10.102 kvm02101[root@kvm01 ~]# virt-clone -o test01 -n test05 -f /data_kvm/store/test05.qcow2
WARNING 设置图形设备端口为自动端口,以避免相互冲突。
正在分配 'test05.qcow2' 4% [- ] 0 B/s | 477 MB --:--:-- 正在分配 'test05.qcow2' 7% [= ] 135 MB/s | 782 MB 00:01:09 正在分配 'test05.qcow2' 9% [=- ] 153 MB/s | 1.0 GB 00:01:00 正在分配 'test05.qcow2' 12% [=- ] 171 MB/s | 1.2 GB 00:00:52 正在分配 'test05.qcow2' | 1.2 GB 00:00:04 ... 成功克隆 'test05'。[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------4 test03 运行- test01 关闭- test02 关闭- test04 关闭[root@kvm01 ~]# virsh pool-list --all名称 状态 自动开始
----------------------------default 活动 是kgc 活动 是opt 活动 是store 活动 是102
[root@kvm02 ~]# virsh pool-list --all名称 状态 自动开始
-------------------------[root@kvm02 /]# qemu-img create -f qcow2 /data_kvm/store/test05.qcow2 10G
Formatting '/data_kvm/store/test05.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10737418240 lazy_refcounts=off refcount_bits=16 cache=writeback[root@kvm02 /]# ls /data_kvm/store/
test01.qcow2 test05.qcow2这里可以ll查看test05.qcow2的大小,占用空间较小。101
[root@kvm01 ~]# virsh start test05
域 'test05' 已启动[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------6 test05 运行102
[root@kvm02 /]# virsh list --allId 名称 状态
---------------------1 test01 运行4 test04 运行- test02 关闭101
[root@kvm01 ~]# virsh migrate test05 qemu+ssh://192.168.10.102/system --live --persistent --undefinesource --copy-storage-all --verbose
root@192.168.10.102's password:
迁移: [100.00 %]
[root@kvm01 ~]# virsh list --allId 名称 状态
---------------------- test01 关闭- test02 关闭- test03 关闭- test04 关闭102
[root@kvm02 /]# virsh list --allId 名称 状态
---------------------1 test01 运行4 test04 运行5 test05 运行- test02 关闭此时再查看test05.qcow2的大小,发现变大了许多。
[root@kvm02 /]# ll /data_kvm/store/
总计 11918932
-rw-------. 1 qemu qemu 10739318784 6月16日 14:14 test01.qcow2
-rw-r--r--. 1 qemu qemu 1465712640 6月16日 14:20 test05.qcow2KSM
[root@kvm01 ~]# virt-clone -o test01 -n test06 -f /data_kvm/store/test06.qcow2
成功克隆 'test06'。[root@kvm01 ~]# virt-clone -o test01 -n test07 -f /data_kvm/store/test07.qcow2
成功克隆 'test07'。[root@kvm01 ~]# virt-clone -o test01 -n test08 -f /data_kvm/store/test08.qcow2
成功克隆 'test08'。[root@kvm01 ~]# virsh start test06
域 'test06' 已启动[root@kvm01 ~]# virsh start test07
域 'test07' 已启动[root@kvm01 ~]# virsh start test08
域 'test08' 已启动[root@kvm01 ~]# free -htotal used free shared buff/cache available
Mem: 3.3Gi 1.6Gi 245Mi 15Mi 1.7Gi 1.7Gi
Swap: 4.0Gi 269Mi 3.7Gi[root@kvm01 ~]# echo 1 > /sys/kernel/mm/ksm/run[root@kvm01 ~]# reboot#重新开启test6、7、8,观察内存[root@kvm01 ~]# free -htotal used free shared buff/cache available
Mem: 3.3Gi 1.4Gi 1.2Gi 13Mi 977Mi 1.9Gi
Swap: 4.0Gi 0B 4.0Gi注:这里内存并没有节省,原来是1.6G,稳定后变为了1.7G,KSM未被启用,这里是假装成功了,成功的效果就是这样,节省一些内存。