在两台机器之间进行实时 KVM 迁移,同时保持桥接客户机 IP 静态

在两台机器之间进行实时 KVM 迁移,同时保持桥接客户机 IP 静态

我在两台 Ubuntu PC 上分别安装了 KVM 并创建了一些虚拟机。每台 PC 上的所有虚拟机都应该能够互相看到,因此我无法使用 KVM 分配给它们的私有 IP,据我所知,这需要创建桥接才能使它们的 IP 相互可见。两台机器通过路由器相互连接。

现在我想将其中一个虚拟机从一侧迁移到另一侧。但最初定义的 IP 地址应保持不变。在这些条件下是否可以进行实时迁移?如果不行,或者您知道其他更好的方法,请提供建议。

答案1

实时迁移是将正在运行的虚拟机 (VM) 从一台物理服务器迁移到另一台物理服务器的过程,同时不会中断虚拟机对用户的可用性。VM 实时迁移的目标是能够在 VM 上执行维护或升级,而不会让虚拟机的任何用户在迁移过程中遇到停机时间。实时迁移也称为无缝实时迁移,因为在迁移过程中最终用户不会遇到明显的停机时间。

要求:

  1. 支持硬件虚拟化。
  2. 使用同一制造商的处理器。例如,全部使用 AMD 或全部使用 Intel。
  3. 属于同一个 Active Directory 域,或者属于相互信任的域。
  4. 必须将虚拟机配置为使用虚拟硬盘或虚拟光纤通道磁盘(无物理磁盘)。

概述:

  1. 发生实时迁移设置。在实时迁移设置阶段,源服务器与目标服务器建立连接。此连接将虚拟机配置数据传输到目标服务器。在目标服务器上设置骨架虚拟机,并为目标虚拟机分配内存。

  2. 内存页面从源节点传输到目标节点。在实时迁移的第二阶段,分配给迁移虚拟机的内存通过网络复制到目标服务器。此内存称为迁移虚拟机的“工作集”。内存页面为 4 KB。

  3. 已修改的页面被转移。实时迁移的第三阶段是内存复制过程,将“测试虚拟机”的剩余已修改内存页面复制到目标服务器。源服务器将虚拟机的 CPU 和设备状态转移到目标服务器。

  4. 存储控制权从源服务器移至目标服务器。在实时迁移的第四阶段,与“测试虚拟机”相关的存储(如任何虚拟硬盘文件或通过虚拟光纤通道适配器连接的物理存储)的控制权将转移到目标服务器。

  5. 虚拟机在目标服务器上上线。在实时迁移的第五阶段,目标服务器现在拥有“测试虚拟机”的最新工作集,以及对“测试虚拟机”使用的任何存储的访问权限。此时“测试虚拟机”恢复运行。

  6. 进行网络清理。在实时迁移的最后阶段,迁移的虚拟机在目标服务器上运行。此时,会向网络交换机发送一条消息。此消息使网络交换机获取迁移的虚拟机的新 MAC 地址,以便往返于“测试虚拟机”的网络流量可以使用正确的交换机端口。

以下变量可能会影响实时迁移速度:

• 要迁移的虚拟机上已修改页面的数量——已修改页面的数量越大,虚拟机保持迁移状态的时间越长。

• 源服务器和目标服务器之间的可用网络带宽。

• 源服务器和目标服务器的硬件配置。

• 源服务器和目标服务器上的负载。

• 服务器和共享存储之间的可用带宽(网络或光纤通道)。

脚步 :

  1. 创建 NFS 池存储:NFS 池是 OVP 主机提供的存储资源,供虚拟机用于存储目的。

    1.1 设置 NFS 池目录。创建池目录。

    # mkdir -p /export/x86-64-kvm-guest-pool
    

    编辑 /etc/exports 以添加相应的导出行。

    # cat /etc/exports
    /export/x86-64-kvm-guest-pool *(rw,no_subtree_check,insecure,no_root_squash)
    

    告诉 NFS 服务器重新加载导出配置文件。

    # exportfs –a
    

    1.2 连接到 QEMU 虚拟机管理程序。

    # virsh connect qemu:///system
    

    1.3 加载 NFS 池的配置文件。

    在加载配置文件之前,建议您验证 POOL_HOST 变量是否包含完全限定名称,而不是 localhost 等本地名称。使用完全限定名称可让虚拟机找到所需的存储资源,即使它们在不同的 OVP 主机之间迁移。

    # cat xmlDir/x86-64-kvm-guest-pool.xml
    
    <pool type="netfs">
              <name>x86-64-kvm-guest-pool</name>
               <source>
               <host name='HOST_NAME'/>
                <dir path='/export/x86-64-kvm-guest-pool/'/>
                </source>
                 <target>
                 <path>/export/images/</path>
                </target>
                </pool>
    # virsh pool-define xmlDir/x86-64-kvm-guest-pool.xml
    

    注意:使用默认值生成所有示例文件。

        # libvirt-xml-examples
        # ls
          x86-64-kvm-guest-glusterfs-qcow2.xml x86-64-kvm-guest-local-qcow2.xml
          x86-64-kvm-guest-nfs-qcow2.xml x86-64-kvm-guest-pool
          x86-64-kvm-guest-glusterfs-raw.xml x86-64-kvm-guest-local-raw.xml
          x86-64-kvm-guest-nfs-raw.xml x86-64-kvm-guest-pool.xml
    

    1.4 启动存储池

         # virsh pool-start x86-64-kvm-guest-pool
    

    注意:virsh 是用于管理客户虚拟机和虚拟机管理程序的命令行界面工具。virsh 命令行工具基于 libvirt 管理 API 构建,可作为 qemu-kvm 命令和图形 virt-manager 应用程序的替代方案。

    1.5 在 x86-64-kvm-guest-pool 存储池上创建存储卷。

      # virsh vol-create-as x86-64-kvm-guest-pool x86-64-kvm-guest-vda.raw 10G --format raw
    
  2. 在源服务器上启动虚拟机。

    2.1 创建 Linux Bridge 以连接到虚拟机

              brctl addbr <BRIDGE_NAME>
              ifconfig <INTERFACE_NAME> 0.0.0.0 promisc up
              brctl addif <BRIDGE_NAME> <INTERFACE_NAME>
              ifconfig  <BRIDGE_NAME>  <BRIDGE_IP> up
    

    2.2 编辑虚拟机配置文件。

          # cp x86-64-kvm-guest-nfs-raw.xml <NAME_FOR_CONF_FILE>.xml
          #vim <NAME_FOR_CONF_FILE>.xml
    
                    <domain type='kvm'>
                    <name>L2_VM2</name>   -name for VM
    ………
    
        <cpu mode='custom' match='exact'>
                 <model fallback='allow'>Conroe</model>
               <topology sockets='1' cores='3' threads='1'/>  - assign vcpus to VM
               </cpu>
    
         ……..
    
         <devices>
         <emulator>/usr/bin/kvm</emulator>
         <disk type='file' device='cdrom'>
          <driver name='qemu' type='raw'/>
          <source file='….*iso' startupPolicy='optional'>    - mention ISO file
          </source>
          <target dev='hdc' bus='ide'/>
          <readonly/>
          <serial></serial>
          <boot order='1'/>
          <alias name='ide0-1-0'/>
           <address type='drive' controller='0' bus='1' target='0' unit='0'/>
          </disk>
    

    …….. --.在此处分配 1.5 节中创建的 VDA 存储 …….. - 为 2.1 节中创建的桥接器分配名称 - 对于每个虚拟机都是唯一的

    2.3 启动虚拟机。

    2.3.1 连接到 qemu 虚拟机管理程序。

     # virsh connect qemu:///system
    

    2.3.2 加载虚拟机配置文件。

     #virsh define xmlDir/x86-64-kvm-guest-nfs-raw.xml - created in section 2.2
    

    2.3.3 启动虚拟机。

    这是虚拟机首次启动以加载安装程序的映像。安装客户机映像。

         #virsh start VM_NAME
    

    验证虚拟机是否正在运行。#virsh list Id Name State ---------------------------------------------------- 8 x86-64-kvm-guest running 可以使用 vnc 会话访问虚拟机的 GUI:- vnc 端口 5900。

    2.4.4 操作系统安装成功后,编辑虚拟机配置文件。

        <devices>
         <emulator>/usr/bin/kvm</emulator>
         <disk type='file' device='cdrom'>
          <driver name='qemu' type='raw'/>
          <source file='….*iso' startupPolicy='optional'>    - remove ISO file name .
          </source>
          <target dev='hdc' bus='ide'/>
          <readonly/>
          <serial></serial>
          <boot order='1'/>
          <alias name='ide0-1-0'/>
    

    按照2.3节中提到的步骤启动虚拟机。

  3. 正在迁移虚拟机。

    本练习假设虚拟机 x86-64-kvm-guest 在 OVP 节点 SOURCE_HOST 上运行,并将实时迁移到 OVP 节点 TARGET_HOST。在继续本节之前,请验证两台机器是否可以相互访问。

    3.1 在 TARGET_HOST 上创建与第 2.1 节中创建的同名桥。

    3.2 在 TARGET_HOST 上启用共享 NFS 池。

         # scp xmlDir/x86-64-kvm-guest-pool.xml root@TARGET_HOST_IP:xmlDir.
    

    按照 Target_HOST 上的 1.3 和 1.4 节进行操作。

    3.3 在 SOURCE_HOST 上开始迁移。

             # virsh migrate 
              --live \
                --p2p \ // interface name used for migration
              --verbose \
               --x86-64-kvm-guest \
               qemu+tcp://TARGET_HOST/system
    

    验证迁移是否成功。在 TARGET_HOST 上运行命令。

     #virsh list
    Id Name State
              ----------------------------------------------------
      8 x86-64-kvm-guest running
    

相关内容