没有共享存储情况下实现KVM虚拟机高可用
1 概述
本文介绍如何在没有共享存储的情况下,通过DRBD和HAE对虚拟机实例进行保护,此实例在切换后仍然保留最新的磁盘数据。
本文适用于已有SUSE Linux Enterprise Server 15 SP1安装基础的技术人员。
本文由SUSE高级解决方案架构师萨柱发提供。
1.1 业务场景
1.1.1 业务需求
以SES6部署为例,Admin node承担了Salt-master角色,并且保存了ceph集群的相关配置结构参数,在生产上建议是HA部署:
如图,部署需要SAN交换机和共享存储,这个跟SES的项目要求是相矛盾的,因为SES项目的目标通常是“去集中存储”。
1.1.2 实践方案
实验中,如下图,通过DRBD结合KVM,对Admin-node进行保护,在不增加额外成本的情况下,达到生产环境要求。
如图:NODE-1和NODE-2是两个物理机,在内部存储(HDD)上划分一个(或多个)分区作为DRBD的后端块设备,KVM虚拟机使用此后端设备作为存储空间运行,KVM虚拟机作为HA资源与DRBD的M/S状态协同工作。
1.2 系统需求
1.2.1 基础设施需求
建议安装环境中有NTP时间基准,用于节点操作系统的时间统一。
1.2.2 硬件需求
对于测试环境,以上服务器的要求的配置如下:
- CPU : Node: 4c, VM:2c
- 内存: Node: 4G, VM:2G
- 根盘: P1: 30G, P2:24G (预留空间)
- 网卡: Node:2NICs, VM:1NIC
两个网卡可以在同一个网络,但建议分开在不同的子网。
1.2.3 软件介质需求
请准备以下安装介质:
- SLE-15-SP1-Installer-DVD-x86_64-QU1-DVD1.iso
- SLE-15-SP1-Packages-x86_64-QU1-DVD1.iso
QU1是季度更新,未来可能是QU2/QU3等,均可。
1.3 安装规划
1.3.1 结构和拓扑图
1.3.2 网络结构
1.3.3 主机IP列表
主 机 | 集群网络地址 | 网络地址名字 | 备 注 |
NODE-1 | 10.20.30.71/24 | N/A | |
192.168.98.71/24 | node-1 | 外部地址,一般与主机名相同 | |
NODE-2 | 10.20.30.72/24 | N/A | |
192.168.98.72/24 | node-2 | 外部地址,一般与主机名相同 | |
ha-vip | 192.168.98.70/24 | N/A | 可选 |
HA-VM | 192.168.98.170 | ses-adm |
注意:node-1/2是物理机,有两个NIC, ha-vip是集群资源,HA-VM是虚拟机。
2. 安装过程
主要步骤如下:
- Node1/Node2上安装SLES 15 SP1操作系统
- 激活系统,或者添加光盘介质仓库
- 安装kvm相关工具和HAE相关组件
- 创建虚拟机
2.1 安装SLES到NODE主机
按照一般SLES安装方法 ,使用iso或者U盘介质启动安装程序,并选择”SUSE Linux Enterprise Server 15 SP1”产品,并完成最小化系统安装。
提示注册时,请暂时跳过,网络配置可暂时跳过,详细过程略。
安装完成后,把前面提及的两个iso文件复制到NODE主机的/opt目录中。
注意 :安装时请注意保留最少24G磁盘空间不要使用,请参考后续DRBD部分。
2.2 系统注册和激活软件模块
注:在产品环境中强烈建议注册到SCC并更新全部系统补丁,如果是试验环境,此环节可选,可直接跳过。
运行以下命令进行系统注册(产品激活),然后更新整个系统:
shell # SUSEConnect -r <您的SES产品注册码>
shell # zypper –n up
说明:运行完会提示重启,可以暂时不理会。
运行以下命令,激活HAE产品模块:
shell # SUSEConnect -p sle-ha/15.1/x86_64 –r <您的SES产品注册码>
注意:SES产品许可中,已包含HAE产品功能,可以激活HAE软件模块。
2.3 使用光盘上的软件仓库
注:当跳过系统注册时,可以配置使用光盘软件仓库,此法适合试验环境。
把Packages.iso文件复制到/opt目录中,然后运行以下命令配置软件仓库:
shell # zypper ar iso:/Product-SLES?iso=/opt/Packages.iso \
SLE-Prod-SLES-Pool
shell # zypper ar iso:/Module-Basesystem?iso=/opt/Packages.iso \
SLE-Mod-Basesystem-Pool
shell # zypper ar iso:/Module-Server-Applications?iso=/opt/Packages.iso \
SLE-Mod-ServerApp-Pool
shell # zypper ar iso:/Product-HA?iso=/opt/Packages.iso \
SLE-Prod-HA-Pool
注意:上面配置了4个软件仓库,请注意路径和名称不要写错。
2.4 安装软件包
运行以下命令安装本文档需要的软件包:
shell # zypper –n in –t pattern kvm_server kvm_tools
shell # zypper –n in –t ha_sles
说明:第一个命令安装kvm虚拟机相关,第二个命令安装HAE相关,也可以两个命令合并在一起运行。
运行以下命令安装必要的工具:
shell # zypper –n in vim
或者
shell # zypper –n in –t pattern yast2_basis
说明:两条命令分别对应命令行编辑器和yast2工具集,可根据自己的技能喜好,选择其中一种方法进行存储配置,安装对应工具。
2.5 通过图形工具安装
如果您是在图形界面(或使用yast工具),请运行: yast2 sw_single 或者 “YaST Control Center” 工具,选择其中的“软件管理”或”Software Management”,然后在左边的视图切换到”Pattern”显示模式,勾选”kvm_server kvm_tools ha_sles”。
3. 配置过程
主要包括以下步骤:
- Node节点系统的网络配置
- HAE集群服务配置
- DRBD复制配置
- HAE+DRBD联动配置
- VM实例的系统安装
- VM实例作为HAE集群资源的配置
3.1 Node节点网络配置
在只有一块网卡的情况下,
配置文件或命令 | Node-1 | Node-2 |
修改主机名 | hostnamectl set-hostname node-1 | hostnamectl set-hostname node-2 |
/etc/hosts | 192.168.98.71 node-1.suse.lab node-1
192.168.98.72 node-2.suse.lab node-2 |
|
/etc/sysconfig
/network/ ifcfg-br0 |
BRIDGE=’yes’
BRIDGE_PORTS=’eth0′ BOOTPROTO=’static’ IPADDR=’192.168.98.71/24′ STARTMODE=’auto’ |
BRIDGE=’yes’
BRIDGE_PORTS=’eth0′ BOOTPROTO=’static’ IPADDR=’192.168.98.72/24′ STARTMODE=’auto’ |
ifroute-br0 | default 192.168.98.1 – – | |
ifcfg-eth0 | BOOTPROTO=’none’ | |
ifcfg-eth1 | BOOTPROTO=’static’
IPADDR=’10.20.30.71/24′ STARTMODE=’auto’ |
BOOTPROTO=’static’
IPADDR=’10.20.30.72/24′ STARTMODE=’auto’ |
请按以上表格配置双机NODE节点的配置文件;
然后使用root用户运行以下命令,启动网络并验证:
shell # rcnetwork restart
shell # ping –c 3 192.168.98.71
shell # ping –c 3 10.20.30.71
shell # ping –c 3 node-1.suse.lab
请酌情调整上述命令参数进行网络连通性验证。
3.2 HAE集群服务配置
注意,以下配置截图的主机名以及IP地址请以您的实际环境为准!
3.2.1 配置时间同步
此步骤可选,但在生产环境中强烈建立,如果在测试环境中,请手工做基本对时。
运行以下命令:
shell # yast2 ntp-client
请按照实际情况填写时间服务器地址(或域名)。
3.2.2 初始化集群
运行下命令:
shell # ha-cluster-init -u
…
回答问题:
Do you wish to use SBD (y/n)? n
回答问题:
Do you wish to configure a virtual IP address (y/n)? y
Virtual IP [] 192.168.98.46
说明: -u参数用于指定单播方式,提高兼容性和加快初始化速度。
执行结果如下图:
运行以下命令检测集群状态:
shell # crm status
结果可以观察到集群已经成功启动(当前节点,且只有一个)。
集群创建成功后,可通过http://IP:7630/ 登录Hawk服务,使用浏览器对集群进行配置管理,登录用户名是hacluster, 默认密码是linux。
安全提示: 请务必修改hacluster用户的密码,避免以后出现安全方面的事故。
3.2.3 加入其它节点
在候补节点上,运行以下命令:
shell # ha-cluster-join -c ha-node01
注意回答问题
说明: -c 参数指定集群现存节点。
执行结果如下图:
运行以下命令检测集群状态:
shell # crm status
结果可以观察到集群已经成功增加了节点。
如下图:
安全提示: 集群在处理节点增加时,需要为每个节点的root用户生成ssh的公钥登录, 因此在默认情况下,需要root用户可使用密码登录才能完成节点增加操作,如果在配置前实施过安全加固,请注意处理root用户互认证的情况。
3.3 DRBD复制配置
请接下来,我们准备把NODE节点中的空闲磁盘空间划为一个分区(两个节点的分区大小完全相同),然后在两个NODE节点之间进行此分区的DRBD复制。
3.3.1 磁盘分区
请使用fdisk工具,或者yast工具为空闲的磁盘空间创建分区,结果如下:
shell # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:1 0 2G 0 part [SWAP]
├─sda3 8:1 0 30G 0 part /
└─sda4 8:2 0 24G 0 part
说明:sda4即是准备配置为DRBD复制的块设备
(注意:块设备可以是分区partition,也可以是逻辑卷lv,视乎实际环境需要)
3.3.2 DRBD配置文件
DRBD配置文件的默认位置在/etc/drbd.conf, 其中默认内容包含了/etc/drbd.d/中的两类文件:
- 全局配置 (global_common.conf)
- 资源配置 (*.res), 最佳实践是为每个资源部署一个资源文件。
这里(在node-1主机上操作)调整两个配置文件(1个全局文件和1个资源文件),配置内容如下:
配置文件 | 内容 |
global_common.conf | common {
startup { degr-wfc-timeout 90; wfc-timeout 100; } options { quorum off; } net { cram-hmac-alg “sha1”; shared-secret “Abcd1234Password” protocol C; } } |
res0.res | resource res0 {
connection-mesh { hosts node-1 node-2; } on node-1 { node-id 0; address 10.20.30.71:7788; } on node-2 { node-id 1; address 10.20.30.72:7788; } device /dev/drbd0 disk /dev/sda4 meta-disk internal; } |
红色字体的内容,请根据实际情况修改。
检查配置文件: /etc/drbd.d/global_common.conf 和 /etc/drbd.d/res0.res, 使用使用 “drbdadm dump all” 命令检查语法错误, 并确认内容无误,在node-1节点上,运行以下命令同步配置文件:
shell # csync2 -xv /etc/drbd/
注: 如果没有csync2命令,也可以采取其它方法手工同步。
3.3.3 DRBD设备初始化
运行以下命令 之一和/或组合 进行初始化:
shell # drbdadm create-md res0 #创建元数据
shell # drbdadm up res0 #启动资源
shell # drbdadm –clear-bitmap new-current-uuid res0 #新设备可以快速完成初始化同步
启动后,可在 /dev/drbd/by-res/目录中查找与配置文件中对应的块设备资源,以及对应的/dev/drbd0设备。
3.3.4 启动DRBD复制
在两个节点上,分别运行以下命令启动DRBD服务:
shell(node1) # rcdrbd start
shell(node2) # rcdrbd start
shell(node1) # drbdadm primary –force res0
在node1上,让res0资源成为“主用”(primary), res0资源成为可读写状态。
3.3.5 检查DRBD复制状态
在node-1节点上,运行以下命令:
shell # drbdadm status
输出:
res0 role:Primary #本端Role
disk:UpToDate #本端磁盘状态
PEER-NODE role:Secondary #对端Role
peer-disk:UpToDate #对端磁盘状态
注:UpToDate是正常状态。
3.4 配置HAE管理DRBD
HAE使用pacemaker作为集群资源管理器,DRBD资源被其ResourceAgent进行管理,因此系统中的DRBD服务不能自动启动,必须保持开机禁用状态:
shell(node1) # systemctl disable –now drbd.service
shell(node2) # systemctl disable –now drbd.service
3.4.1 DRBD全局配置变更
DRBD需要报告资源状态,通知集群正确地标记DRBD资源状态。 请修改配置文件,增加如下参数:
shell # cat /etc/drbd.d/global_common.conf
…
common {
handlers {
fence-peer “/usr/lib/drbd/crm-fence-peer.9.sh”;
after-resync-target “/usr/lib/drbd/crm-unfence-peer.9.sh”;
}
net {
fencing resource-only;
}
}
…
3.4.2 集群的DRBD-RA配置
DRBD在整合HAE时,需要一个基元(DRBD资源名为“res0”)和一个MS多状态资源, 配置示例如下:
primitive rsc_drbd_res0 ocf:linbit:drbd \
params drbd_resource=res0 \
op monitor interval=21 timeout=20 role=Master \
op monitor interval=22 timeout=21 role=Slave
ms ms_drbd_res0 rsc_drbd_res0 \
meta master-max=1 master-node-max=1 \
clone-max=2 clone-node-max=1 \
notify=true target-role=Started
3.5 安装虚拟机操作系统
完成DRBD配置完成后,primary一侧的drbd0设备可以读写,所以在primary节点上进行安装操作。
启动虚拟机安装前,先设置libvirtd服务:
shell(node1) # systemctl enable –now libvirtd.service
shell(node2) # systemctl enable –now libvirtd.service
3.5.1 启动虚拟机安装
在drbd的primary节点,运行以下命令:
shell(node1) # virt-install \
–name sesadm \
–os-variant sle15sp1 \
–vcpus 4 –memory 2048 \
–virt-type kvm \
–disk /dev/drbd0 \
–network bridge=br0 \
–extra-args=”console=ttyS0 textmode=1″ \
–graphics none \
–location /opt/SLE-15-SP1-Installer-DVD-x86_64-QU1-DVD1.iso
3.5.2 虚拟机安装过程
安装程序将以文本方式启动, 依照文本YaST工具使用方法(TAB/SPACE/RETURN三键切换)交互操作安装过程,重要的设置如下:
(上图)1.安装程序开始
(上图)2.系统设置
(上图)3.GRUB2设置
最后选择 [Install] 开始安装过程.
注意:由于使用了–graphics none , 务必在GRUB2设置中, 禁用图形终端。
3.6 配置HAE管理虚拟机资源
前面的步骤中,安装好虚拟机后,虚拟机描述文件已经创建。
3.6.1 准备虚拟机资源文件目录
要创建指定的目录,在两个节点上,分别运行以下命令:
shell(node1) # mkdir /etc/havm
shell(node2) # mkdir /etc/havm
3.6.2 管理虚拟机描述文件
在安装虚拟机的节点上,运行以下命令:
shell # virsh list
Id Name State
——————————
1 sesadm running
shell # virsh destroy –domain sesadm
shell # virsh dumpxml –domain sesadm > /etc/havm/sesadm.xml
shell # virsh undefine –domain sesadm
编辑/etc/csync2/csync2.cfg 文件,增加以下内容:
shell # cat /etc/csync2/csync2.cfg
…
include /etc/havm;
}
然后同步两个节点的虚拟机描述文件,运行以下命令:
shell # csync2 -xv
…
Finished with 0 errors. # 此结果表示结果正常
此时在另一个节点的/etc/havm/目录中,可以找到sesadm.xml文件。
3.6.3 配置虚拟机RA配置
配置一个虚拟机基元,一个drbd和kvm的共置约束,一个先drbd后kvm的顺序约束,如下:
primitive rsc_kvm_sesadm ocf:heartbeat:VirtualDomain \
params config=”/etc/havm/sesadm.xml” \
op monitor timeout=30 interval=10 \
op stop timeout=360s interval=0 \
op start timeout=120s interval=0 \
meta target-role=Started
colocation kvm_sesadm_on_drbd inf: rsc_kvm_sesadm ms_drbd_res0:Master
order drbd_before_kvm inf: ms_drbd_res0:promote rsc_kvm_sesadm:start
4 运行和管理
4.1 运行状态
命令和输出结果请参看下图:
注意:资源名可能略有不同,请区分清楚。
4.2 简单资源管理
SUMA支持多种客户端管理方式(无代理/常规代理/Salt代理),下面以常规代理为例,进行客户管理。
停止虚拟机,运行以下命令:
shell # crm resource stop rsc_kvm_sesadm
迁移虚拟机到另一个节点,运行以下命令:
shell # crm resource move rsc_kvm_sesadm force
shell # crm resource unmove rsc_kvm_sesadm
进入虚拟机的控制台,运行以下命令:
shell # virsh console –domain sesadm
5 其它特殊说明
SUSE在产品支持上,要求有stonith机制,让HA可以fence掉异常节点,以保护共享存储。
在本案例中,由于主要业务场景是通过DRBD进行复制,以充分利用OSD节点对admin节点进行保护,并没有使用共享存储;且DRBD已经配置了资源级别的fence,因此HA中没有配置stonith机制对数据没有任何风险的;
如果要消除警告,可以配置ipmi的 stonith,或者结合第三个节点,配置sbd-diskless,请参考其它文档,或者选择SUSE的consultant服务进行深入支持。
No comments yet