[KVM] Live Migration

gununoo·2022년 8월 1일
2

KVM

목록 보기
1/4
post-thumbnail

NAS vs SAN

https://www.fiber-optic-tutorial.com/nas-vs-san-differences.html/nas-vs-san

NAS

  • ip로 통신
  • best effort -> 지터, 버터링 발생

SAN

  • ip로 통신하는 대신 Fiber channel로 통신한다.
  • FC(fiber channel) -> WWN으로 통신
  • FCoE(Fiber Channel over Ethernel): 서로 다른 zone 간의 FC에 L2 구간을 만들어서 통신함
  • FCIP
  • ISCSI

Hypervisor

https://www.vembu.com/blog/type-1-and-type-2-hypervisor/

Type 2(HostBased HV)

  • VM의 APP이 Guest OS의 커널을 거치고, Host OS의 커널을 거친다.
  • 커널을 두 번 거치면서 퍼포먼스 저하가 발생한다.
  • VMware Work Station이 사용하는 방식

Type 1(Baremetal)

  • Hypervisor가 커널에 있어서 퍼포먼스 저하가 거의 없다.
  • ESX(VMware)는 안정성이 뛰어나다.
  • KVM(linux)은 확장성이 뛰어나다.
  • Hyper-V(MS)는 윈도우에 탑재되어있다.

3 node architecture

https://docs.oracle.com/cd/E69402_01/html/E74916/archover.html

NETWORK

  • VPC(셔브넷)
  • DHCP
  • NAT
  • LB(HAproxy)

CONTROL

  • 인증 서비스
  • 사용자 접속
  • 작업 지시
  • Database

COMPUTE

  • cpu, ram -> 가상화(Hypervisor)
  • STORAGE와 연결

STORAGE

  • block storage
  • object storage
  • file storage

실습 환경 구성

실습을 위한 KVM spec

KVM1

  • 용도: compute
  • 4 cores
  • ram 6144 mb
  • 외부(VMnet10): 211.183.3.101
  • 마이그레이션, storage 연결(VMnet1): 172.16.1.101
  • 관리용(VMnet2): 172.16.2.101
  • 디스크 용량: 20GB (auto partitioning)
  • Server with GUI

KVM2

  • 용도: compute
  • 4 cores
  • ram 6144 mb
  • 외부(VMNet10): 211.183.3.102
  • 마이그레이션, storage 연결(VMnet1): 172.16.1.102
  • 관리용(VMnet2): 172.16.2.102
  • 디스크 용량: 20GB (auto partitioning)
  • Server with GUI

STORAGE

  • 용도: storage
  • 2 cores
  • ram: 2048 mb
  • 외부(VMNet10): 211.183.3.100
  • 마이그레이션, storage 연결(VMnet1): 172.16.1.100
  • 관리용(VMnet2): 172.16.2.100
  • 디스크 용량: 120GB (/cloud: 100GB, swap: 4GB, /boot: 1GB, /: 나머지)
  • minimum install

네트워크 설정 변경

virtual network editor

VM 생성

KVM1 생성
disk: 20GB
power on this vm after creation 체크해제
메모리 6144mb
processors: core 1, processors 4
VT-x 체크
CD/DVD(autoinst.iso) 제거
usbcontroller, soundcard, printer 제거
network adapter: vmnet10
network adapter 2: vmnet1
network adapter 3: vmnet2

KVM2도 같은 방식으로 생성
(간혹 Clone을 했을 때 인터페이스 문제가 발생하기도 함)

STORAGE도 같은 방식으로 생성
disk 120GB
RAM 2048 mb
processors: core 1, processors 2

VM power on
install centos7
date/time: seoul
[KVM1, KVM2]
software selection: server with GUI

[STORAGE]
software selection: minimal installation
installation destination -> i will continue partitioning
swap: 4096, /boot: 1024, /: 15 GB, /cloud: 나머지

[KVM1]
network & hostname

  • hostname: kvm1

ens32 (인터넷 연결용)

  • general -> automatically connect to this network when it is available 체크
  • ipv4 -> manual -> ip: 211.183.3.101, netmask: 24, DG: 211.183.3.2, DNS: 8.8.8.8

ens33 (스토리지 연결, 마이그레이션)

  • general -> automatically connect to this network when it is available 체크
  • ipv4 -> manual -> ip: 172.16.1.101, netmask: 24, DG: NULL, DNS: NULL

ens34 (관리용, ssh 연결)

  • general -> automatically connect to this network when it is available 체크
  • ipv4 -> manual -> ip: 172.16.2.101, netmask: 24, DG: NULL, DNS: NULL

begin installation
root password 설정
user creation -> make this user administrator 체크

KVM2와 STORAGE도 마찬가지 방식으로 설정

설치 후 확인해야 할 사항

1. 통신 확인

[kvm1/kvm2]

ifconfig 
ping www.google.com 

[storage]

ip addr show 
ip addr list 
ping www.google.com

[kvm1]

ping 211.183.3.102 -c 3 
ping 172.16.1.102 -c 3 
ping 172.16.2.102 -c 3 

ping 211.183.3.100 -c 3 
ping 172.16.1.100 -c 3 
ping 172.16.2.100 -c 3 

2. 패키지 설치

yum -y update && yum -y install net-tools curl vim git wget 

3. vim 설정

vim ~/.bashrc
alias vi='vim'

-> 한 줄 추가

su 

.bashrc 는 해당계정이 처음 로그인 할때 읽어들이는 파일이다. 만약 파일의 내용이 변경되었다면 이를 현재 환경에 적용하기 위해서는 1. 재 로그인(su) 2. .bashrc 파일(source ~/.bashrc)을 현재 환경에 적용시키는 방법이 있다.

4. 방화벽(firewalld), 네트워크 매니저(NetworkManager), SELinux 비활성화

방화벽: 서버에서 발생한 트래픽, 서버로 들어오는 트래픽, 서버를 통과하는 트래픽에 대한 보안 설정이 가능하다. (allow, deny)
네트워크 매니저: 일반적으로 워크스테이션용 OS에서 자동으로 wifi를 연결하거나 ip 주소를 변경했을 때 이를 설정 파일에 즉시 적용하고 재활성화시키는 기능이 있어 일반 사용자들에게는 편리한 도구이다.
SELinux: 서버 내부 자원으로의 접근에 대한 보안 설정을 담당한다. 일반적으로 애플리케이션들의 기본 경로 등을 변경하는 작업을 하지 못하도록 차단한다. KVM에서 이미지의 기본 저장 경로는 /usr/lib/...에 있다. 우리는 이를 외부에있는 /cloud를 사용해야 하므로 별도의 디렉토리와의 마운트가 필요하다. 기본적으로 SELinux는 이를 차단한다.

systemctl stop firewalld 
systemctl disable firewalld 
systemctl stop NetworkManager 
systemctl disable NetworkManager 
setenforce 0 
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
[root@kvm1 ~]# systemctl status firewalld | grep Active
   Active: inactive (dead)
[root@kvm1 ~]# systemctl status NetworkManager | grep Active
   Active: inactive (dead) since Mon 2022-08-01 13:48:37 KST; 41s ago
[root@kvm1 ~]# getenforce
Permissive

5. (kvm 노드에서만) 인터페이스 이름 변경(ens32 -> eth0)

참고: https://velog.io/@ptah0414/Linux-22-07-21-TIL#인터페이스-이름-변경ens32---eth0

  1. grub 편집
vi /etc/default/grub 
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"

-> 한 줄 수정

  1. ifcfg 편집
[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]# ls ifcfg-*
ifcfg-ens32  ifcfg-ens33  ifcfg-ens34  ifcfg-lo
[root@kvm1 network-scripts]# cat ifcfg-ens32 | grep IPADDR
IPADDR=211.183.3.101
[root@kvm1 network-scripts]# vi ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8

위와 같이 수정

[KVM2]

TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=211.183.3.102
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8

위와 같이 수정

  1. 변경된 내용을 부팅할 때 읽어들이는 커널에 적용
grub2-mkconfig -o /boot/grub2/grub.cfg
  1. KVM1/KVM2를 재부팅한다
reboot

ens33과 ens34도 마찬가지 방식으로 각각 eth1, eth2로 변경하기

KVM 설치

[KVM1/KVM2]

yum -y install libvirt 
yum -y install qemu-kvm 
yum -y install virt-install 
yum -y install virt-manager 
yum -y install openssh-askpass 
yum -y install libguestfs-tools 
  • libvirt: KVM 데몬(libvirtd -> systemctl start libvirtd)
  • qemu-kvm: 가상머신의 커널과 호스트의 커널 사이에 배치되어 둘 사이의 코드 변환을 해주는 모듈
  • virt-install: 가상 머신 설치를 위한 cli 도구 virsh
    virt-install(설치해!) --> virsh --> libvirtd에게 전달
  • openssh-askpass: 독립적인 호스트에서는 필요하지 않다. 두 대 이상의 호스트가 연결되어있고 각 호스트에 있는 가상머신을 타 호스트로 마이그레이션하고자 하는 경우 이를 승인하기 위한 도구가 필요하다. 이를 담당하는 것이 openssh-askpass이다. 결국 vm의 이동은 ssh를 이용하는 것이다.
  • libguestfs-tools: 일반적인 iso파일을 이용하여 가상머신을 설치하는 것이 아니라 virt-customize, virt-builder를 이용하여 필요한 볼륨을 생성하고자 하는 경우 기본 이미지에 대한 수정이 가능해야 하는데 이를 담당하는 것이 libguestfs-tools(virt-customize, virt-resize, virt-builder와 같은 도구가 모두 포함되어 있다)에 포함되어있다.

NFS 마운트

이제 우리는 storage에 있는 /cloud를 kvm1, kvm2의 /remote에서 마운트하여 사용할 예정이다.
https://velog.io/@ptah0414/Linux-22-07-20-TIL#nfs 참고

Storage 설정

  1. storage에서의 설정
yum -y install nfs-utils
  1. vi /etc/hosts 에 아래 내용 추가
vi /etc/hosts
172.16.1.101    kvm1
172.16.1.102    kvm2
172.16.1.100    storage
  1. /cloud 를 외부에 노출시키기 위한 설정
vi /etc/exports
/cloud  kvm1(rw,sync,no_root_squash)
/cloud  kvm2(rw,sync,no_root_squash)

no_root_squash -> 원격지에 있는 사용자가 공유 디렉토리에서 파일을 만들었을 경우 서버 입장에서 해당 파일을 누가 만든 것으로 간주할 것인가?
만약 root_squash라고 하면 nfsnobody가 만든 것이다.
하지만 no_root_squash라고 하면 root가 만든 것이다.

  1. nfs-server 시작
systemctl enable nfs-server
systemctl start nfs-server 
  1. cloud 디렉토리에 대한 퍼미션을 조정
chmod 777 /cloud 

KVM1/KVM2 설정

  1. nfs-utils 설치하기

[kvm1/kvm2]

yum -y install nfs-utils
  1. vi /etc/hosts 파일에 아래의 내용 입력하기

[kvm1/kvm2]

vi /etc/hosts
172.16.1.101    kvm1
172.16.1.102    kvm2
172.16.1.100    storage
  1. 로컬에 /remote 디렉토리 생성하기

[kvm1/kvm2]

mkdir /remote 
  1. mount를 이용하여 storage:/cloud에 있는 디렉토리를 로컬의 .remote에 마운트시킨다.
    [kvm1/kvm2]
showmount -e storage
mount -t nfs storage:/cloud /remote 
  1. kvm1 에서 /remote 에 생성한 test.txt 파일을 kvm2 에서 ls /remote 했을 때 볼 수 있어야 한다

[kvm1]

touch /remote/test.txt 

[kvm2]

[root@kvm2 ~]# ls /remote
test.txt
  1. 재부팅 이후에도 위에서 설정한 마운트 정보를 계속 유지되어야 한다!!
    https://velog.io/@ptah0414/Linux-22-07-21-TIL#6-etcfstab%EC%97%90-%EA%B8%B0%EB%A1%9D 참고

[kvm1/kvm2]

vi /etc/fstab
storage:/cloud          /remote                 nfs     defaults        0 0

-> 한 줄 추가

reboot 
[root@kvm1 ~]# df -h | grep /cloud 
storage:/cloud           101G  156M  101G   1% /remote
  1. root만 qemu 설정할 수 있도록 하기

[kvm1/kvm2]

vi /etc/libvirt/qemu.conf
442 user = "root"
443 
444 # The group for QEMU processes run by the system instance. It can be
445 # specified in a similar way to user.
446 group = "root"

442, 446 주석 제거

systemctl enable libvirtd 
systemctl restart libvirtd 

KVM ssh 연결

virtual machine manager -> file -> add connection
[KVM1]
connect to remote host 체크
hostname: kvm2
autoconnect 체크

yes 입력
root pw 입력

kvm2와 연결 설정되었음

[KVM2]
connect to remote host 체크
hostname: kvm1
autoconnect 체크

yes 입력
root pw 입력

kvm1과 연결 설정되었음

가상머신 설치하기

iso
-> 설치용 디스크
qcow2
-> volume(디스크)
-> os가 이미 설치되어있음

iso 파일로 가상머신 설치하기

[kvm1]

cd /remote 
wget http://mirror.kakao.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
[root@kvm1 remote]# virt-install --name test1 \
> --vcpus 1 \
> --ram 1024 \
> --cdrom=/remote/vyos-1.1.8-amd64.iso \
> --disk /remote/test1.qcow2,size=5 \
> --network network:default \
> --graphics vnc,port=5901 \
> --noautoconsole

KVM1에 test1 머신 생성되었음
[KVM1]

KVM2에서도 KVM1의 test1 머신을 확인할 수 있음
[KVM2]

KVM migrate

KVM1 -> KVM2 migrate

[KVM1]
동작 중인 상태에서 kvm2로 migrate할 것임
test1 우클릭 -> migrate
advanced option -> address: kvm1, allow unsafe 체크 -> migrate

KVM2로 넘어간 것을 확인할 수 있음
[KVM1]

[KVM2]

KVM1 <- KVM2 migrate

KVM2에 있는 test1을 다시 KVM1으로 migrage해보기
[KVM2]
test1 우클릭 -> migrate
advanced option -> address: kvm2, allow unsafe 체크 -> migrate

KVM1으로 넘어간 것을 확인할 수 있음
[KVM1]

[KVM2]

이미지 파일

[root@kvm1 remote]# ls
test1.qcow2  vyos-1.1.8-amd64.iso

-> iso로 설치하면서 qcow2 파일이 생성되었음
-> 이 qcow2를 base image로 다른 인스턴스들을 생성할 수 있음
(인스턴스들을 생성할 때 public key를 넣는 것이 좋음)
-> iso는 template용으로 쓰기에 적합하고, 클라우드에서 사용하기에는 적합하지 않음
-> 클라우드에서는 qcow2를 쓰는 것이 적합함

vrish 명령어

[root@kvm2 ~]# virsh list --all --name 
test1
[root@kvm2 ~]# for vm in $(virsh list --all --name)
> do virsh destroy $vm ; done 
Domain test1 destroyed

전체 종료나 삭제 명령은 없다.

실습 환경 종료하기
kvm1 -> kvm2 -> storage 순으로 종료

실습 환경 실행하기
storage -> kvm1 -> kvm2 순으로 실행
kvm1/kvm2에서 mount 정보 확인

systemctl status libvirtd 

getenforce -> disable로 나와야 함


커널업데이트(yum 이용) -> https://nirsa.tistory.com/64

profile
take a look

0개의 댓글