作为一名运维工程师,KVM虚拟化技术是我们日常工作中不可或缺的工具。今天我想和大家分享KVM热迁移的实际操作经验,以及三种网络模式的深度对比分析。这些内容都是我多年运维工作中积累的实战心得,希望能帮助大家少走弯路。
在进行KVM热迁移前,我们需要准备至少两台KVM主机和一台NFS存储服务器。以下是标准的三节点配置方案:
重要提示:所有节点必须使用相同版本的KVM和libvirt组件,否则可能导致兼容性问题。建议使用CentOS 7.6+或Ubuntu 18.04+作为基础系统。
首先需要在所有节点上安装必要的软件包:
bash复制# CentOS/RHEL系统
yum install -y qemu-kvm libvirt virt-install bridge-utils nfs-utils
# Ubuntu/Debian系统
apt-get install -y qemu-kvm libvirt-daemon-system virtinst bridge-utils nfs-common
系统克隆完成后,必须修改每台主机的主机名和网络配置。这是很多新手容易忽略的关键步骤:
bash复制# 在KVM2上执行
hostnamectl set-hostname KVM2
exec bash
网络接口配置文件(/etc/sysconfig/network-scripts/ifcfg-ens160)需要特别注意以下几点:
bash复制TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.108.102
PREFIX=24
GATEWAY=192.168.108.2
配置完成后,需要重新加载网络连接:
bash复制nmcli connection reload ens160
ifconfig ens160 # 验证IP配置
ip -br a # 更简洁的IP查看方式
为确保所有节点能够互相解析,需要在每台主机上配置相同的hosts文件:
bash复制cat >> /etc/hosts << EOF
192.168.108.100 NFS
192.168.108.101 KVM1
192.168.108.102 KVM2
EOF
配置完成后,可以通过scp命令快速同步到其他节点:
bash复制scp /etc/hosts root@KVM2:/etc/hosts
KVM热迁移依赖于共享存储,我们以NFS为例进行配置。在NFS服务器上:
bash复制# 创建共享目录
mkdir -p /data/kvm_shared
chown nobody:nobody /data/kvm_shared
# 配置NFS导出
echo "/data/kvm_shared *(rw,sync,no_root_squash)" >> /etc/exports
exportfs -a
systemctl restart nfs-server
在所有KVM节点上挂载这个共享存储:
bash复制mkdir -p /mnt/kvm_shared
mount -t nfs NFS:/data/kvm_shared /mnt/kvm_shared
# 设置开机自动挂载
echo "NFS:/data/kvm_shared /mnt/kvm_shared nfs defaults 0 0" >> /etc/fstab
创建一个测试虚拟机并存储在共享存储上:
bash复制virt-install \
--name testvm \
--ram 1024 \
--vcpus 1 \
--disk path=/mnt/kvm_shared/testvm.qcow2,size=10 \
--os-type linux \
--os-variant centos7.0 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--import
在KVM1上执行以下命令将testvm迁移到KVM2:
bash复制virsh migrate --live --verbose testvm qemu+ssh://KVM2/system
实际操作心得:首次执行迁移前,建议先使用
--unsafe参数测试迁移可行性,确认无误后再进行正式迁移。
迁移完成后,可以通过以下命令验证虚拟机状态:
bash复制# 在KVM2上检查虚拟机状态
virsh list --all
# 检查虚拟机实际运行位置
virsh domhostname testvm
NAT(Network Address Translation)模式是KVM默认的网络配置,其核心特点包括:
网络架构:
连通性分析:
典型应用场景:
配置示例:
bash复制virsh net-edit default
Host-only模式创建了一个完全隔离的私有网络:
网络特性:
性能特点:
适用场景:
创建Host-only网络:
bash复制virsh net-define /dev/stdin <<EOF
<network>
<name>hostonly</name>
<bridge name="virbr1"/>
<forward mode="hostonly"/>
</network>
EOF
桥接模式是最接近物理机网络体验的配置:
网络原理:
配置步骤:
bash复制# 创建桥接接口
nmcli connection add type bridge ifname br0
nmcli connection modify bridge-br0 bridge.stp no
nmcli connection add type bridge-slave ifname ens160 master br0
优势与局限:
生产环境建议:
块存储是KVM最常用的存储形式,典型代表包括:
技术特点:
常见实现:
bash复制# 创建raw格式镜像
qemu-img create -f raw /var/lib/libvirt/images/vm1.raw 10G
# 创建qcow2格式镜像
qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 10G
性能对比:
| 指标 | raw格式 | qcow2格式 |
|---|---|---|
| 随机读性能 | 100% | 90% |
| 随机写性能 | 100% | 85% |
| 快照功能 | 不支持 | 支持 |
| 压缩功能 | 不支持 | 支持 |
NFS是最常用的文件存储方案:
配置优化建议:
bash复制# /etc/exports优化配置
/data/kvm_shared *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
性能调优参数:
高可用方案:
虽然对象存储(如Swift)不常用于KVM主存储,但在以下场景很有价值:
备份存储:
镜像仓库:
与KVM集成:
bash复制# 使用rclone挂载对象存储
rclone mount swift:vm-images /mnt/swift --daemon
问题现象:迁移过程中断,虚拟机卡死
排查步骤:
检查libvirtd日志:
bash复制journalctl -u libvirtd -n 100
验证网络连通性:
bash复制ping KVM2
ssh KVM2 virsh list
检查存储可访问性:
bash复制ls /mnt/kvm_shared
touch /mnt/kvm_shared/testfile
常见解决方案:
桥接网络无法工作:
检查物理网卡状态:
bash复制ethtool ens160
验证桥接配置:
bash复制brctl show
ip link show br0
检查网络过滤器:
bash复制iptables -L -n -v
NAT模式下虚拟机无法上网:
检查iptables NAT规则:
bash复制iptables -t nat -L -n -v
验证IP转发是否启用:
bash复制sysctl net.ipv4.ip_forward
检查DNS配置:
bash复制virsh net-dumpxml default
qcow2镜像性能差:
优化选项:
bash复制qemu-img create -f qcow2 -o cluster_size=64k,preallocation=metadata vm1.qcow2 20G
转换现有镜像:
bash复制qemu-img convert -p -f qcow2 -O qcow2 -c -o cluster_size=64k input.qcow2 output.qcow2
NFS存储延迟高:
客户端挂载优化:
bash复制mount -t nfs -o rsize=65536,wsize=65536,hard,intr,timeo=600,retrans=2 NFS:/data /mnt
服务器端调优:
bash复制echo 32768 > /proc/sys/net/core/rmem_default
echo 32768 > /proc/sys/net/core/wmem_default
经过多年的KVM运维实践,我发现很多问题都源于基础配置的不一致。建议在生产环境中使用自动化工具(如Ansible)来管理KVM集群配置,确保所有节点的参数完全一致。对于关键业务虚拟机,建议在非高峰时段先进行测试迁移,验证无误后再执行正式迁移。