No menu items!
No menu items!
More

    [KVM] Hướng dẫn LiveMigration trên KVM

    1. Tổng quan.

    Trong quá trình vận hành để phục vụ cho việc bảo trì và nâng cấp hệ thống chúng ta cần chuyển các VM từ host này sang host khác. Với các VM đang chạy các ứng dụng quan trọng chúng ta không thể tắt nó đi trong quá trình chuyển. Trên KVM việc live migrate sẽ đảm bảo được các yêu cầu này.

    2. Chuẩn bị.

    Chuẩn bị ba máy cài đặt hệ điều hành Ubuntu 20.04 trong đó một máy dùng để cài đặt NFS dùng làm máy lưu file disk của VM và 2 máy cài đặt KVM.

    Ba máy này cần có card mạng và có thể kết nối được với nhau

    Đây là môi trường lap nên mình tắt firewalld trên cả 3 máy, để tắt sử dụng 3 câu lệnh sau trên cả ba máy:

    sudo ufw disable
    sudo systemctl stop ufw
    sudo systemctl disable ufw

    3. Sơ đồ lab.

    4. Triển khai.

    4.1. Cấu hình phân dải tên miền (thực hiện trên tất cả các máy).

    Để có thể live migrate giữa 2 KVM host thì 2 máy này cần biết tên miền của nhau. Bạn có thể cấu hình dịch vụ DNS phân dải tên miền cho các 2 máy này. Đây là mô hình lap có ít máy nên tôi sẽ cấu hình luôn trong file /etc/hosts.

    • 192.168.13.227, 192.168.13.228, 192.168.13.229 địa chỉ ip của các máy.
    • kvm-node01.hoanghd.com, kvm-node02.hoanghd.com, kvm-node03.hoanghd.com chính là domain của các máy.
    • kvm-node01, kvm-node02, kvm-node03 chính là hostname của các máy (dùng lệnh hostname để lấy tên hostname của các máy chủ). Ví dụ ở dưới là xem thông tin hostname của máy chủ kvm-node01.
    $ hostname
    kvm-node01

    Sau khi có đầy đủ thông tin, bạn chạy lệnh sau trên lần lượt các máy.

    echo '''192.168.13.227 kvm-node01.hoanghd.com 
    192.168.13.228 kvm-node02.hoanghd.com kvm-node02
    192.168.13.229 kvm-node03.hoanghd.com kvm-node03''' >> /etc/hosts

    Hãy chắc chắn file host đã trỏ thành công và có kết nối đến các server.

    $ ping kvm-node01.hoanghd.com
    PING kvm-node01.hoanghd.com (192.168.13.227) 56(84) bytes of data.
    64 bytes from kvm-node01.hoanghd.com (192.168.13.227): icmp_seq=1 ttl=64 time=0.032 ms
    64 bytes from kvm-node01.hoanghd.com (192.168.13.227): icmp_seq=2 ttl=64 time=0.031 ms
    ^C
    --- kvm-node01.hoanghd.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1029ms
    rtt min/avg/max/mdev = 0.031/0.031/0.032/0.000 ms
    
    $ ping kvm-node01
    PING kvm-node01 (127.0.1.1) 56(84) bytes of data.
    64 bytes from kvm-node01 (127.0.1.1): icmp_seq=1 ttl=64 time=0.029 ms
    64 bytes from kvm-node01 (127.0.1.1): icmp_seq=2 ttl=64 time=0.030 ms
    
    --- kvm-node01 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1023ms
    rtt min/avg/max/mdev = 0.029/0.029/0.030/0.000 ms
    
    $ ping kvm-node02.hoanghd.com
    PING kvm-node02.hoanghd.com (192.168.13.228) 56(84) bytes of data.
    64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=1 ttl=64 time=0.188 ms
    64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=2 ttl=64 time=0.235 ms
    
    --- kvm-node02.hoanghd.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1026ms
    rtt min/avg/max/mdev = 0.188/0.211/0.235/0.023 ms
    
    $ ping kvm-node02 (192.168.13.228) 56(84) bytes of data.
    64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=1 ttl=64 time=0.174 ms
    64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=2 ttl=64 time=0.212 ms
    
    --- kvm-node02 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.174/0.193/0.212/0.019 ms
    
    $ ping kvm-node03.hoanghd.com
    PING kvm-node03.hoanghd.com (192.168.13.229) 56(84) bytes of data.
    64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=1 ttl=64 time=0.204 ms
    64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=2 ttl=64 time=0.206 ms
    
    --- kvm-node03.hoanghd.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1020ms
    rtt min/avg/max/mdev = 0.204/0.205/0.206/0.001 ms
    
    $ ping kvm-node03
    PING kvm-node03 (192.168.13.229) 56(84) bytes of data.
    64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=1 ttl=64 time=0.175 ms
    64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=2 ttl=64 time=0.176 ms
    
    --- kvm-node03 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1014ms
    rtt min/avg/max/mdev = 0.175/0.175/0.176/0.000 ms

    4.2. Cài đặt NFS server.

    Mình sử dụng kvm-node02 làm NFS server, trên NFS Server hãy cài đặt NFS và tiến hành share thư mục cho các KVM Node. Ở kvm-node02 mình tạo thư mục /volumes-ssd (chính là ổ đĩa ssd đang cài os) và mình sử dụng thư mục /volumes-ssd làm ổ đĩa mount với type disk là ssd.

    $ ls / | grep volumes-ssd
    volumes-ssd

    Mình cũng có ổ đĩa sdb 4TB, mình sẽ mount ổ đĩa này vào thư mục /volumes-hdd sử dụng thư mục /volumes-hdd làm ổ đĩa mount với type disk là hdd.

    $ lsblk | grep sdb
    sdb                         8:16   0   3.7T  0 disk /volumes-hdd

    Tiếp theo mình sẽ share 2 thư mục /volumes-hdd và /volumes-ssd để các máy node kvm kết nối vào. Các bước tiến hành như sau:

    Bước 1: Đầu tiên các bạn update cập nhật lại các package của Ubuntu bằng command sau :

    sudo apt update && sudo apt -y upgrade

    Bước 2: Cài đặt package nfs-kernel-server trên máy NFS Server

    sudo apt install nfs-kernel-server -y

    Kiểm tra NFS-Server service đã hoạt động chưa?

    $ sudo systemctl status nfs-kernel-server.service
    ● nfs-server.service - NFS server and services
       Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
       Active: active (exited) since Sun 2022-12-04 16:04:00 UTC; 8s ago
     Main PID: 2429 (code=exited, status=0/SUCCESS)
        Tasks: 0 (limit: 4915)
       CGroup: /system.slice/nfs-server.service
    
    Dec 04 16:04:00 webserver-01 systemd[1]: Starting NFS server and services...
    Dec 04 16:04:00 webserver-01 systemd[1]: Started NFS server and services.

    Bước 3: Export thư mục share, sửa file /etc/exports thêm record sau

    echo '/volumes-ssd *(rw,sync,fsid=1,no_subtree_check,no_root_squash)' >> /etc/exports
    echo '/volumes-hdd *(rw,sync,fsid=2,no_subtree_check,no_root_squash)' >> /etc/exports

    Sau đó restart lại NFS Service

    sudo systemctl restart nfs-kernel-server rpcbind

    Kiểm tra thư mục share trên NFS Server với lệnh exportfs -v

    $ exportfs -v
    /volumes-ssd  	<world>(rw,wdelay,no_root_squash,no_subtree_check,fsid=1,sec=sys,rw,secure,no_root_squash,no_all_squash)
    /volumes-hdd  	<world>(rw,wdelay,no_root_squash,no_subtree_check,fsid=2,sec=sys,rw,secure,no_root_squash,no_all_squash)

    4.3. Trên các KVM Node hãy thực hiện cài các nfs-common và mount các thư mục đã share từ NFS Server (thực hiện trên tất cả các kvm node).

    Bước 1: Cài package nfs-common để access tới NFS Server

    sudo apt update
    sudo apt install nfs-common -y

    Bước 2: Tạo thư mục mount_path.

    mkdir -p /kvm-volumes-ssd
    mkdir -p /kvm-volumes-hdd

    Bước 2: Mount NFS từ Client (mount NFSv4)

    echo '192.168.13.228:/volumes-ssd /kvm-volumes-ssd nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0' >> /etc/fstab
    echo '192.168.13.228:/volumes-hdd /kvm-volumes-hdd nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0' >> /etc/fstab

    Để mount lại toàn bộ các trường đã khai báo trong file /etc/fstab, bạn hãy thực hiện lệnh mount -a.

    sudo mount -a

    Xác nhận lại tất cả các kvm node đã mount thành công 2 thư mục /kvm-volumes-ssd và /kvm-volumes-hdd như dưới.

    $ df -h
    Filesystem                       Size  Used Avail Use% Mounted on
    udev                              48G     0   48G   0% /dev
    tmpfs                            9.5G  1.6M  9.5G   1% /run
    /dev/sda2                        219G   12G  197G   6% /
    tmpfs                             48G     0   48G   0% /dev/shm
    tmpfs                            5.0M     0  5.0M   0% /run/lock
    tmpfs                             48G     0   48G   0% /sys/fs/cgroup
    /dev/loop1                       117M  117M     0 100% /snap/core/14399
    tmpfs                            9.5G     0  9.5G   0% /run/user/0
    192.168.13.228:/kvm-volumes-ssd  219G   35G  173G  17% /kvm-volumes-ssd
    192.168.13.228:/kvm-volumes-hdd  3.6T     0  3.4T   0% /kvm-volumes-hdd

    5. Cài đặt và chuẩn bị môi trường cho KVM.

    Bước 1: Cài đặt KVM.

    Sau khi thực hiện cấu hình NFS server xong, ta cần thực hiện cài đặt KVM trên hai node kvm-node01, kvm-node02kvm-node03, để cài đặt ta sử dụng câu lệnh:

    sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager cloud-image-utils -y

    Bước 2. Tạo môi trường cho KVM (vì bước này chúng ta thao tác trên thư mục share nên bạn hãy chọn 1 kvm node để thực hiện, mình sử dụng kvm-node1).

    Tạo các folder để lưu config, images, network,…

    sudo mkdir -p /kvm-volumes-hdd/images /kvm-volumes-hdd/network_xml
    sudo chmod +x /kvm-volumes-hdd/images /kvm-volumes-hdd/network_xml

    Hãy tải một số images về, bạn có thể chọn 1 trong 4 image dưới hoặc tải hết cũng được.

    wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img
    wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/focal-server-ubuntu2004-cloudimg-amd64.img
    wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/jammy-server-ubuntu2204-cloudimg-amd64.img
    wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2c -O /kvm-volumes-hdd/images/CentOS-7-x86_64-GenericCloud.qcow2c

    Bước 3: Tạo network cho virtual machine (áp dụng cho tất cả các máy kvm node).

    Mình sử dụng card bridged là br0, bạn có thể sử dụng lệnh brctl show để show card br0 của máy bạn. Nếu bạn chưa có card bridge, hãy thực hiện nhanh theo các bước sau.

    sudo sed -i 's|#group = "root"|group = "root"|' /etc/libvirt/qemu.conf
    sudo sed -i 's|#user = "root"|user = "root"|' /etc/libvirt/qemu.conf
    systemctl restart libvirtd
    
    echo '''net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0''' >> /etc/sysctl.conf
    
    modprobe br_netfilter
    sysctl -p /etc/sysctl.conf

    Mình sử dụng netplan để tạo card bridge nên mình sẽ sửa lại file yaml như dưới, với:

    • enp6s0f0: tên card mạng vật lý của server
    • br0: tên card bridge (tên này tự bạn đặt)
    echo '''network:
      version: 2
      renderer: networkd
    
      ethernets:
        enp6s0f0:
          dhcp4: false 
          dhcp6: false 
    
      bridges:
        br0:
          interfaces: [ enp6s0f0]
          addresses: [ 192.168.13.227/23 ]
          gateway4: 192.168.12.5
          mtu: 1500
          nameservers:
            addresses: [ 8.8.8.8, 1.1.1.1 ]
          parameters:
            stp: true
            forward-delay: 4
          dhcp4: no
          dhcp6: no''' > /etc/netplan/$(ls '/etc/netplan/' | grep '.yaml')

    Chạy lệnh dưới để áp dụng config mới cho network.

    sudo netplan generate 
    sudo netplan --debug apply

    Sau khi áp dụng config mới thành công, bạn sẽ thấy card enp6s0f0 đã mất ip và ip được chuyển qua cho card br0 giữ.

    $ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: enp6s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
        link/ether e8:9a:8f:4f:db:34 brd ff:ff:ff:ff:ff:ff
    5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether e8:9a:8f:4f:db:34 brd ff:ff:ff:ff:ff:ff
        inet 192.168.13.227/23 brd 192.168.13.255 scope global br0
           valid_lft forever preferred_lft forever
        inet6 fe80::ea9a:8fff:fe4f:db34/64 scope link
           valid_lft forever preferred_lft forever

    Khi bạn gõ lệnh brctl show bạn đã thấy card br0 xuất hiện, và card br0 này được gắn vào card mạng vậy lý có tên là enp6s0f0

    $ brctl show
    bridge name	bridge id		          STP enabled	 interfaces
    br0		      8000.e89a8f4fdb34	    yes		       enp6s0f0

    Mình sử dụng bridged-network cho ví dụ này nên mình triển khai file xml như sau.

    echo '''<network>
        <name>bridged-network</name>
        <forward mode="bridge" />
        <bridge name="br0" />
    </network>''' > /kvm-volumes-hdd/network_xml/bridged-network.xml

    Chạy các lệnh dưới để thêm network mới.

    virsh net-define /kvm-volumes-hdd/network_xml/bridged-network.xml
    virsh net-start bridged-network
    virsh net-autostart bridged-network

    Mình không muốn sử dụng network default nên mình sẽ xoá nó luôn.

    virsh net-destroy default
    virsh net-undefine default

    Và đây là kết quả cuối cùng, bạn đã có 1 network bridged với tên là bridged-network.

    $ virsh net-list --all
     Name                 State    Autostart   Persistent
    -------------------------------------------------------
     bridged-network      active   yes         yes

    6. Tạo máy ảo.

    Bước 1: Tạo sshkey.

    sudo mkdir /kvm-volumes-hdd/vps-test
    sudo chmod +x /kvm-volumes-hdd/vps-test
    sudo mkdir -p /kvm-volumes-hdd/vps-test/ssh-keygen
    sudo chmod 600 /kvm-volumes-hdd/vps-test/ssh-keygen
    cd /kvm-volumes-hdd/vps-test/ssh-keygen
    ssh-keygen -t rsa -b 4096 -f id_rsa -C hoanghd -N "" -q

    Bước 2: Tạo file cấu hình /kvm-volumes-hdd/vps-test/cloud_init.cfg cho máy ảo, file này khai báo 1 số thông tin cơ bản để khởi tạo máy ảo như username, password, hostname, ….

    echo """
    #cloud-config
    hostname: vps-test
    fqdn: vps-test.hoanghd.com
    manage_etc_hosts: true
    users:
      - name: ubuntu
        sudo: ALL=(ALL) NOPASSWD:ALL
        groups: users, admin
        home: /home/ubuntu
        shell: /bin/bash
        lock_passwd: true
        ssh-authorized-keys:
          - $(cat /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa.pub)
      - name: hoanghd
        sudo: ALL=(ALL) NOPASSWD:ALL
        groups: users, admin
        home: /home/hoanghd
        shell: /bin/bash
        lock_passwd: false
    
    package_update: true
    packages_upgrade: true
    packages:
      - qemu-guest-agent
      - traceroute
    
    # only cert auth via ssh (console access can still login)
    ssh_pwauth: false
    disable_root: false
    chpasswd:
      list: |
         hoanghd:hoanghd
      expire: False
    
    runcmd:
      - sudo touch /etc/cloud/cloud-init.disabled""" > /kvm-volumes-hdd/vps-test/cloud_init.cfg

    Bước 3: Tạo file cấu hình network cho máy ảo.

    echo '''version: 2
    ethernets:
      enp1s0:
         dhcp4: false
         addresses: [ 192.168.13.231/23 ]
         gateway4: 192.168.12.5
         nameservers:
           addresses: [ 1.1.1.1, 8.8.8.8 ]'''> /kvm-volumes-hdd/vps-test/network_config_static.cfg

    Bước 4: Hãy tạo 1 volume ảo, mình cho dung lượng ổ cứng của máy ảo này là 10GB, trỏ volume ảo này đến file image hệ điều hành mà bạn mong muốn. Mình sử dụng hệ điều hành Ubuntu 18.04 nên mình sẽ trỏ đến image bionic-server-ubuntu1804-cloudimg-amd64.img đã download sẵn trong thư mục /kvm-volumes-hdd/images/

    $ qemu-img create -b /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img -f qcow2 /kvm-volumes-hdd/vps-test/os-vps-test.qcow2 10G
    Formatting '/kvm-volumes-hdd/vps-test/os-vps-test.qcow2', fmt=qcow2 size=10737418240 backing_file=/kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img cluster_size=65536 lazy_refcounts=off refcount_bits=16

    Xác nhận lại volume vừa tạo.

    $ qemu-img info /kvm-volumes-hdd/vps-test/os-vps-test.qcow2
    image: /kvm-volumes-hdd/vps-test/os-vps-test.qcow2
    file format: qcow2
    virtual size: 10 GiB (10737418240 bytes)
    disk size: 196 KiB
    cluster_size: 65536
    backing file: /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img
    Format specific information:
        compat: 1.1
        lazy refcounts: false
        refcount bits: 16
        corrupt: false

    Bước 5: Tạo 1 volume khác để mount 2 file cloud_init.cfg network_config_static.cfg. Mục đích để khi khởi tạo máy ảo, hệ thống sẽ load toàn bộ thông tin lưu ở 2 file config này vào máy ảo.

    $ cloud-localds -v --network-config=/kvm-volumes-hdd/vps-test/network_config_static.cfg /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2 /kvm-volumes-hdd/vps-test/cloud_init.cfg
    wrote /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2 with filesystem=iso9660 and diskformat=raw

    Xác nhận lại việc tạo volume thành công.

    $ qemu-img info /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2
    image: /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2
    file format: raw
    virtual size: 368 KiB (376832 bytes)
    disk size: 368 KiB

    Sau khi chuẩn bị trong các bước trên, hãy chắc chắn rằng các thành phần của bạn đã đầy đủ, hãy tham khảo cây thư mục của mình ở bên dưới.

    /kvm-volumes-hdd/
    ├── images
    │   ├── bionic-server-ubuntu1804-cloudimg-amd64.img
    │   ├── CentOS-7-x86_64-GenericCloud.qcow2c
    │   ├── focal-server-ubuntu2004-cloudimg-amd64.img
    │   └── jammy-server-ubuntu2204-cloudimg-amd64.img
    ├── network_xml
    │   ├── bridged-network.xml
    └── vps-test
        ├── cloud_init.cfg
        ├── network_config_static.cfg
        ├── os-vps-test.qcow2
        ├── ssh-keygen
        │   ├── id_rsa
        │   └── id_rsa.pub
        └── vps-test-seed.qcow2

    Bước 6: Khởi tạo máy ảo

    Sau khi chuẩn bị xong các volume, bạn hãy chạy lệnh dưới để triển khai 1 máy ảo mới có tên vps-test. Kết quả trả về Domain creation completed cho thấy bạn đã khởi tạo thành công máy ảo.

    $ virt-install --name vps-test \
      --virt-type kvm --memory 4096 --vcpus 4 \
      --boot hd,menu=on \
      --disk path=/kvm-volumes-hdd/vps-test/vps-test-seed.qcow2,device=cdrom \
      --disk path=/kvm-volumes-hdd/vps-test/os-vps-test.qcow2,device=disk \
      --graphics vnc \
      --os-type Linux --os-variant ubuntu18.04 \
      --network network:bridged-network \
      --console pty,target_type=serial \
      --noautoconsole 
    
    Starting install...
    Domain creation completed.

    Mình triển khai máy ảo này trên kvm-node01, sử dụng virsh list –all để list tất cả các máy ảo, bạn sẽ thấy máy ảo vps-test đang ở trạng thái running.

    root@kvm-node01:~# ip a | grep 192.168.13.227
        inet 192.168.13.227/23 brd 192.168.13.255 scope global br0
    
    root@kvm-node01:~# virsh list --all
     Id   Name       State
    --------------------------
     5    vps-test   running

    Kết quả ping vào máy ảo.

    root@kvm-node01:~# ping 192.168.13.231
    PING 192.168.13.231 (192.168.13.231) 56(84) bytes of data.
    64 bytes from 192.168.13.231: icmp_seq=1 ttl=64 time=0.330 ms
    64 bytes from 192.168.13.231: icmp_seq=2 ttl=64 time=0.306 ms
    64 bytes from 192.168.13.231: icmp_seq=3 ttl=64 time=0.238 ms
    
    --- 192.168.13.231 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2045ms
    rtt min/avg/max/mdev = 0.238/0.291/0.330/0.038 ms

    Như thông tin đã khai báo ở trên, bây giờ bạn có thể ssh vào máy ảo vps-test bằng username ubuntu sử dụng sshkey hoặc username/passwordhoanghd/hoanghd.

    ssh -i /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa ubuntu@192.168.13.231

    Bước 7: Kết nối qemu giữa hai KVM host.

    Để có thể live migrate giữa hai host thì ba host này cần phải kết nối được với nhau. Để làm được việc này ta thực hiện các bước sau ở trên cả ba máy host KVM.

    sed -i 's/#listen_tls = 0/listen_tls = 0/g' /etc/libvirt/libvirtd.conf 
    sed -i 's/#listen_tcp = 1/listen_tcp = 1/g' /etc/libvirt/libvirtd.conf
    sed -i 's/#tcp_port = "16509"/tcp_port = "16509"/g' /etc/libvirt/libvirtd.conf
    sed -i 's/#listen_addr = "192.168.0.1"/listen_addr = "0.0.0.0"/g' /etc/libvirt/libvirtd.conf
    sed -i 's/#auth_tcp = "sasl"/auth_tcp = "none"/g' /etc/libvirt/libvirtd.conf
    sed -i 's/#LIBVIRTD_ARGS="--listen"/LIBVIRTD_ARGS="--listen"/g' /etc/sysconfig/libvirtd

    Restart lại libvirtd trên cả ba máy kvm node.

    sudo systemctl restart libvirtd

    Bước 8: Thay đổi file cấu hình mặc định của máy ảo, sử dụng lệnh virsh edit <tên máy ảo>.

    root@kvm-node01:~# virsh edit vps-test

    Tìm đến phần config CPU, chúng ta chỉnh sửa lại 2 thông số của CPU để kvm có thể migrage được khi 2 node kvm khác loại CPU.

    <cpu mode='host-model' check='partial'/> 

    Tại cpu mode chỉnh sửa host-model thành host-passthrough, tại tuỳ chọn check chỉnh sửa partial thành none.

    <cpu mode='host-passthrough' check='none'/>

    Tìm đến phần config của disk và chỉnh 1 số thông tin như sau.

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm-volumes-hdd/vps-test/os-vps-test.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </disk>

    Tại config <driver name=’qemu’ type=’qcow2’/> hãy thêm 1 tuỳ chọn mới cache=’none’ như ở dưới. Tuỳ chọn này sẽ giúp tránh rủi ro mất mát dữ liệu khi live migrage.

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/kvm-volumes-hdd/vps-test/os-vps-test.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </disk>

    Nếu edit thành công, bạn lưu lại sẽ có thông báo như dưới.

    root@kvm-node01:~# virsh edit vps-test
    Domain vps-test XML configuration edited.

    Để thay đổi có hiệu lục, tiến hành shutdown và start lại máy ảo.

    root@kvm-node01:~# virsh shutdown vps-test
    Domain vps-test is being shutdown
    
    root@kvm-node01:~# virsh start vps-test
    Domain vps-test started

    Để kiểm tra kết quả live migrage hãy sử dụng 1 máy nào đó ssh vào máy ảo vps-test và bạn hãy thả ping tới 8.8.8.8 để kiểm tra rớt gói khi live migrage.

    ssh -i /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa ubuntu@192.168.13.231

    Trong khi máy ảo vps-test vẫn đang ping tới 8.8.8.8 thì bạn tiến hành migrage sang 1 node kvm khác (ví dụ mình sẽ migrage sang kvm-node02).

    root@kvm-node01:~# virsh migrate --live vps-test qemu+ssh://kvm-node02.hoanghd.com/system

    Chỉ mất khoảng 5-10s, bạn máy ảo vps-test đã migrage thành công sang kvm-node02, trên kvm-node02 sử dụng lệnh virsh list –all để kiểm tra máy ảo thì bạn thấy máy ảo vps-test đang ở chế độ running.

    root@kvm-node02:/kvm-volumes-hdd# virsh list --all
     Id   Name       State
    --------------------------
     6    vps-test   running

    Quay lại màn hình ping 8.8.8.8 của máy ảo vps-test bạn sẽ thấy session ssh không bị rớt và quá trình migrage của mình chỉ mất 3 gói tin (27/30).

    ubuntu@vps-test:~$ ping 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=41.6 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=41.2 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=43.1 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=41.1 ms
    64 bytes from 8.8.8.8: icmp_seq=5 ttl=116 time=40.4 ms
    64 bytes from 8.8.8.8: icmp_seq=6 ttl=116 time=41.5 ms
    64 bytes from 8.8.8.8: icmp_seq=7 ttl=116 time=40.8 ms
    64 bytes from 8.8.8.8: icmp_seq=8 ttl=116 time=40.5 ms
    64 bytes from 8.8.8.8: icmp_seq=9 ttl=116 time=41.7 ms
    64 bytes from 8.8.8.8: icmp_seq=10 ttl=116 time=45.1 ms
    64 bytes from 8.8.8.8: icmp_seq=11 ttl=116 time=41.3 ms
    64 bytes from 8.8.8.8: icmp_seq=12 ttl=116 time=45.2 ms
    64 bytes from 8.8.8.8: icmp_seq=13 ttl=116 time=44.9 ms
    64 bytes from 8.8.8.8: icmp_seq=14 ttl=116 time=41.3 ms
    64 bytes from 8.8.8.8: icmp_seq=15 ttl=116 time=41.5 ms
    64 bytes from 8.8.8.8: icmp_seq=16 ttl=116 time=41.7 ms
    64 bytes from 8.8.8.8: icmp_seq=17 ttl=116 time=41.3 ms
    64 bytes from 8.8.8.8: icmp_seq=18 ttl=116 time=41.4 ms
    64 bytes from 8.8.8.8: icmp_seq=19 ttl=116 time=47.1 ms
    64 bytes from 8.8.8.8: icmp_seq=20 ttl=116 time=42.5 ms
    64 bytes from 8.8.8.8: icmp_seq=21 ttl=116 time=42.2 ms
    64 bytes from 8.8.8.8: icmp_seq=22 ttl=116 time=42.9 ms
    64 bytes from 8.8.8.8: icmp_seq=26 ttl=116 time=45.7 ms
    64 bytes from 8.8.8.8: icmp_seq=27 ttl=116 time=41.3 ms
    64 bytes from 8.8.8.8: icmp_seq=28 ttl=116 time=43.1 ms
    64 bytes from 8.8.8.8: icmp_seq=29 ttl=116 time=45.3 ms
    64 bytes from 8.8.8.8: icmp_seq=30 ttl=116 time=41.6 ms
    
    --- 8.8.8.8 ping statistics ---
    30 packets transmitted, 27 received, 10% packet loss, time 29114ms
    rtt min/avg/max/mdev = 40.484/42.548/47.137/1.797 ms

    Tổng kết

    Đến đây bạn đã có thể thiết lập để live migrate thành công. Trong bài viết chắc chắn còn nhiều thiếu sót rất mong được sự góp ý của các bạn.

    Chúc bạn thành công!

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email