본문 바로가기
Development(Web, Server, Cloud)/Cloud : 정리

5. 클라우드 가상화(KVM, Libvirt)

by tonyhan18 2022. 2. 24.
728x90

클라우드 가상화를 위한 리눅스

1. 클라우드와 가상화의 이해

하이퍼바이저의 두가지 형태

type1

 호스트 OS 내(커널)에 또는 호스트 OS 위치에 하이퍼바이저가 배치되는 형태

이건 VM이 하이퍼바이저와 직접 통신할 수 있다. 그래서 직접응답이 가능해진다.

(KVM, ESXi(VMWARE), Hyper-V(MS), XenServer(Citrix))

속도가 빠름 -> 기업데이터센터용

 

type2

호스트 OS 위에 Application 형태로 배치되는 형태

여기의 하이퍼바이저는 OS까지 내려가야 정상 통신이 가능해진다.

(VMware WorkStation, Virtual Box, Virtual PC)

 

 

 

2. 리눅스 인프라 가상화 : KVM

실습환경 구성

STORAGE는 shared라는 공간을 만들고 그 공간을 KVM1, KVM2가 공유해서 사용하게끔 하자. 그래서 STORAGE의 shared 공간을 /cloud 공간에 마운트해서 사용하게끔 하자. 그런데 shared는 NFS의 공유저장소로 사용된다.

 

그래서 그림으로 치면 스위치가 3개가 있고 거기에 서버들이 연결된 구조이다.

여기에서도 첫번째 스위치는 공유기에 연결되어 있고(DG : 211.183.3.2)

나머지 스위치들은 자기들끼리만 연결된 구조이다.

 

이때의 각각의 인터페이스의 역활

eth0 -> 인터넷으로 연결하는 용도, 처음 패키지 설치용도

eth1 -> 내부 스토리지, DB 연결용 -> 이때의 DB를 가지고 웹과 연결하여 정보를 보여줄 수 있다.

eth2(중요) -> VM 관리용/VM 이동용( [live 동작중] migration )

 

위와같이 만든 이유는 KVM1의 CPU, RAM은 빠르지만 STORAGE의 결과가 KVM1으로 오는건 느리기 때문에 별도의 스위치를 만들었다.

 

Storage를 실행한다음에 먼저 처리하자

한다음 위와같이 hosts를 먼저 등록해놓자

 

패키지 설치, 환경구성

자 이제 KVM1, KVM2 -> kvm을 설치, (가상머신/가상네트워크/가상스토리지) 관리도구 필요 (CLI, GUI) - wok(kimchi), nfs-utils(client)

CLI -> virsh

GUI -> KVM이 설치된 OS가 GUI(Server with GUI) : virt-manager

      -> KVM이 설치된 OS가 GUI(minimal install) : kimchi (CentOS는 불가 -> wok 패키지가 내부에 kimchi 모듈을 사용하여 접근)

 

STORAGE -> storage를 제공한다. (NFS 형태의 파일 스토리지[디렉토리] 제공)

스토리지 종류

1. file storage(파일/디렉토리를 마운트) -> NFS, NAS

 - nfs-utils(server, client 포함)

2. block storage(volume을 제공) -> mount( iSCSi ), EBS(elastic block store@aws), cinder@openstack

3. object storage(사용자별로 일정 저장공간 제공 - 계정만 있다면 어디서나 접근) -> 서버연결용 X, 구글 드라이브, s3@aws, swift@openstack

 

step 1. [KVM1/KVM2]

yum -y update

yum -y install qemu-kvm libvirt virt-install openssh-askpass virsh libguestfs-xfs

 

- qemu-kvm

물리자원 위에 Linux가 있고 kvm(kernel)로 설치가 되어 있다. 그리고 이 위에는 qemu-kvm이 설치되는데 여기에 가상머신들이 설치된다. 문제는 vm이 직접 KVM으로 접근이 불가능하다. 그래서 이걸 먼저 qemu-kvm에 전달한다. kvm은 결과를 qemu-kvm에 전달해주면 vm에 결과를 반환해준다. 즉 qemu-kvm은 vm과 kvm 사이를 연결한다.

 

- libvirt

httpd처럼 서비스를 위한 설정파일을 읽고 실재로 만드는 놈이다. 즉 KVM 서비스를 위한 데몬, 설정파일을 읽고 적절한 서비스를 생성한다. 만약 가상네트워크를 만들었다면 그걸 반영하기 위해서는 libvirt를 재실행해야만 한다. 예) 새로운 가상네트워크 생성했다면 재실행해야한다.

 

- virt-install

가상머신/네트워크등의 가상자원 생성도구

 

- virsh

kvm 환경 관리위한 전용 쉘

 

- openssh-askpass

마이그레이션 도구

vm을 그냥 가상머신을 다른쪽에 던진다고 받아주는 것이 아니다. 그래서 vm을 다른쪽으로 넘기기 위해서는 상대의 패스워드를 알아야한다. 그때 물어보는게 openssh-askpass이다. 그래서 라이브 마이그레이션을 위한 인증도구이다.

 

- libguestfs-xfs

 

step2. 환경구성

### storage에서 ###
vi /etc/exports

# 안에 아래 내용넣기
/shared  192.168.1.101(rw,sync,no_root_squash)
/shared  192.168.1.102(rw,sync,no_root_squash)

# 아래 명령어 실행
systemctl restart nfs-server
systemctl enable nfs-server
chmod +777 /shared



### cloud에서 ###
mkdir cloud
mount -t nfs 192.168.1.199:/shared /cloud
touch /cloud/test.txt

rw : 192.168.1.101은 /shared에 데이터 읽고/쓰기 가능

sync : 클라이언트가 작성한 데이터는 항상 확인작업을 거침(<->async)

no_root_squash : 원격지 192.168.1.101이 nfs 서버에서 작업을 진행할 경우 누구의 권한으로 실행되는가? 원격지 사용자를 로컬의 root로 인정

 

### kvm1/kvm2
vi /etc/fstab

컴퓨터 재 실행시에 마운트 유지를 위해 아래와 같이 작성해주자

첫번째 0은 이 mount 연결정보 확인안함(<->1)

두번째 0은 확인하는 순서이다

 

step3. 관리툴(kimchi) 설치

### kvm1/kvm2
yum -y install epel-release

# 설치
wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm
wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
yum install -y wok-2.5.0-0.el7.centos.noarch.rpm --skip-broken
yum install -y kimchi-2.5.0-0.el7.centos.noarch.rpm --skip-broken

# 연결유지
sed -i 's/^#session_timeout = .*/session_timeout = 1440/g' /etc/wok/wok.conf

# 작동
systemctl enable wokd
systemctl start wokd

# 확인
netstat -antp |grep 8001

private IP로 들어가면 위와같은것이 나온다. 여기에서 컨트롤 가능(단, 접속시 centOS 접속 ID/PW로 들어가기)

 

 

실습1-1 : vyos, 가상 방화벽

- 가상머신 네트워크 virbr

그리고 가상머신을 만드는데 별도의 네트워크를 지정하지 않거나 수동으로 지정할 수 있다.

(--network network:default) 왼쪽과 같이 지정해놓으면 virbr0(sw)라는 default 네트워크에 연결한다.

virbr0는 NAT의 기능을 가지고 있기 때문에 192.168.122.0/24를 사용하기 때문에 KVM1에 있는 211.183.3.101을 타고서 나가게 된다.(eth0에 정의한거)

 

가상머신은 virbr0가 DHCP 기능을 해준다.

 

# 네트워크 확인
virsh net-list --all

#가상머신 리스트
virsh list --all

# 가상머신 리스트 이름만
virsh list --all --name

Autostart : KVM실행시 이거 자동으로 실행할것인가를 물어본다. 가급적 yes로 처리

Persistent : 영구적인 설정유지여부

 

네트워크의 실제 구성내용?

(가상머신/가상 네트워크의 실체 -> xml 파일 -> libvirt가 읽고 파일 내용에 맞는 서비스를 생성해내는 것이다.)

 

# default 네트워크의 구성 내용을 마치 cat으로 읽어보는 것과 동일
virsh net-dumxml default

# default 네트워크 수정가능
virsh net-edit default

uuid : 유니크한 장치번호 -> 나중에 설정을 유지해서 옮기는 용도

forward mode='nat' : 이 뒤의 가상머신이 default network(virbr0)를 통해서 네트워크로 빠져나갈 수 있는 기능 제공

-> 만약 이게 없다면 네트워크 기능을 수행못한다.

bridge name 존재

ip는 dhcp를 통해서 자동으로 할당받는다.

 

Index of /pub/vyos/iso/release/1.1.8 (yamagata-u.ac.jp)

 

Index of /pub/vyos/iso/release/1.1.8

 

ftp.yz.yamagata-u.ac.jp

vyos : 무료로 사용할 수 있는 방화벽

vyos 1.1.8을 다운받자 -> 여기에서 amd64.iso 를 받자

 

- 파일 확장자

iso 파일 : 설치용 미디어, 디스크를 별도로 마련하여 해당 디스크에 OS를 설치하는 과정 필요(--cdrom 으로 사용)

qcow2 파일 : OS가 설치되어 있는 volume 그래서 여기에다가 cpu, memory만 연결해주면 된다.(--import 를 사용)

 

 

virt-install --name fw01 --vcpus 1 --ram 1024 \
--network network:default \
--disk path=/cloud/fw01.qcow2,size=5 \
--cdrom /cloud/vyos.iso

위의방식은 iso이미지를 가지고 설치하는 모습이다. qcow2와는 다르게 이건 직접설치해주어야 한다.

 

 

Wok에 들어가면 위와같이 나온다.

연결방법은 두가지가 있다.

1. Console : 서버에 원격지에서 연결하는 방법(ip주소로 스위치 타고 접속 - CLI/GUI)

2. Serial : 장치에 IP 없이 직접 접속하는 방법(ip가 없을때 그냥 로컬 PC로 접속 - CLI)

 

Serial

- id : vyos

- pw : vyos

로 접속해보자

 

# fw01가 가진 랜카드들을 보여준다.
virsh domiflist fw01

# 하면 fw01의 ip가 보인다.
virsh domifaddr fw01
# 가상머신 시작
virsh start fw01

# 가상머신 중지
virsh destroy fw01

# 가상머신 삭제
virsh undefine fw01 --remove-all-storage

# 가상머신 사용
virsh console fw01

 

### vyos 내부에서
# 네트워크 인터페이스 확인
show interfaces

# dhcp 기능 사용
config
set interfaces ethernet eth0 address dhcp
commit
save

run show int

 

실습1-2 : 마이그레이션

# 현재 작동중인것을 옮길 수 있다.
# 드라이버가 nfs로 공용이기 때문에 가능
virsh migrate --live fw01 qemu+ssh://kvm2/system --unsafe

 

실습1-3 : 네트워크 생성 + 마이그레이션

# 일단 기존 네트워크 끌고오기
virsh net-dumpxml default > banana.xml

uuid는 libvirtd가 xml을 읽으면서 MAC과 uuid 를 자동할당해준다.

# 네트워크 등록
virsh net-define banana.xml

# 네트워크 실행 + 상시
virsh net-start banana
virsh net-autostart banana

# 생성된 네트워크를 VM 연결하기
virsh attach-interface --domain fw01 --type network --source banana \
--model virtio --config --live

 

이상태에서 kvm2로 마이그레이션하면 안넘어간다.

이유는 banana라는 네트워크가 kvm2에 등록되어 있지 않아서이다.

 

# 파일 복사하기
scp banana.xml root@kvm2:/root/banana.xml
scp banana.xml kvm2:/root/banana.xml  # authorized_keys 등록시

# 그냥 명령 보내기
ssh kvm2 virsh list --all

이 상태에서 cirros를 이용한 작은 가상머신을 만들어보자

 

Index of /0.5.0 (cirros-cloud.net)

 

Index of /0.5.0

 

download.cirros-cloud.net

위쪽 경로에서 cirros 0.5.0-x86_64-disk.img를 받아오자

 

virt-install --name cirros001 --vcpus 1 --ram 512 \
--network network:banana \
--disk /cloud/cirros.img --import --noautoconsole

이제 없애자

# 가상머신 없애기
virsh destroy cirros001
virsh undefine cirros001 --remove-all-storage


# 네트워크 없애기
virsh net-destroy banana
virsh net-undefine banana

 

 

실습 1-정리

# 압출풀고 이름 바꾸기
xz -d CentOS-7-ppc64le-GenericCloud-2003.qcow2.xz
mv CentOS-7-ppc64le-GenericCloud-2003.qcow2 CentOS7.qcow2

# 내용 바꾸기
virt-customize -a /cloud/CentOS7.qcow2 --root-password password:test123

# 파일명 바꾸고 수정하기
mv banana.xml private1.xml
vi private1.xml
virsh net-start private1
virsh net-autostart private1

# 가상머신 만들기
virt-install --name centos01 --vcpus 1 --ram 1024 \
--network network:default \
--network network:private1 \
--disk /cloud/CentOS7.qcow2 --import --noautoconsole

 

실습

- 환경구성

# openvswitch -> linuxbridge로 변경.

# kvm1 kvm2
# 1. ovs 끄기 -> 이거 안하면 에러
ovs-vsctl show
ovs-vsctl del-br vswitch01
systemctl stop openvswitch
systemctl disable openvswitch


# 2. 네트워크 설정하기
cd /etc/sysconfig/network-scripts/
mv ifcfg-vswitch01 ifcfg-br0

#####################
vi /etc/sysconfig/network-scrpts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8
NM_CONTROLLED=no
######################

먼저 이전에 만들어 놓았던 OVS를 모두 지우고

네트워크에서 있었던 vswitch01도 br0로 바꾸어주자

 

 

vi /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no

systemctl restart network

그리고 기존 이더넷도 브릿지와 연결되도록 설정을 바꾸어주자.

 

### STORAGE의 /shared를 kvm1, kvm2의 /cloud에 마운트하기
mount -t nfs 192.168.1.200:/shared /cloud

 

 

 

기타. KVM 명령어 정리

728x90

'Development(Web, Server, Cloud) > Cloud : 정리' 카테고리의 다른 글

7. MySQL  (0) 2022.03.23
6. Docker 도커  (0) 2022.03.03
4. Cloud 네트워크  (0) 2022.02.08
3. GCP와 AWS  (0) 2022.01.18
2. 리눅스 쉘  (0) 2022.01.18