初探oVirt-小结后重做一遍ovirt环境

2016/11/15

一、基础环境
1、本次测试环境使用4台物理机来测试:n72, n73, n86, n93
CPU:    Intel(R) Xeon(R) CPU E5-2603 v2 @ 1.80GHz
内存:   32G    
硬盘:   系统盘sda + 数据盘sdb

ovirt-engine: e01(在n86上用virt-install手动创建的vm,安装vm和ovirt-engine的方法,前文有述略过不提)
ovirt-hosts: n72, n73, n93
ovirt-gluster: n72, n73, n93
NFS: n86
RSYNC: n93

2、配置NFS服务(n86)
1)安装服务
[root@n86 ~]# yum install nfs-utils -y
chkconfig rpcbind on
chkconfig nfs on
service rpcbind start
service nfs start
mkdir -p /data/ovirt/{data,export,iso} \
&& chown -R 36:36 /data/ovirt  \
&& chmod -R 0755 /data/ovirt  \
&& cat <<'_EOF' >>/etc/exports
/data/ovirt/data  *(rw,sync,no_subtree_check,all_squash,anonuid=36,anongid=36)
/data/ovirt/export  *(rw,sync,no_subtree_check,all_squash,anonuid=36,anongid=36)
/data/ovirt/iso  *(rw,sync,no_subtree_check,all_squash,anonuid=36,anongid=36)
_EOF
exportfs -arv

2)调整nfs端口
[root@n86 ~]# mv /etc/sysconfig/nfs /etc/sysconfig/nfs.bak`date +%Y%m%d%H%M%S` \
&& cat <<'_EOF' >>/etc/sysconfig/nfs
RPCRQUOTADOPTS="-p 875"
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
RPCNFSDCOUNT=8
RPCMOUNTDOPTS="-p 892"
STATDARG="-p 662 -o 2020"
_EOF
service rpcbind restart
service nfs restart

3)最后调整防火墙的配置:
[root@n86 ~]# sed -i.backup '/-A INPUT -i lo -j ACCEPT/a\## NFS related \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 111 -j ACCEPT \
-A INPUT -p udp -m state --state NEW -m udp --dport 111 -j ACCEPT \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 662 -j ACCEPT \
-A INPUT -p udp -m state --state NEW -m udp --dport 662 -j ACCEPT \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 875 -j ACCEPT \
-A INPUT -p udp -m state --state NEW -m udp --dport 875 -j ACCEPT \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 892 -j ACCEPT \
-A INPUT -p udp -m state --state NEW -m udp --dport 892 -j ACCEPT \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2049 -j ACCEPT \
-A INPUT -p udp -m state --state NEW -m udp --dport 32769 -j ACCEPT \
-A INPUT -p tcp -m state --state NEW -m tcp --dport 32803 -j ACCEPT \
# \
' /etc/sysconfig/iptables
[root@n86 ~]# service iptables reload

先从外边的其他机器访问来测试一下:
【调整前】
[root@e01 ~]# showmount -e 10.50.200.86
rpc mount export: RPC: Unable to receive; errno = No route to host

【调整后】
[root@e01 ~]# showmount -e 10.50.200.86
Export list for 10.50.200.86:
/data/ovirt/iso    *
/data/ovirt/export *
/data/ovirt/data   *

符合预期。


3、网络配置
1)几台主机的网络划分:
管理网段:10.50.200.0/24

2)hosts
[root@vm220 ~]# yum -y install dnsmasq
[root@vm220 ~]# cat /etc/hosts
10.50.200.30 e01.test
10.50.200.72 n72.test
10.50.200.73 n73.test
10.50.200.86 n86.test
10.50.200.93 n93.test






二、配置ovirt
1、新增集群
数据中心:Default
集群名称:Host-Only
CPU类型:选择SandyBridge
启用 Virt 服务:勾选(默认)
启用 Gluster 服务:不勾选(不建议 Virt 和 Gluster 同时启用。理由是: Gluster 服务相对比较容易出现异常,这个时候,将会对 Virt 服务也造成影响。)
创建。

3、新增主机
增加n72,n73,n93
【选择菜单:“数据中心-Default-主机-新建”】
数据中心:Default
主机集群:Host-Only
名称:n72.test
地址:n72.test
密码:xxx
【电源管理】
启用电源管理:勾选
地址:idrac的IP
用户名:root
密码:xxx
类型:drac7
测试:Test Succeeded, on
确定。

4、增加存储域
【选择菜单:“数据中心-Default-存储-新建域”】

【data域】
名称:data-nfs
域功能/存储类型:Data/NFS
使用主机:n93.test
路径:n86.test:/data/ovirt/data

【export域】
名称:export-nfs
域功能/存储类型:Export/NFS
使用主机:n93.test
路径:n86.test:/data/ovirt/export

后续在建立vm和模版后,建议立即导出到export域中备份。

【iso域】
名称:iso-nfs
域功能/存储类型:ISO/NFS
使用主机:n93.test
路径:n86.test:/data/ovirt/iso

拷贝一个ISO文件到iso域中:
[root@n86 11111111-1111-1111-1111-111111111111]# pwd
/data/ovirt/iso/a1373048-e959-4ec7-b1f3-97ad58299ae4/p_w_picpaths/11111111-1111-1111-1111-111111111111
[root@n86 11111111-1111-1111-1111-111111111111]# chown 36:36 CentOS-6.5-x86_64-bin-DVD1.iso
[root@n86 11111111-1111-1111-1111-111111111111]# ll -h
total 4.2G
-rw-r--r-- 1 vdsm kvm 4.2G Jul 24  2014 CentOS-6.5-x86_64-bin-DVD1.iso


【附】使用glusterfs类型的主机的方式(本次操作略过,未使用;使用手动管理的glusterfs服务,请参考附录1)
----------------------------------------------------------------------
假设有3台主机(n1,n2,n3)提供glusterfs服务。
首先,在主机上新建目录:
/data/gv0

其次,用ovirt管理卷:
【选择菜单:“集群-GlusterOnly-卷-新建卷”】
名称:gv0
类型:replicate
Replica Count:3
主机:g1,g2,g3
Brick 目录:/data/gv0/brick1
确定
为 Virt 库进行优化:勾选(后续也可选,主要是配置了gluster的一些参数,例如gid和uid设定为36)
创建。
启动。

最后,提供服务:
【选择菜单:“数据中心-Default-存储-新建域”】
【data域】
名称:data-gv0
域功能/存储类型:Data/GlusterFS
使用主机:n93.test
路径:g1.test:/gv0
挂载选项:backupvolfile-server=g2.test,backupvolfile-server=g3.test
----------------------------------------------------------------------




6、新建vm
【选择菜单:“数据中心-Default-虚拟机-新建虚拟机”】
集群:Host-Only/Default
操作系统:Red Hat Enterprise Linux 6.x x84
名称:vm4tpl-s1
注释:centos6u5x64-c1-2g-d20g-if1

nic1:ovirtmgmt
时区:GMT+8
确定。

配置虚拟磁盘
大小:20
别名:vm4tpl-s1_Disk1
描述:vmdisk_os

激活:勾选
可引导:勾选
确定。

【选择菜单:“数据中心-Default-虚拟机-只运行一次”】
【引导选项】
附加CD:勾选
确定。

【选择菜单:“数据中心-Default-虚拟机-控制台”】
打开spice窗口安装系统(请参考前文)。
--- 配置系统 ---
网卡:开机启动,DHCP
root密码
时区:Shanghai
UTC:不勾选
分区:
/boot   200 M
/swap   2048 M(同内存大小)
/       all
软件包:basic server
安装完成后,reboot



三、将上一步创建的vm制作成模版前的准备工作(封装linux)
1、--- 安装常用软件 ---
[root@localhost ~]# yum -y install bind-utils lrzsz man ntp openssh-clients rsync traceroute vim wget tree 
注意sshd的配置中,保证passwd的验证方式是开启的。

2、--- 使用ntpd服务来控制vm的时间同步 ---
先更新一次:
[root@localhost ~]# /usr/sbin/ntpdate stdtime.gov.hk

[root@localhost ~]# sed -i.backup '/server 0.centos.pool.ntp.org iburst/i\## NTP related \
server stdtime.gov.hk iburst \
server 0.asia.pool.ntp.org iburst \
server 1.asia.pool.ntp.org iburst \
server 2.asia.pool.ntp.org iburst \
\
' /etc/ntp.conf

启动ntpd服务:
[root@localhost ~]# service ntpd start
[root@localhost ~]# chkconfig ntpd on

3、--- 安装 ovirt-guest-agent ---
在vm上先安装ovirt-release35.rpm这个yum源。
[root@localhost ~]# yum -y install http://plain.resources.ovirt.org/pub/yum-repo/ovirt-release35.rpm
[root@localhost ~]# yum -y install ovirt-guest-agent
启动服务
[root@localhost ~]# service ovirt-guest-agent start
[root@localhost ~]# chkconfig ovirt-guest-agent on
重启一次,测试一下ovirt页面对vm的控制是否生效。

--- 安装 cloud-init ---
请参考:“初探oVirt-使用cloud-init”


4、手动清理在创建虚拟机时可能导致冲突的配置
请参考:“初探oVirt-使用小结FAQ”



五、模版和导出
1、模版
【选择菜单:“数据中心-Default-虚拟机-创建模版”】
名称:tpl-s1
描述:c1-2g-d20g-if1
注释:centos6u5x64-small


2、测试新建虚拟机
【选择菜单:“数据中心-Default-虚拟机-新建虚拟机”】
基于模版:tpl-s1
名称:test01
确定。

【选择菜单:“数据中心-Default-虚拟机-只运行一次”】
【初识运行】
使用 Cloud-Init:勾选
设定vm名称等项目后,确定。


3、导出
【选择菜单:“数据中心-Default-虚拟机(选择指定的虚拟机)-导出”】
【选择菜单:“数据中心-Default-模版(选择指定的模版)-导出”】


4、调整vm
【选择菜单:“数据中心-Default-虚拟机”】
名称:vm4tpl-s1
选中vm,选择下方菜单:“磁盘-取消激活”
目的:将这个制作模版的vm的磁盘设置成未激活的状态,以免误操作启动了这个vm


六、测试engine的备份和恢复
1、从应用层面和kvm层面着手尝试。

2、#####----- 【应用层面】 -----#####
【备份】
d_bak="/tmp/ovirt_engine_backup/`date +%Y%m%d_%H%M%S`"
f_log="/tmp/rsync_ovirt_bak.txt"
[ -d ${d_bak} ] || mkdir -p ${d_bak}
cd ${d_bak}
engine-backup --mode=backup --file=ovirt-engine.bak --log=backup.log >${f_log} 2>&1

【恢复】
未验证。作为备用方案。
请参考:http://www.ovirt.org/Ovirt-engine-backup#Restore
或:初探oVirt-体验


3、#####----- 【kvm 层面】 -----#####
1)克隆vm并归档(参考附录2的脚本)
[root@n86 bin]# sh /usr/local/bin/rsync_bak_kvm_p_w_picpaths.sh
     
2)恢复
对比xml可以发现,克隆的对象修改了以下内容:
name
uuid
source file
mac address
graphics

编辑clone的镜像对应的xml文件:
D1)调整name(可选,使用原来的即可,例如:e01.test)
D2)替换uuid为原来的e01.test对应的uuid,如果这个已经不可用,已经undefine掉,则直接删除uuid即可,后续会自动生成
D3)调整source file对应的镜像文件名称(可选)
D4)将mac地址更换为e01.test的mac
D5)调整vnc密码,端口等(可选)
调整完毕后:
virsh define e01.test
virsh start e01.test



4、场景
1)测试engine的备份和恢复
【场景1】使用新克隆的的vm来运行engine(e01.test-clone)
--- 现象 ---
先克隆 vm(e01.test) 为 e01.test-clone
再关闭 e01.test
最后使用 e01.test-clone
--- 结果 ---
engine页面:正常。

【场景2】使用旧的vm来运行engine(e01.test)
--- 现象 ---
上一步使用e01.test-clone的时候,启动了一个vm(vm01,状态为“UP”)
过了2小时后,停止e01.test-clone,恢复使用e01.test
--- 结果 ---
engine页面:正常。

【场景3】使用昨天备份的副本(e01.test-clone)之前,在engine(e01.test)页面上操作增加了1个vm(vm02),且这个vm处于running状态,此时停止engine(e01.test)所在的VM,再恢复昨天的副本(e01.test-clone),问题是,这个新增的vm(vm02)可以在engine(e01.test)上正常运行吗?
--- 现象 ---
昨天的副本运行后:engine(e01.test-clone)也可以工作,但 vm02 被识别成“external-vm02”,可以强制关机,但无法再启动这个VM,启动时报错:“无法 运行 VM。引擎没有管理这个虚拟机。”
--- 结果 ---
engine页面:异常。
结论:engine可以正常运作,但这一天所做的操作(新增或删除vm、磁盘等要记录到db中的行为)将会丢失。当然,任何备份方式也无法避免这种情况,只能尽量降低损失。



2)外部创建的vm如何导入ovirt平台。如果可行,则可以继续尝试将xen,vmware上运行的vm转换为kvm导入ovirt平台。
【场景4】手动在主机n73上创建并运行一个vm(tvm01),engine的也可以识别吗?
--- 现象 ---
virsh的命令行可以正常管理;但engine页面不能显示这个vm,完全不会感知到它的存在。
--- 结果 ---
engine页面:正常。
结论:外边创建的vm不能直接被engine识别。



5、结论
1)建议    同时启用2种备份方式。
2)不可行  外部创建的vm不能直接导入ovirt平台,因此,将xen,vmware上运行的vm转换为kvm再导入ovirt平台的想法将遇到麻烦。
3)不建议  在使用虚拟化管理平台的同时,手动使用virsh配置,这将导致行为和数据的不一致。





四、附录1【glusterfs】
1、使用glusterfs集群作为ovirt-engine的后端存储和engine的备份卷
本次示例,由3个副本组成的集群,节点包括:
node33.glusterfs
node34.glusterfs
node35.glusterfs

2、手动管理glusterfs服务。
配置 卷 e01_data:挂载作为 ovirt-engine 的 data 域 
配置 卷 gv4kvm:挂载作为 ovirt-engine 所在 kvm 的备份卷

--------------- 配置 卷 e01_data ---------------
【创建卷】
创建卷 e01_data 作为主数据域:
mkdir -p /data/e01.test
gluster volume create e01_data replica 3 transport tcp \
node33.glusterfs:/data/e01.test/engine_data \
node34.glusterfs:/data/e01.test/engine_data \
node35.glusterfs:/data/e01.test/engine_data

【启动】
[root@n86 ~]# gluster volume start e01_data
【配置参数】
gluster volume set e01_data diagnostics.count-fop-hits on
gluster volume set e01_data diagnostics.latency-measurement on
gluster volume set e01_data storage.owner-gid 36
gluster volume set e01_data storage.owner-uid 36 
gluster volume set e01_data cluster.server-quorum-type server
gluster volume set e01_data cluster.quorum-type auto
gluster volume set e01_data network.remote-dio enable
gluster volume set e01_data cluster.eager-lock enable
gluster volume set e01_data performance.stat-prefetch off
gluster volume set e01_data performance.io-cache off
gluster volume set e01_data performance.read-ahead off
gluster volume set e01_data performance.quick-read off
gluster volume set e01_data auth.allow \*
gluster volume set e01_data user.cifs enable
gluster volume set e01_data nfs.disable off

【挂载】
ovirt-engine,选择菜单:“数据中心-Default-存储-新建域”
名称:data-e01_data
域功能/存储类型:Data/GlusterFS
使用主机:n93.test
路径:node35.glusterfs:/e01_data
挂载选项:backupvolfile-server=node33.glusterfs,backupvolfile-server=node34.glusterfs
--------------- 配置 卷 e01_data ---------------
--------------- 配置 卷 e01_bak_kvm ---------------
【创建卷】
创建卷 e01_bak_kvm 作为kvm备份卷:
gluster volume create e01_bak_kvm replica 3 transport tcp \
node33.glusterfs:/data/e01.test/bak_kvm \
node34.glusterfs:/data/e01.test/bak_kvm \
node35.glusterfs:/data/e01.test/bak_kvm

【启动】
[root@n86 ~]# gluster volume start e01_bak_kvm
【挂载】
[root@n86 ~]# mkdir /backup
[root@n86 ~]# mount -t glusterfs -o backupvolfile-server=node33.glusterfs,backupvolfile-server=node34.glusterfs node35.glusterfs:/e01_bak_kvm /backup
[root@n86 ~]# df -h /backup
Filesystem                     Size  Used Avail Use% Mounted on
node35.glusterfs:/e01_bak_kvm   11T   17G   11T   1% /backup
--------------- 配置 卷 e01_bak_kvm ---------------


五、附录2【rsync_bak_kvm_p_w_picpaths.sh】   
1、脚本
[root@n86 bin]# cat /usr/local/bin/rsync_bak_kvm_p_w_picpaths.sh
#!/bin/bash
#
# 2015/12/16

s_vm='e01.test'                                         # 源 vm 的名称
s_vm_clone="${s_vm}-clone"                              # 克隆后的 vm 名称 
d_vm_img='/data/kvm/p_w_picpaths'                             # 源 vm 的磁盘镜像目录
f_vm_img_clone="${d_vm_img}/${s_vm}-vda-clone.qcow2"    # 源 vm 的磁盘镜像文件路径
d_bak_root="/data/backup/VMs/${s_vm}"                   # 本地 备份目录
s_date=$(date +%Y%m%d)                                  # 日期
d_clone="${d_bak_root}/${s_date}"                       # 当前备份存放目录
d_logs='/data/backup/logs'                              # 备份日志存放目录
f_bak_log="${d_logs}/clone_${s_date}.log"               # 日志文件路径

function do_clone_vm() {
    ### 【1】
    echo '#virsh# list --all' && virsh list --all |grep ${s_vm}
    echo "[1] `date` [INFO] 准备克隆。"
    virsh suspend ${s_vm}
    echo '#virsh# list --all' && virsh list --all |grep ${s_vm}
    ret=$?
    virt-clone -o e01.test --auto-clone
    [ ${ret} -eq 0 ] && virsh resume ${s_vm}
    echo '#virsh# list --all' && virsh list --all |grep ${s_vm}
    echo "[1] `date` [INFO] step 1 完成。"
    ### 【2】
    echo "[2] `date` [INFO] 收集 xml 和 p_w_picpaths 并拷贝到本地存储。"
    cp -fv /etc/libvirt/qemu/${s_vm}.xml ${d_clone}
    mv -fv /etc/libvirt/qemu/${s_vm_clone}.xml ${d_clone}
    mv -fv ${f_vm_img_clone} ${d_clone} 
    echo "[2] `date` [INFO] step 2 完成。"
    ### 【3】
    echo "[3] `date` [INFO] 移除克隆的 VM"
    virsh undefine ${s_vm_clone}
    echo "[3] `date` [INFO] step 3 完成。"
}


function do_clean() {
    echo "[4] `date` [INFO] 清理7天前的 VM"
    find ${d_bak_root} -mtime +7 -print
    find ${d_bak_root} -mtime +7 -delete
    echo "[4] `date` [INFO] step 4 完成。"
}


function do_rsync() {
    rsync -av --delete --password-file=/etc/rsync.pass $1  backup@10.50.200.93::bak_kvm_p_w_picpaths
}


function do_bak() {
    mkdir -pv ${d_clone} ${d_logs}
    do_clone_vm
    do_clean
    do_rsync ${d_bak_root}
}


function do_alert() {
    do_bak >${f_bak_log} 2>&1
    if [ $? -eq 0 ];then
        retval="OK"
    else
        retval="Failed"
    fi

    ## sendEmail args
    mail_bin="sendEmail -s smtp.xxx.com \
                        -xu f@xxx.com \
                        -xp xxx \
                        -f f@xxx.com \
                        -o message-charset=utf-8"
    to="me@xxx.com"
    subject="sz kvm backup ${retval}"
    body="from ${HOSTNAME}: $0"
    ${mail_bin} -t ${to} -u ${subject} -m ${body} -a ${f_bak_log}
}

do_alert