本章案例主要使用之前章节所学的 KVM 及 GlusterFs 技术,结合起来从而实现 KVM 高可用。利用 GlusterFs分布式复制卷,对 KVM 虚拟机文件进行分布存储和冗余。分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或两个以上的节点,当其中一个节点数据丢失或者损坏之后,KVM 仍然能够通过卷组找到另一节点上存储的虚拟机文件,以保证虚拟机正常运行。当节点修复之后,GlusterFs会自动同步同一组卷组里面有数据的节点数据。
GlusterFS 分布式文件系统是由 Gluster 公司的创始人兼首席技术官 Anand BabuPeriasamy 编写。一个可扩展的分布式文件系统,可用于大型的、分布式的、对大量数据进行访问的应用。它可运行于廉价的普通硬件上,并提供容错功能;也可以给大量的用户提供总体性能较高的服务。GlusterFS可以根据存储需求快速调配存储,内含丰富的自动故障转移功能,且摒弃集中元数据服务器的思想。适用于数据密集型任务的可扩展网络文件系统且免费开源。Gluster 于2011 年 10 月7 日被 Red Hat 收购。
主机 |
操作系统 |
主机名/IP地址 |
主要软件及版本 |
服务器 |
CentOS7.9 |
node1/192.168.10.101 |
GlusterFS 3.10.2 |
服务器 |
CentOS7.9 |
node2/192.168.10.102 |
GlusterFS 3.10.2 |
服务器 |
CentoS7.9 |
node3/192.168.10.103 |
GlusterFS 3.10.2 |
服务器 |
CentoS7.9 |
node4/192.168.10.104 |
GlusterFS 3.10.2 |
服务器 |
CentoS7.9 |
kvm/192.168.10.201 |
KVMGluster-client |
服务器 |
CentoS7.9 |
kvm/192.168.10.202 |
KVMGluster-client |
(1)部署 GlusterFS 文件系统
(2)实现 KVM 虚拟主机不会因宿主机宕机而宕机
(1)安装 KVM。
(2)所有节点部署 GlusterFS。
(3)客户端挂载 GlusterFS
(4)KVM 使用挂载的 GlusterFS 目录创建虚拟机。
步骤略
在所有节点上执行如下命令:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
[root@node1 ~]# cat< /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.201 kvm01
192.168.10.202 kvm02
EOF
注意:先设置阿里yum仓库
[root@node1 ~]# yum -y install centos-release-gluster
[root@node1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
在所有节点Gluster执行以下操作
[root@node1 ~]# systemctl start glusterd.service && systemctl enable glusterd.service
[root@node1 ~]# gluster peer probe node2
peer probe: success.
[root@node1 ~]# gluster peer probe node3
peer probe: success.
[root@node1 ~]# gluster peer probe node4
peer probe: success.
[root@node1 ~]# gluster peer status
在所有节点创建/data 目录
[root@node1 ~]# mkdir /data
创建分布式复制卷。
[root@node1 ~]# gluster volume create models replica 2 node1:/data node2:/data node3:/data node4:/data force
查看 models 卷
[root@node1 ~]# gluster volume info models
启动 models 卷
[root@node1 ~]# gluster volume start models
[root@kvm01 ~]# yum -y install glusterfs glusterfs-fuse
[root@kvm01 ~]# mkdir /kvmdata
[root@kvm01 ~]# mount -t glusterfs node1:models /kvmdata/
[root@localhost ~]# vi /etc/fstab
node1:models /kvmdata glusterfs defaults,_netdev 0 0
[root@kvm01 ~]# df -h
将实验用到的系统镜像上传到KVM主机的root家目录中。这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2),这个镜像可以直接部署到kvm或openstack的平台中。
[root@kvm01 ~]# cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /kvmdata/test01.qcow2
[root@kvm01 ~]# yum -y install libguestfs-tools
[root@kvm01 ~]# gpasswd -a qemu root
备注:
该工具提供了virt的高级命令,其中有一个virt-customize命令,可以为系统镜像设置密码。
[root@kvm01 ~]# virt-customize -a /kvmdata/test01.qcow2 --root-password password:aptech
[root@kvm01 ~]# virt-install --name=test01 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/kvmdata/test01.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd
备注:
--disk:指定存储设备及其属性
device:设备类型,如cdrom、disk或floppy等,默认为disk;
bus:磁盘总线类型,其值可以为ide、scsi、usb、virtio或xen
--virt-type:使用的hypervisor(虚拟机监视器),如kvm、qemu、xen等
--boot cdrom,hd,network:指定引导次序;
[root@kvm01 ~]# ssh-keygen -t rsa
[root@kvm01 ~]# ssh-copy-id kvm02
[root@kvm01 ~]# ssh-copy-id kvm01
[root@kvm02 ~]# ssh-keygen -t rsa
[root@kvm02 ~]# ssh-copy-id kvm01
[root@kvm02 ~]# ssh-copy-id kvm02
[root@kvm01 ~]# virsh migrate --persistent --undefinesource test01 qemu+ssh://kvm02/system
[root@kvm01 ~]# virsh list --all
备注:
迁移成功后,在kvm01主机就没有了test01的资源
[root@kvm01 ~]# virsh --connect=qemu+ssh://kvm02/system list
Id 名称 状态
----------------------------------------------------
1 test01 running
[root@kvm01 ~]# virsh --connect=qemu+ssh://kvm02/system migrate --persistent --undefinesource test01 qemu+ssh://kvm01/system
[root@kvm01 ~]# mkdir /kvmdata/config
[root@kvm01 ~]# cp /etc/libvirt/qemu/test01.xml /kvmdata/config/
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# virsh undefine test01
[root@kvm01 ~]# virsh list --all
[root@kvm02 ~]# virsh define /kvmdata/config/test01.xml
[root@kvm01 ~]# virsh start test01
域 test01 已开始
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
6 test01 running
设置好阿里的基础源和epel扩展源
[root@kvm01 ~]# yum -y install pcs pacemaker fence-agents-all
备注:
[root@kvm01 ~]# passwd hacluster
备注:
两台kvm主机的密码要一致(本案例设置的是aptech)
[root@kvm01 ~]# systemctl start pcsd
[root@kvm01 ~]# systemctl enable pcsd
[root@kvm01 ~]# pcs cluster auth kvm01 kvm02 -u hacluster -p aptech
[root@kvm01 ~]# pcs cluster setup --name cluster-kvm kvm01 kvm02
[root@kvm01 ~]# pcs cluster start --all
[root@kvm01 ~]# pcs cluster enable --all
备注:
enable:将群集设置为开机自启
[root@kvm01 ~]# pcs status
[root@kvm01 ~]# pcs cluster stop kvm01
在另一个节点查看状态
[root@kvm02 ~]# pcs status
Online: [ kvm02 ]
OFFLINE: [ kvm01 ]
[root@kvm01 ~]# pcs cluster start kvm01
pcs property set stonith-enabled=false
备注:
测试环境用的 VMware的环境,没有隔离设备,必须要关闭,否则无法实现高可用
[root@kvm01 ~]# pcs resource create test01 VirtualDomain hypervisor="qemu:///system" config="/kvmdata/config/test01.xml" migration_transport=ssh meta allow-migrate="true"
备注
meta allow-migrate="true" :允许迁移模式
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
WARNINGS:
No stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: kvm02 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 19:55:48 2022
Last change: Wed Aug 31 19:55:43 2022 by root via cibadmin on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm01
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
6 test01 running
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
注意:此时虚拟机在kvm01
清除某个 pcs 资源只能在某个主机上运行的限制
[root@kvm01 ~]# pcs resource clear test01
[root@kvm01 ~]# pcs constraint ##查询限制情况,如下显示结果为无限制
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:
备注:
如果冒号后没有任何信息,表示没有约束,如果有约束会有警告提示
constraint(限制)
当把虚拟机迁移到了另一台主机,会出现约束,要想将虚拟机迁移回来,需要先清除约束
[root@kvm01 ~]# pcs resource move test01
备注:
会自动选择其他节点进行迁移
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
Stack: corosync
Current DC: kvm01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 21:54:15 2022
Last change: Wed Aug 31 21:52:31 2022 by root via crm_resource on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm02
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test01 running
备注:
迁移后,test01运行在kvm02上
注意:
如果kvm01上对test01有约束,需要在kvm01上清除约束,才能将test01迁移回来
pcs resource clear test01
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
Stack: corosync
Current DC: kvm01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 21:56:26 2022
Last change: Wed Aug 31 21:52:31 2022 by root via crm_resource on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 ]
OFFLINE: [ kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm01
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
5 test01 running