Thursday, November 21, 2024

[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!

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories