클라우드 가상화를 위한 리눅스
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)
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)
위쪽 경로에서 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 명령어 정리
'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 |