가상머신은 실재로는 xml 부분과 디스크 영역으로 나뉘어 있다.
xml파일을 읽어보면 디스크의 위치등의 정보가 기록되어 있다.
그래서 각자의 vm의 /cloud 디렉토리에서 데이터를 긁어온다
마운트를 하는 디렉토리나 내부 네트워크등은 내부가 완전히 동일해야한다. 내부환경을 공유시키어 주어야 한다.
가상머신 아래로 내려가보니 위와같이 네트워크를 default로 하겠다는 것을 확인할 수 있다.
serial 사용하면 콘솔 연결도 가능해진다.
결국에는 xml파일 하나가 컴퓨터 하나를 정의한다. 컴퓨터 하나 안에 들어가는 모든 자원들을 정의할 수 있다. 디스크는 외부에 있는 볼륨을 연결해서 사용할 수 있다. 인스턴스를 지우더라도 디스크는 외부에 남아 있다. 그래서 새로운 인스턴스를 만든다면 디스크를 인스턴스 안에 설치할 수 있는데 이때는 import 한다고 한다. 그러면 설정을 다른 디스크에서 사용가능하게 된다. 비슷하게 똑같은 얘를 하나더 만들더라도 복사해내면 된다.
그래서 디스크를 하나의 템플릿으로 생각하면 인스턴스가 똑같은 기능을 수행하게 된다.
네트워크 영역을 확인해보자
확인해보면 virbr0라는 브릿지를 확인할 수 있다.
이건 virsh net-list --all로 확인할 수 있다.
강의장 안에 스위치가 필요한데 그걸 virbr0라고 부른다. 그리고 이 안에는 192.168.122.1이 들어가 있다.
```
virsh edit default
```
dhcp로 ip를 자동할당해 줄 수도 있다.
KVM
kvm을 설치했다면 위와같이 동작한다.
가장 아래쪽에는 physical이 있고 위에 OS가 있다. OS 안에는 커널(KVM)과 시스템 프로그램(bash/virsh)이 들어가 있다.
OS 위쪽에는 Qemu-KVM이 있다. 이건 KVM과 가상머신 사이의 통신제어를 한다.
그래서 VM이 통신하면 Qemu-KVM에 통신되고 KVM에 명령이 전달된다. 이때 이걸 명령을 통해 위와 아래를 연결해주는 것이 bash 혹은 virsh이다.
KVM을 설치하면 VM을 연결하기 위한 기본 네트워크가 설치된다. (default 네트워크 - 192.168.122.0/24) NAT의 기능을 수행한다. 그래서 default 네트워크는 physical에 있는 네트워크 장비를 따라서 외부로 나가게 된다.
- 가상머신의 설치
xml과 disk를 하나의 하이퍼바이저에 배치할 수 있으나 이 경우 "Live Migration"이 불가능해진다.
라이브 마이그레이션을 위해서는 디스크를 공유 저장소에 배치해 두어야 한다.
추가적으로 최소 1GB 이상의 속도는 유지되어야 하고 안정성을 확보하기 위해 마이그레이션 전용 네트워크를 별도로 확보해두어야 한다.
최소한 KVM 하이퍼바이저가 2개 있다면 얘네들의 별도의 공간을 만든다음 공유해서 사용할 필요가 있다. 얘네들이 xml 파일을 읽어 들이는 거고 Disk는 공유공간에 두어야 한다. 그럼 마이그레이션은 디스크는 안움직이고 xml 파일만 옆 vm으로 움직이는 것이다.
이때 Disk Migration도 존재하여 Disk를 옆에 드라이브로 옮기는 것도 가능하다.
이게 숫자가 너무 많다면 우리는 자동으로 Migration 해줄 수 있도록 만들어주어야 한다.
그래야 트래픽이 과해졌을때 트래픽 분산처리가 가능해진다.
오케스트로
시스템소프트웨어 개발 및 유통업/컴퓨터 및 주변장치/ 소프트웨어 도매업/전산시스템 유지보수 및 컨설팅 등 시스템 소프트웨어 개발 및 공급업체
www.okestro.com
kvm1 192.168.2.101
kvm2 192.168.2.102
storage 192.168.2.199
db 192.168.2.200
virsh list --all
virsh destroy centos01
virsh undefine centos01 --remove-all-storage
virsh net-list
virsh net-undefine private1
kvm2
virsh net-list
virsh net-undefine private1
brctl show
kvm1
brctl delbr virbr2
systemctl restart libvirtd
kvm2
brctl delbr virbr2
virsh net-undefine virbr2
brctl delbr virbr2
virsh net-destroy virbr2
systemctl restart libvurtd
--- 마운트 정보
kvm1
mount | grep /shared
kvm2
mount | grep /shared
디스크를 어디에 마운트했는지 정보 확인가능
kvm1
ls /cloud
storage
ping www.google.com
mkdir /test
mount -t nfs 10.5.14.100:/class /test
ls /test
cp /test/CentOS7.qcow2 /shared
umount /test
라이브 마이그레이션을 위해서는 디스크를 공유 저장소에 배치해 두어야 한다.
추가적으로 최소 1GB 이상의 속도는 유지되어야 하고 안정성을 확보하기 위해 마이그레이션 전용 네트워크를 별도로 확보해 두어야 한다.
사설 네트워크는 default network의 내용을 가지고 와서 처리하도록 해보자
virsh net-dumpxml default > inside.xml
xml의 내용을 화면에 출력, inside.xml에 저장
vi inside.xml
-> 내부 사설용 인터페이스이니 forward와 mac address를 지우자
결국 위와같이 만들어주자.
그리고 이걸 kvm2에도 동일한 파일에 넣어주자.
그렇다고 이걸 1000대에 다 할 수 없다. 그래서 도커나 쿠버네티스에 가면 얘네들은 클러스터링을 하는 얘들이다. 그래서 서버가 300대 있으면 얘네들을 하나로 묶어서 자원풀을 만든다. cpu, ram, disk 등도 하나로 묶여서 사용된다. 마치 이 자원들이 큰 서버 한대를 구성한것처럼 만들어지게 된다.
이중에서 매니저가 하나 있다. 이 매니저가 네트워크를 하나 만들면 전체서버에 같은 네트워크 하나가 만들어진다. 이 위에 도커나, 컨테이너를 만들면 상호 통신이 가능하다.
이렇게 구성하는것이 우리가 만든것과 다른 이유를 알아보자
서버 2대가 있고 사설네트워크를 만들었다고 하자(172.16.1.0/24) PC1은(172.16.1.100)이고 PC2는(172.16.1.200)이라고 하자. 이 둘 사이의 통신을 하기 위해서는 GRE 터널/VxLAN을 뚫어야 한다.
그러면 터널을 통해 사설 ip간 통신이 가능해진다.
각각의 vm들은 worker이다. 내가 작업을 내리면 그걸 실재로 처리하는 것이 runtime이다. 이때 runtime은 도커/쿠버네티스/프로그래밍 언어가 될 수 있다.
이때 HQ와 BR이 클러스터를 맺고 HQ가 전체를 가로지르는 네트워크를 만들고 그 위에 가상머신이 있다고 한다면 전체가 연결이 가능해진다. 그럼 우리는 이걸 터널링이라고 부르게 된다.
kvm1, kvm2
virsh net-define inside.xml #네트워크가 정의된다.
virsh net-list #중지된건 안보임, 우리가 정의했던 네트워크가 보이기 시작함
virsh net-list --all #중지된것까지 보임
virsh net-start inside
virsh net-autostart inside
virsh net-list #그럼 모두다 보이게 된다.
ls /cloud
virt-install --disk ..iso,size=5
우리가 이전까지 사용하던 iso는 설치파일이다. 그래서 5GB의 디스크를 지정하고 거기에다 vyos.iso라는 파일을 가지고 설치를 하는 방식이었다. 하지만 이번에는 그냥 볼륨을 가져다가 서버에 갖다붙이는 작업을 할것이다.
virt-install --name CentOS7-1 \
--vcpus 1 \
--ram 1024 \
--network network:default,model=virtio \
--network network:inside,model=virtio \
--disk /cloud/CentOS7-1.qcow2 \
--import --noautoconsole
virsh list --all
하면 virtual machine이 생성된것을 확인할 수 있다.
virsh domifaddr CentOS7-1
virsh domiflist CnetOS7-1
로 네트워크가 된것을 확인해보자.
virsh console CentOS7-1
실재 접속해보자.
들어가서
hostnamectl sert-hostname CentOS7_1
su
ifconfig
ip a #eth0, eth1을 확인할 수 있다.
exit
virsh net-destroy default
virsh net-destroy inside
virsh net-start default
virsh net-start inside
virsh reboot CentOS7-1 #재부팅하기
virsh domifaddr CentOS7-1
다시 재접속
virsh console CentOS7-1
Quiz. 1
KVM1 상에서 CentOS7-2를 생성하는데, 이를 KVM2에 배치하라
(마이그레이션이 아니라 생성될 때 처음부터 KVM2에 배치되도록)
ssh root@kvm2 virt-install --name CentOS7-2 \
--vcpus 1 \
--ram 1024\
--network network:default, model=virtio \
--network network:inside, model=virtio
--disk /cloud/CentOS7-2.qcow2 \
--import --noautoconsole
혹은
virt-install --connect qemu+ssh://kvm2/system --name CentOS7-2 \
--vcpus 1 \
--ram 1024\
--network network:default, model=virtio \
--network network:inside, model=virtio
--disk /cloud/CentOS7-2.qcow2 \
--import --noautoconsole
Quiz. 2
아래의 방법으로 인스턴스 배포가 가능하도록 하라. 아래의 방법으로 설치를 진행할 경우에는 패스워드를 요구하지 않아야 한다.
-> KVM1의 public key를 KVM2에 authorized_keys에 저장해놓자.
SSH 인증키 생성 및 서버에 등록 & 간편하게 접속하기 (velog.io)
SSH 인증키 생성 및 서버에 등록 & 간편하게 접속하기
로컬에서 ssh key를 생성하고, 생성된 ssh key를 서버에 등록하면 해당 서버에 접속하려는 계정의 비밀번호 입력없이 ssh 접속이 가능하다.클라이언트는 비밀키를 가지고 있고, 서버에 공개키를 가
velog.io
ssh kvm2 virt-install \
--name CentOS7-3 \
--vcpus 1 \
--ram 1024 \
--network network:default \
--network network:inside \
--disk /cloud/CentOS7-3.qcow2 \
--import --autoconosle
ssh-keygen을 이용하여 key-pair를 생성하고 kvm1에 있는 public 키를 kvm2에 authorized_keys에 넣어주자.
ssh-keygen
ssh-copy-id -i ~/.ssh/id_ras.pub kvm2 #kvm1에 있는 공개키를 kvm2의 authorized_keys로 붙여넣어짐
Quiz 3.
virsh list --all --name 을 하면 동작중인 인스턴스들의 이름만 출력된다. 이를 활용하여 모든 인스턴스를 종료하라
- kvm2
virsh list --all
virsh destroy CentOS7-3
virsh list --name
for test in $(virsh list --all --name)
do
virsh destroy $test;
done
kvm_-_wok_kimchi_manager [AllThatLinux!]
kvm_-_wok_kimchi_manager [AllThatLinux!]
홈페이지 : https://github.com/kimchi-project/kimchi Kimchi는 KVM을 위한 HTML5 기반 관리 도구입니다. 가능한 한 쉽게 KVM을 시작하고 첫 번째 게스트를 만들 수 있도록 설계되었습니다. Kimchi는 Wok 플러그인 으
atl.kr
- 인터페이스 추가하기
virsh attach-interface <인터페이스명> --live (동작중인 상태에서 인터페이스 추가)
- 볼륨추가하기
```
virsh vol-create-as <pool> <name>
virsh pool-list --all
```
default -> /var/lib/libvirt/images
cloud -> /cloud
cloud에다가 공유저장소를 만들어주자.
```
virsh vol-create-as cloud voltest1 1G -> 하면 storage에 공간이 만들어진것을 확인할 수 있다.
```
storage에 voltest1이 추가되어 있다. 이걸 인스턴스에 붙여넣기하자
스토리지에서 디스크를 만들고(볼륨이라고 부름) 그걸 인스턴스에 붙여 넣는것을 block storage 방식이라고 부른다.
이렇게 해놓으면 한번 인스턴스가 삭제되더라도 새로 생기는 인스턴스에 볼륨을 붙이면 된다.
```
virsh attach-disk CentOS7-1 /cloud/voltest1 --target sdb --persistent --live
```
CentOS7-1 이라는 인스턴스에 /cloud/voltest1을 sdb로 영구적으로 붙여넣겠다.
virsh dumpxml CentOS7-1 | grep voltest1
으로 내용을 검색해보자.
가상머신에 접속해보자.
virsh console CentOS7-1
ls /dev/sd* -l
현재 연결은 되었지만 사용은 할 수 없는 상태이다.
fdisk /dev/sdb #파티션닝을 진행하자.
-> n
-> p(Enter)
-> 1(Enter)
-> 2048(Enter)
-> Enter
-> w
그러면 전체 스토리지를 모두 sdb에 할당한다.
이제 포멧하자
mkfs.ext4 /dev/sdb1
하면 이제 사용가능해진다.
마지막으로 마운트하자.
mkdir /test
mount /dev/sdb1 /test
df
마운트된 디스크를 볼 수 있다.
touch /test/volumetest.txt
Ctrl + ]
빠져나왔다.
이걸 떼내는 것을 해보자
virsh detach-disk CentOS7-1 sdb
이렇게 만든 스토리지를 kvm2에 붙여보자
virsh attach-disk CentOS7-2 /cloud/voltest1 --target sdb --persistent --live
- 제거된 voltest1을 다른 인스턴스에 연결하기
virsh attach-disk CentOS7-2 /cloud/voltest1 --target sdb --persistent --live
# Disk attached successfully <-- CentOS7-2 에 연결
virsh console CentOS7-2
#Connected to domain CentOS7-2
#Escape character is ^]
#CentOS Linux 7 (Core)
#Kernel 3.10.0-1127.el7.x86_64 on an x86_64
#localhost login: root
#Password:
ls /dev/sd*
#/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 <-- 이미 파티셔닝,포맷되어 있으므로 왼쪽과 같이 보인다.
[root@localhost ~]# mkdir /ddd <-- 마운트를 위한 디렉토리 생성
[root@localhost ~]# mount /dev/sdb1 /ddd <--- 마운트
[ 70.491583] EXT4-fs (sdb1): recovery complete
[ 70.494320] EXT4-fs (sdb1): mounted filesystem with ord ered data mode. Opts: (null)
[root@localhost ~]# ls /ddd
lost+found volumetest.txt <-- CentOS7-1 에서 생성한 파일이 보인다
[root@localhost ~]#
대충 위와같이 진행하면된다.
이와 유사한 서비스가 openstack cinder 서비스이다.
How to Create and Attach Cinder Volume to Instance in OpenStack – tuxfixer.com
How to Create and Attach Cinder Volume to Instance in OpenStack – tuxfixer.com
tuxfixer.com
위와같이 볼륨을 만들고 연결하면된다.
매번 가상머신에 인스턴스를 물어보는 것도 좀 그렇다.
cd ~/.ssh
ls
cp id_rsa.pub authorized_keys
cd
ssh kvm1 virsh list --all
이 인스턴스들을 관리하기위해서 vmnet에 연결된 가상머신들을 가지고 관리용 서버를 따로 두어서 pub키를 모든 인스턴스들에게 넣어주자.
그리고 어떤 호스트에 어떤 가상머신에 있는지를 DB에 넣어주자. 그리고 이렇게 된 DB를 가지고 웹상에다가 구현하자. 그러면 관리가 보다 편리해진다.
DATABASE 구성
이렇게 해서 CPU가 balance있게 처리할 수 있게끔 만들어볼 수 있다.
kvm1, kvm2
```
yum -y install virt-top
virt-top
```
하면 실시간으로 가상머신의 상태를 확인할 수 있다.
```
yum -y install sysstat
mpstat
```
그러면 현재사용하는 PC의 CPU 상태를 볼 수 있고 이걸 이용해서 kvm1, kvm2의 상태를 확인해볼 수 있게 된다.
```
ssh kvm2 mpstat
```
네트워크 추가하기
attach-interface
disk 추가하기
attach-disk
가상머신의 autostart
virsh start CentOS1 #가상 머신 시작
virsh destroy CentOS1 #가상 머신 중지
virsh reboot CentOS1 #가상 머신 재부팅
virsh autostart CentOS1 # KVM 실행되면서 자동으로 실행된다
virsh undefine CentOS1 # 가상 머신 삭제(디스크는 남아 있다) + rm -rf로 qcow를 삭제해야하는데
virsh undefine CentOS1 --remove-all-storage # 가상 머신 삭제 + 볼륨 삭제
stg : volume pool)디렉토리
volume1 : volume
1G : 사이즈
virsh attach-disk centos01 /stg/volume01 --target sdb --persistent --live
/stg/volume1을 centos01에 sdb에 영구적으로 연결
이러면 centos01이 동작중이어도 sdb가 연결된다.
virsh detach-disk centos01 sdb
디스크를 영구적으로 빼기
virsh vol-list cloud
보면 어떠한 이름의 볼륨이 있는지 확인가능
virsh vol-list cloud default
하면 아무것도 안뜨는데 이건 기본 경로이다. 이걸 확인하기 위해서는 wok, kimchi로 확인해봐야한다.
wok를 확인해보니 위와같이 default가 정의되어 있는 것을 확인할 수 있다.
이건 인스턴스를 생성하면 /var/lib/libvirt/images에 자동 생성된다는 의미이다. 이건 로컬저장소이다. 만약 이 경로에 인스턴스를 만들면 마이그레이션이 안된다.
패킷이 KVM까지 나와서 NAT로 빠져나온다. 그럼 KVM에서 해야하는 것은 한개의 인터페이스에서 들어와 다른 인터페이스로 나갈 수 있도록 forward를 해주어야 하는데 여기에 0이 들어가 있으면 포워드를 안하겠다는 뜻이고 1이면 포워드를 하겠다는 뜻이 된다.
cat /proc/sys/net/ipv4/ip_forward
에서 상태를 확인할 수 있다
그래서 만약 인스턴스가 외부와 통신이 되지 않는 경우 체크해 보아야할 내용중 하나이다.
* 호스트에서 forward 기능을 활성화 해 주어야 한다.
---
VM에서 인터페이스 제거하기
위의 방식으로 인터페이스를 제거할 수 있다고 한다.
마이그레이션
가상머신의 라이브 마이그레이션 -> 가상머신이 운영중에도 마이그레이션 하는 것(<-> 오프라인 마이그레이션)
iSCSI 기반(Cinder, EBS), FC기반, Gluster, CEPH-Cluster등을 고민해야 한다.
1. sshpass 설치
centos01을 kvm2로 이동시킨 후 인터넷 연결 상태 확인
virsh migrate --live centos01 qemu+ssh://kvm2/system --verbose --persistent --unsafe
???
kvm2에서
virsh list --all 하면 가상머신들이 나온다
virsh destroy CentOS7-2
virsh undefine CentOS7-2 --remove-all-storage
virsh destroy CentOS7-3
virsh undefine CentOS7-3 --remove-all-storage
kvm1에서
virsh migrate CentOS7-1 qemu+ssh://kvm2/system --verbose --unsafe
하고 나면kvm2로 가상머신이 넘어가는 것을 확인할 수 있다.
ssh kvm2 virsh migrate CentOS7-1 qemu+ssh://kvm1/system --verbose --unsafe
kvm2에서
virsh migrate --live CentOS7-1 qemu+ssh://kvm1/system --verbose --unsafe
????
4. 브리지 네트워크와 overlay 네트워크
linux
????
virsh list --all
virsh destroy CentOS7-1
virsh undefine CentOS7-1 --remove-all-storage
cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-br0 # br0를 스위치로 사용하자
vi ifcfg-br0
위와같이 TYPE을과 NAME, DEVICE를 바꾸면 된다.
NM_CONTROLLED=no면 오직 CLI 환경에서 파일을 바꾸는 것만으로 네트워크 정보를 바꾸겠다는 의미가 된다.
오직 파일 수정을 통해서만 네트워크 변경사항 적용
linux bridge 사용하기
1. cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-br0
vi ifcfg-br0
vi ifcfg-eth0도 위와같이 IP, prefix, gateway, dns1을 제거하고 내용을 수정해서 넣어주자(bridge, nm_controlled가 추가됨)
그럼 앞으로 가상머신을 생성할때 network를 br0에 물려버리면 br0가 된 VM은 eth0에 저장된 정보를 가지고 ISP와의 접속이 가능해진다.
위와같이 eth0는 ip가 없고 br0에는 ip가 들어가 있으면 정상적으로 만든 것이다.
- storage
ls /shared/
cp /shared/CentOS7.qcow2 /shared/CentOS7_01.qcow2
- kvm1
ls /cloud
virt-install --name CentOS7_01 \
--vcpus 1 \
--ram 1024 \
--network bridge:br0, model=virtio \
--disk /cloud/CentOS7_01.qcow2 \
--import \
--noautoconsole
virsh console CentOS7_1
ping www.google.com
hostnamectl set-hostname vm-centos01
yum -y install httpd ; systemctl start httpd
echo "<h2>TEST</h2>" > /var/www/html/index.html