KVM1, KVM2는 하이퍼바이저로 동작하기 위한 놈들이다. 하이퍼바이저는 서버가상화를 하기 위해 필요한 것들이다.
서버가상화를 위해서는 하이퍼바이저가 반드시 필요하다.
하이퍼바이저의 두가지 형태
type1
호스트 OS 내(커널)에 또는 호스트 OS 위치에 하이퍼바이저가 배치되는 형태
이건 VM이 하이퍼바이저와 직접 통신할 수 있다. 그래서 직접응답이 가능해진다.
(KVM, ESXi(VMWARE), Hyper-V(MS), XenServer(Citrix))
속도가 빠름 -> 기업데이터센터용
type2
호스트 OS 위에 Application 형태로 배치되는 형태
여기의 하이퍼바이저는 OS까지 내려가야 정상 통신이 가능해진다.
(VMware WorkStation, Virtual Box, Virtual PC)
STORAGE는 shared라는 공간을 만들고 그 공간을 KVM1, KVM2가 공유해서 사용하게끔 하자. 그래서 STORAGE의 shared 공간을 /cloud 공간에 마운트해서 사용하게끔 하자. 그런데 shared는 NFS의 공유저장소로 사용된다.
실재 서버들은 위와같은 구성을 이룬다.
그래서 그림으로 치면 스위치가 3개가 있고 거기에 서버들이 연결된 구조이다.
여기에서도 첫번째 스위치는 공유기에 연결되어 있고(DG : 211.183.3.2)
나머지 스위치들은 자기들끼리만 연결된 구조이다.
이때의 각각의 인터페이스의 역활
eth0 -> 인터넷으로 연결하는 용도, 처음 패키지 설치용도
eth1 -> 내부 스토리지, DB 연결용 -> 이때의 DB를 가지고 웹과 연결하여 정보를 보여줄 수 있다.
eth2(중요) -> VM 관리용/VM 이동용( [live 동작중] migration )
Storage를 실행한다음에 먼저 처리하자
한다음 위와같이 hosts를 먼저 등록해놓자
모든 서버는 방화벽, SELinux 를 종료
자 이제 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
패키지 설치
1. [KVM1/KVM2]
yum -y update
yum -y install qemu-kvm libvirt virt-install openssh-askpass virsh
- 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이다. 그래서 라이브 마이그레이션을 위한 인증도구이다.
2. kvm 실행을 위한 설정 [KVM1/KVM2]
kvm이 동작할 때 어떠한 권한으로 실행할 것인가?
가급적 root의 권한으로 kvm을 실행시키기
vi /etc/libvirt/qemu.conf
한다음 442, 446에 있는 '#'를 제거하자
KVM1, KVM2 둘다 해주기
3. kvm 실행하기 [KVM1/KVM2]
systemctl start libvirtd
systemctl enable libvirtd
4. NFS 서버/클라이언트 연결하기
STORAGE에서 120GB를 KVM1/KVM2에게 제공하기 위한 설정
- 가상머신의 형태
1. xml(text) - cpu, ram등 그래서 이 파일을 읽어들이면 인스턴스를 생성할 수 있게 된다. libvirtd가 이걸 읽어들여서 실재 cpu에 전달된다.
2. disk(저장소 - HDD, SSD)
이 둘은 분리될 수 있기 때문에 xml에는 disk의 위치를 저장해놓는다.
그리고 이 저장소를 /cloud 폴더에 배치한다. 그럼 /cloud는 storage의 /shared와 마운트되어 있기 때문에 실재 저장은 storage에 된다. 그럼 결국에는 모든 Disk들은 Storage에 저장되고 가상머신은 각자의 xml에 저장된다.
그리고 이때 KVM의 CPU, RAM은 KVM이 제공해준다. 이건 libvirt를 실행하면 xml을 읽어들여서 가상자원을 만들어 처리해준다. 대신에 Disk만큼은 storage에 있는 파일을 읽어들여서 처리한다.
KVM1의 CPU, RAM은 속도가 빠르지만 STORAGE의 속도가 느리기 때문에 이 속도를 더 늘리기 위해서 별도의 스위치 VMNET1을 만들었다.
---
STORAGE에서 120GB를 KVM1/KVM2에게 제공하기 위한 설정
패키지 설치는 kvm1/kvm2/storage 동일
이제 storage 서버 구성을 해보자
```
df | grep shared
```
으로 storage에 shared 디렉토리를 확인해보자.
```
vi /etc/exports
/shared 192.168.1.101(rw,sync,no_root_squash)
/shared 192.168.1.102(rw,sync,no_root_squash)
```
rw : 192.168.1.101은 /shared에 데이터 읽고/쓰기 가능
sync : 클라이언트가 작성한 데이터는 항상 확인작업을 거침(<->async)
no_root_squash : 원격지 192.168.1.101이 nfs 서버에서 작업을 진행할 경우 누구의 권한으로 실행되는가? 원격지 사용자를 로컬의 root로 인정
```
systemctl restart nfs-server
systemctl enable nfs-server
```
/shared 디렉토리를 쓰기 가능하도록 조정
```
chmod +777 /shared
```
[kvm1/kvm2]에서의 작업
```
mkdir cloud
mount -t nfs 192.168.1.199:/shared /cloud
touch /cloud/test.txt
```
모두 동일하게 해준다.
파일이 잘 만들어진다.
vi /etc/fstab
컴퓨터 재 실행시에 마운트 유지를 위해 아래와 같이 작성해주자
첫번째 0은 이 mount 연결정보 확인안함(<->1)
두번째 0은 확인하는 순서이다
KVM1, KVM2 둘다해주자
5. KVM1/KVM2의 가상머신(인스턴스), 네트워크, 스토리지 등을 html 기반에서 관리할 수 있는 webUI 도구(kimchi)
https://blog.crois.net/centos7-kvm-webui-kimchi-install/
여기에서 설치방법을 확인하자
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로 접근하면 위와같이 Wok에 접속되는 것을 확인할 수 있다.
실습1
KVM1, KVM2로 호스트가 2개이다. KVM 상에는 네트워크 연결을 위한 스위치 virbr0가 만들어진다. 두개다 192.168.122.0/24 를 사용한다고 하자
그리고 가상머신을 만드는데 별도의 네트워크를 지정하지 않거나 수동으로 지정할 수 있다.
(--network network:default) 왼쪽과 같이 지정해놓으면 virbr0(sw)라는 default 네트워크에 연결한다. virbr0는 NAT의 기능을 가지고 있기 때문에 192.168.122.0/24를 사용하기 때문에 KVM1에 있는 211.183.3.101을 타고서 나가게 된다.(eth0에 정의한거)
가상머신은 virbr0가 DHCP 기능을 해준다.
kvm1에서 다음을 수행해주자
```
# 1. 명령어
virsh net-list
# 2. 들어가서
virsh net-list
```
생성되어 있는 가상 네트워크 확인
```
virsh net-list --all (중지된/실행중인 모든 가상 네트워크 리스트 확인가능)
```
Autostart : KVM실행시 이거 자동으로 실행할것인가를 물어본다. 가급적 yes로 처리
Persistent : 영구적인 설정유지여부
네트워크의 실제 구성내용?
(가상머신/가상 네트워크의 실체 -> xml 파일 -> libvirt가 읽고 파일 내용에 맞는 서비스를 생성해내는 것이다.)
kvm1
```
virsh net-dumxml default # default 네트워크의 구성 내용을 마치 cat으로 읽어보는 것과 동일
```
uuid : 유니크한 장치번호 -> 나중에 설정을 유지해서 옮기는 용도
forward mode='nat' : 이 뒤의 가상머신이 default network(virbr0)를 통해서 네트워크로 빠져나갈 수 있는 기능 제공
-> 만약 이게 없다면 네트워크 기능을 수행못한다.
bridge name 존재
ip는 dhcp를 통해서 자동으로 할당받는다.
이게 맘에 안들때 수정해주자
```
virsh net-edit default
```
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 를 받자
```
virt-install --name fw01 --vcpus 1 --ram 1024 --network network:default --disk path=/cloud/fw01.qcow2,size=5 --cdrom /cloud/vyos.iso
```
disk 5GB 제공
하면 위와같이 멈추어 있는거 같은 환경이 유지되는데 그냥 Ctrl + C로 빠져나오자
그리고 Wok으로 들어가서 만들어진 가상머신을 확인해보자
가보면 위와같이 fw01이 생긴것을 확인할 수 있다.
여기에서 View Console, View Serial을 확인할 수 있다.
연결방법은 두가지가 있다.
1. Console : 서버에 원격지에서 연결하는 방법(ip주소로 스위치 타고 접속 - CLI/GUI)
2. Serial : 장치에 IP 없이 직접 접속하는 방법(ip가 없을때 그냥 로컬 PC로 접속 - CLI)
Serial
- id : vyos
- pw : vyos
로 접속해보자
현재 호스트에 설치되어 있는 가상머신의 목록 확인하기
virsh list --all (동작중/중지중인 것 모두 확인가능)
가상머신의 구성내용 확인하기
```
virsh dumpxml fw01 -> 가상머신의 내용 확인가능
virsh edit fw01 -> 내용 수정 가능
```
보면 위와같이 내용들이 있는데 /cloud/fw01.qcow2를 이용하여 disk를 만들어준것을 확인할 수 있다. 아까전에 우리가 5G 디스크를 주었던 것이다.
그 아래에 보면 network 가 적혀있는것을 확인할 수 있다.
```
virsh domiflist fw01
```
하면 fw01가 가진 랜카드들을 보여준다.
```
virsh domifaddr fw01
```
하면 fw01의 ip가 보인다.
하지만 지금은 보이지 않는다. 네트워크 타입을 바꾸어야 보이기 시작한다.
가상머신 중지
```
virsh destroy fw01
```
강제 중지시켜버린다.
72번째줄에 원래는 rtl 뭐시기 적혀 있는데 이걸 virtio로 바꾸어주자.
```
virsh start fw01
virsh domifaddr fw01
```
이제 작업중인 쉘에서 vm으로 직접 연결하기
```
virsh console fw01
```
빠져나올려면 ctrl + ]을 누르면 된다.
접속 안된다.
```
virsh undefine fw01 --remove-all-storage
```
으로 그냥 삭제해주자
```
virt-install --name fw01 --vcpus 1 --ram 1024 --network network:default,model=virtio --disk path=/cloud/fw01.qcow2,size=5 --cdrom /cloud/vyos.iso
```
virsh로 fw01에 들어가자 들어갈때 ID는 vyos고 PW는 vyos이다.
이렇게 하면 우리는 사실상 논리적인 방화벽 하나를 얻은것과 같아진다.
```
show interfaces
```
eth0에 아무것도 들어있지 않은것을 확인할 수 있다.
이제부터는 디바이스에 dhcp를 사용해보자
```
config
set interfaces ethernet eth0 address dhcp
commit
```
하면 위와같이 dhcp로 ip를 할당할 수 있다.
하면 바뀐다. 하지만 commit만 한거라서 껏다키면 바뀐다. 그래서 save를 해주자
```
run show int
save
```
이제는 vm에서도 정상적으로 주소를 보여준다.
```
virsh list --all # 가상머신 리스트
virsh net-list --all # 가상네트워크 리스트
virsh destroy fw01 # 가상머신 종료
virsh start fw01 # 가상머신 시작
virsh undefine fw01 # 가상머신 삭제(디스크는 여전히 남아 있음)
virsh undefine fw01 --remove-all-storage # 가상머신 + 디스크 삭제
```
migration
```kvm1, kvm2
ip a
```
virbr0가 있는지 확인
wok에 migrate가 있다. 그런데 이렇게 하는게 잘 안된다. unsafe 모드로 넘어가야 암호화가 되기에 virt에서는 처리가 안된다.
Wok의 Console로 접속해서 계속 구글로 핑을 보내자
```
virsh migrate --live fw01 qemu+ssh://kvm2/system --unsafe
```
하면 보내진다.
kvm2에 잘 도착한것을 확인할 수 있다.
wok에서도 도착한것을 확인할 수 있다.
아무것도 안했는데 구글에 계속 핑을 던지고 있다.
반대로 뺏어올 수도 있다. 물론 위의 이미지는 에러가 났지만 이건 kvm1의 pub키를 kvm2에 등록안해서 생긴문제이다.
암튼 이런게 되는 이유는 사실상 disk는 외부 storage에 있고 xml파일만 서버간 이동을 해주었기 때문이다.
Live Migration :
- 동작중인 인스턴스/VM을 다른 호스트로 이동 시키는 기술로 클라우드와 가상화에서 가장 기본이면서 가장 중요한 기술
- Storage Migration도 포함된다. 스토리지 마이그레이션의 주 용도는 디스크 점검, 백업, 확장 등을 위해 사용된다.
- 이러한 라이브 마이그레이션은 과거의 시스템과는 달리 지역간 이동이 가능하며, 무중단 서비스를 구현할 수 있음.
- 라이브 마이그레이션은 클라우드 환경에서 auto-scale과 함께 사용된다.
네트워크 생성하기
DPAT를 이용해서 가상머신이 나갈 수 있게 만들어보자
이걸 하기 위해 먼저 네트워크를 만들자.
```
virsh net-dumpxml default > banana.xml
```
uuid는 libvirtd가 xml을 읽으면서 MAC과 uuid 를 자동할당해준다.
그래서 왼쪽에 있던것을 오른쪽과 같이 만들어주자.
여기에서 우리가 원하는 네트워크는
위와같이 만들어주자. 여기에서 virbr1은 직접 네트워크로 나가는 친구가 아니다.
```
virsh net-define banana.xml #하면 네트워크가 등록된다.
```
그런데 autostart가 안되어 있다.
```
virsh net-start banana
virsh net-autostart banana
```
wok에는 인터페이스가 안보인다. 그래서 인터페이스를 붙여보자
[생성된 네트워크에 VM 연결하기]
```
virsh attach-interface --domain fw01 --type network --source banana --model virtio --config --live
```
네트워크가 붙어있다.
붙어있다. 이걸 나중에 detach할 수도 있다.
그런데 이 상태에서 migration 해보자
```
virsh migrate fw01 qemu+ssh://kvm2/system --unsafe
```
그 결과 에러가 난다. 상대방에게 banana 네트워크가 없다고 안받아준다.
```kvm1
scp banana.xml root@kvm2:/root/banana.xml
```
받아온 파일을 등록해주자
kvm1이 보내준 네트워크가 붙은 상태로 fw01을 migration해왔다.(하나 더 붙은 이유는 내가 실수로 붙였다;;)
```
virsh migrate fw01 qemu+ssh://kvm1/system --unsafe
```
로 다시 kvm1으로 xml을 보내주자.
openstack cloud image을 구글에 검색해서 다음을 받아오자
Index of /0.5.0 (cirros-cloud.net)
Index of /0.5.0
download.cirros-cloud.net
kvm에서 사용하는 이미지 포맷
iso 파일 : 설치용 미디어, 디스크를 별도로 마련하여 해당 디스크에 OS를 설치하는 과정 필요(--cdrom 으로 사용)
qcow2 파일 : OS가 설치되어 있는 volume 그래서 여기에다가 cpu, memory만 연결해주면 된다.(--import 를 사용)
대표적으로 우리가 받은 파일이 그러하다
```kvm1
virt-install --name cirros001 --vcpus 1 --ram 512 --network network:banana --disk /cloud/cirros.img --import --noautoconsole
```
하면 바로 완료된다. 정말 빠르다.
잘 들어간것을 확인할 수 있다.
개빠르게 들어왔다.
id : cirros
pw : gocubsgo
로 접속해보자.
바나나 네트워크에도 연결이 잘된다.
마이그레이션도 잘된다.
실습환경 초기화 하기
1. cirros01 삭제
2. fw01 삭제
3. banana 네트워크 삭제
```
virsh destroy cirros001
virsh undefine cirros001 --remove-all-storage
virsh net-destroy banana
virsh net-undefine banana
```
192.168.122.0/24 default
1. STORAGE의 /shared 에서 wget
CentOS Cloud images
cloud.centos.org
https://cloud.centos.org/centos/7/images/CentOS-7-ppc64le-GenericCloud-2003.qcow2.xz
위의 파일을 wget으로 가져오면 된다.
# 압출풀고 이름 바꾸기
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
'Development(Web, Server, Cloud) > 22) LINUX - Cloud' 카테고리의 다른 글
클라우드 37일차 (0) | 2022.02.23 |
---|---|
클라우드 36일차 (0) | 2022.02.22 |
클라우드 34일차(네트워크 부분 다시 봐야함) (0) | 2022.02.18 |
클라우드 33일차 (0) | 2022.02.17 |
클라우드 32일차 (0) | 2022.02.16 |