[KVM] XML Configuration, Bridge Network

gununoo·2022년 8월 2일
2

KVM

목록 보기
2/4
post-thumbnail

Hypervisor

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

Type 1(Bare Metal)

  • 물리자원 바로 위의 커널에 hypervisor가 있음
  • 바로 아래에 있는 물리 자원에 직접 접근할 수 있음
  • KVM, ESX

Type 2(Host Based HV)

  • 아래의 커널(Host OS)에 접근을 한 후 물리 자원에 접근할 수 있음
  • VM work station

인스턴스 만들기

방법 1)
[KVM1]

[root@kvm1 remote]# mv CentOS-7-x86_64-Minimal-2009.iso CentOS7-2009.iso 
  1. 사용할 디스크(qcow2) 를 미리 준비하기
[root@kvm1 remote]# qemu-img create -f qcow2 /remote/centos1.qcow2 10G
Formatting '/remote/centos1.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off 
[root@kvm1 remote]# ls | grep centos1.qcow2 
centos1.qcow2
  1. 준비된 디스크와 컴퓨팅 자원을 이용하여 설치하기
[root@kvm1 remote]# virt-install \
> --name centos1 \
> --vcpus 1 \
> --ram 1024 \
> --network network:default \
> --disk /remote/centos1.qcow2 \
> --graphics vnc,port=5901 \
> --location=/remote/CentOS7-2009.iso \
> --noautoconsole 

virtual machine manager에서 centos1 선택

설치화면 넘겨 가면서 설치하기

방법 2)
[KVM2]
1. 사용할 디스크(qcow2) 준비 없이
2. 설치하면서 디스크 준비까지 한번에

virt-install \
--name centos2 \
--vcpus 1 \
--ram 1024 \
--network network:default \
--disk /remote/centos2.qcow2,size=10 \
--graphics vnc,port=5902 \
--location=/remote/CentOS7-2009.iso \
--noautoconsole 

name이 같으면 migration해서 이름이 겹칠 때 문제 발생할 수 있음
KVM1의 centos1와 이름이 다르게 centos2로 설정

virtual machine manager에서 centos2 선택

설치화면 넘겨 가면서 설치하기

관리

1. 하이퍼바이저에서 가상머신들의 리스트 확인

[root@kvm1 remote]# virsh list --all 
 Id    Name                           State
----------------------------------------------------
 -     centos1                        shut off

2. 네트워크 리스트 확인

[root@kvm1 remote]# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

3. kvm 데몬이 재실행되더라도 동시에 vm도 재실행이 되도록 하고 싶다면

[root@kvm1 remote]# virsh autostart centos1 
Domain centos1 marked as autostarted

4. 가상머신들의 이름만 확인

[root@kvm1 remote]# virsh list --all --name 
centos1

5. 가상머신들에게 콘솔로 접속

[root@kvm1 remote]# virsh console centos1 
Connected to domain centos1
Escape character is ^]
  • 인스턴스 생성 시 console line을 생성하지 않는다면 연결되지 않을 수 있다. 단, 클라우드용 이미지는 이미 콘솔라인이 생성되어 있으므로 바로 연결된다.
    ctrl + ] 키로 빠져나올 수 있다.

6. 가상머신들의 설정값 확인

6.1 xml 확인

[root@kvm1 remote]# virsh dumpxml centos1

설정된 가상머신의 xml 파일을 cat으로 열어보는 것과 같음

6.2 xml 편집

[root@kvm1 remote]# virsh edit centos1 

설정된 가상머신의 xml 파일을 vi로 열어보는 것과 같음

7. 네트워크의 설정값 확인 및 수정

7.1 virsh net-dumpxml default
스위치의 구성 내용 xml 파일을 cat으로 열어보는 것과 같음

[root@kvm1 remote]# virsh net-dumpxml default 
<network connections='1'>
  <name>default</name>
  <uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:fc:83:47'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

7.2 virsh net-edit default
vi 로 연결되어 스위치의 구성 내용을 변경할 수 있다!

[root@kvm1 remote]# virsh net-edit default 
<network>
  <name>default</name>
  <uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:fc:83:47'/>
  <ip address='10.10.10.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.10.10.201' end='10.10.10.239'/>
    </dhcp>
  </ip>
</network>

브릿지의 ip를 10.10.10.1로 변경
할당할 ip의 범위는 .201 ~ .239
위와 같이 변경

kvm과 네트워크 재실행

[root@kvm1 remote]# systemctl restart libvirtd # kvm 데몬 재실행 
[root@kvm1 remote]# virsh net-destroy default # default 네트워크 중지
Network default destroyed
[root@kvm1 remote]# virsh net-start default # default 네트워크 실행
Network default started
[root@kvm1 remote]# ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.10.10.1  netmask 255.255.255.0  broadcast 10.10.10.255
        ether 52:54:00:fc:83:47  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

브릿지의 ip가 10.10.10.1로 변경되었음

가상머신(kvm) 재실행

[root@kvm1 remote]# virsh destroy centos1 
Domain centos1 destroyed

[root@kvm1 remote]# virsh start centos1 
Domain centos1 started

8. 가상머신의 IP 주소 확인

[root@kvm1 remote]# virsh domifaddr centos1 
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:f7:f9:26    ipv4         10.10.10.229/24

[kvm1의 centos1]

ip a

-> 10.10.10.229가 할당되었음

ping 10.10.10.1 
ping www.google.com 

브릿지와 통신이 되고, 인터넷 연결도 됨

[KVM1]
인터페이스 확인

[root@kvm1 remote]# virsh domiflist centos1 
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    rtl8139     52:54:00:f7:f9:26

9. 새로운 네트워크 만들기

[root@kvm1 ~]# virsh net-edit default 
<network>
  <name>default</name>
  <uuid>8e8338a4-c7fc-4676-b458-a7bd092b6644</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:fc:83:47'/>
  <ip address='10.10.10.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.10.10.201' end='10.10.10.239'/>
    </dhcp>
  </ip>
</network>

위 xml 복사하기

내부에서 사용할 네트워크의 xml파일 만들기

[root@kvm1 ~]# touch private1.xml 
[root@kvm1 ~]# vi private1.xml 
<network>
  <name>private1</name>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='172.16.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='172.16.100.201' end='172.16.100.239'/>
    </dhcp>
  </ip>
</network>

default에서 복사한 xml 코드 붙여넣고 위와 같이 수정하기
내부 네트워크이기 떄문에 nat 필요 없음
mac주소 필요 없음
내부에서 쓸 독립적인 주소 -> 172.16.100.1

[root@kvm1 ~]# virsh net-define private1.xml 
Network private1 defined from private1.xml

[root@kvm1 ~]# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 private1             inactive   no            yes

[root@kvm1 ~]# virsh net-start private1 
Network private1 started

[root@kvm1 ~]# virsh net-autostart private1 
Network private1 marked as autostarted

[root@kvm1 ~]# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 private1             active     yes           yes
[root@kvm1 ~]# ifconfig virbr1
virbr1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.16.100.1  netmask 255.255.255.0  broadcast 172.16.100.255
        ether 52:54:00:49:17:86  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

네트워크를 삭제하고 싶다면

virsh net-undefine private1 

10. 생성된 별도의 네트워크에 가상머신 연결하기

네트워크 이름 : private1 (스위치의 이름 : virbr1 - 172.16.100.1)
private1 에 연결되는 가상머신들은 172.16.100.201 ~ 172.16.100.239 사이에서 IP 주소를 DHCP 를 통해 할당 받을 수 있다.

[root@kvm1 ~]# virsh attach-interface \
> --domain centos1 \
> --type network \
> --source private1 \
> --model virtio \
> --live \
> --config 
Interface attached successfully

centos1에게 network 타입의 private1 네트워크로 연결할 예정이고 랜카드 모델은 virtio이다.
--live: 가상머신이 동작 중인 상태에서 연결할 것
--config: 재부팅되더라도 설정 계속 유지

kvm1의 centos1에서 확인

ip a

-> eth0이 연결되었음
-> 172.16.100.205가 할당되었음

centos1을 kvm1에서 kvm2로 migrate 시도
현재 상태에서 가상머신을 라이브 마이그레이션 시키면 이동되지 않는다.

kvm2에 private1 네트워크를 생성해주면 된다.

[root@kvm2 ~]# vi private1.xml 
<network>
  <name>private1</name>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='172.16.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='172.16.100.201' end='172.16.100.239'/>
    </dhcp>
  </ip>
</network>
[root@kvm2 ~]# virsh net-define private1.xml 
Network private1 defined from private1.xml

[root@kvm2 ~]# virsh net-list --all 
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 private1             inactive   no            yes

[root@kvm2 ~]# virsh net-start private1
Network private1 started

[root@kvm2 ~]# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 private1             active     no            yes

[root@kvm2 ~]# ifconfig | grep 172
        inet 172.16.1.102  netmask 255.255.255.0  broadcast 172.16.1.255
        inet 172.16.2.102  netmask 255.255.255.0  broadcast 172.16.2.255
        inet 172.16.100.1  netmask 255.255.255.0  broadcast 172.16.100.255
[root@kvm2 ~]# 

centos1이 kvm1에서 kvm2로 마이그레이션 된다.

migrate할 때마다 네트워크 설정을 해준다면 매우 번거로움.
cluster와 overlay 구성한다면 별도의 네트워크 설정 없이도 서로 다른 서버로 migration할 수 있음.

  • cluster: 서버의 자원을 묶어서 사용
  • overlay: 물리적으로 떨어진 서버들(사설 ip 사용)을 하나의 네트워크 상에 있는 것처럼 사용

11. 연결된 인터페이스 동작 중인 상태에서 제거하기(private1으로부터 제거)

mac주소 알아내기

[root@kvm2 ~]# virsh domifaddr centos1 
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet1      52:54:00:f7:f9:26    ipv4         192.168.122.24/24
 vnet2      52:54:00:87:a1:0c    ipv4         172.16.100.205/24

-> private1의 ip는 172.16.100.X 이므로 vnet2

인터페이스 제거

virsh detach-interface \
--domain centos1 \
--type network \
--mac 52:54:00:87:a1:0c \
--config 
[root@kvm2 ~]# virsh destroy centos1
Domain centos1 destroyed

[root@kvm2 ~]# virsh start centos1
Domain centos1 started

[root@kvm2 ~]# virsh domifaddr centos1
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet1      52:54:00:f7:f9:26    ipv4         192.168.122.24/24

-> vnet2가 제거되었음

12. 동작 중인 가상머신에 디스크 추가하기

[kvm2의 centos2]

ls /dev/sd* 

[kvm2]

[root@kvm2 ~]# virsh pool-list --all 
 Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 remote               active     yes    
[root@kvm2 ~]# virsh vol-create-as remote voltest1 1G 

remote 저장소에 voltest1라는 저장소를 1G 만들겠다.

[root@kvm2 ~]# virsh vol-list remote | grep voltest1
 voltest1             /remote/voltest1             

생성된 voltest1 확인

[root@kvm2 ~]# file /remote/voltest1
/remote/voltest1: data

data를 저장할 수 있는 volume이다.

sda는 있으니까 sdb에 연결할 것임.

[root@kvm2 ~]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live 
Disk attached successfully

persistent: 영구적으로 연결
live: 동작 중인 상태에서 연결
remote 디렉토리 아래에 있는 1GB voltest1을 centos2의 sdb에 영구적으로 연결하되, 동작 중인 현재 상태에서 바로 붙이겠다.

[kvm2의 centos2]

ls /dev/sd* 

/dev/sdb가 추가되었음

파티셔닝

fdisk /dev/sdb 
n

n: 새로운 파티션 만들곘다.
나머지는 모두 엔터
sdb1이 생성되었음

포멧

mkfs.ext4 /dev/sdb1

마운트

mkdir /test
mount /dev/sdb1 /test 

/dev/sdb1을 /test에 마운트

마운트 확인

df -h 

/dev/sdb1이 마운트 된 것 확인할 수 있음

마운트 테스트

touch /test/from_centos2.txt 

[KVM2]
동작 중인 상태에서 디스크 제거

[root@kvm2 ~]# virsh detach-disk centos2 sdb
Disk detached successfully

[centos2]

ls /dev/sd*

sdb가 없어졌음

이제 제거된 voltest 1을 centos1에 연결하고 centos1에서 아무 디렉토리나 만든 다음 둘을 마운트해본다. 정상적인 상태라면 centos2에서 만든 파일이 보여야 한다.
[KVM2]

[root@kvm2 ~]# virsh attach-disk centos1 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully

remote 디렉토리 아래에 있는 1GB mytest를 centos1의 sdb에 영구적으로 연결하되, 동작 중인 현재 상태에서 바로 붙이겠다.

[KVM2의 centos1]

ls /dev/sd*

sdb와 sdb1이 연결되었다.

mkdir /mytest 
mount /dev/sdb1 /mytest 

-> 마운트

ls /mytest/ 

-> 마운트 확인

[참고]
도커 컨테이너와 같은 경우에는 휘발성이므로 자료가 영구보관되지 않는다. 이 경우 외부에 있는 스토리지를 활용하여 persistent volume(block storage) 을 구성하면 자료를 영구적으로 보관할 수 있게 된다!!

13. 인스턴스 삭제하기

[root@kvm2 ~]# virsh destroy centos2
Domain centos2 destroyed

[root@kvm2 ~]# virsh undefine centos2 --remove-all-storage 
Domain centos2 has been undefined
Volume 'hda'(/remote/centos2.qcow2) removed.
Volume 'sdb'(/remote/voltest1) removed.

[참고]
네트워크 삭제하기

virsh net-destroy default 
virsh net-undefine private1 

브릿지 네트워크 이용하기

  • 기존 KVM에서 활용 중인 eth0은 routed port(L3 port = IP 입력 가능)이다.
  • IP가 입력되는 포트는 별도의 네트워크가 구성된다 -> 네트워크를 구분하게 된다.
  • 현재 실습에서 가상 머신은 외부와 직접 통신하지 않으므로 공인 주소를 할당 받을 수 없다.
  • 기존 eth0를 routed port에서 ethernet port(L2)로 변경하면 eth0는 스위치의 하나의 포트로 동작하게 된다.
  • eth0은 L3포트가 아닌 L2로 동작해야 하므로 IP를 제거해야 한다.
  • eth0이 포함될 가상의 브릿지(linux bridge) br0

br0 생성

[KVM1]

[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0  ifcfg-eth1  ifcfg-eth2
[root@kvm1 network-scripts]# cp ifcfg-eth0 ifcfg-br0

eth0: 인터넷 연결용 인터페이스

[root@kvm1 network-scripts]# vi 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

위와 같이 수정

eth0 수정

[root@kvm1 network-scripts]# vi ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0 # 어떤 스위치에 포함될 것인가를 지정 

위와 같이 수정
eth0은 ip주소가 필요 없다.

변경 내용 반영 및 확인

[root@kvm1 network-scripts]# systemctl restart network 
[root@kvm1 ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 211.183.3.101  netmask 255.255.255.0  broadcast 211.183.3.255
        inet6 fe80::20c:29ff:fe93:ac3d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:93:ac:3d  txqueuelen 1000  (Ethernet)
        RX packets 193  bytes 17499 (17.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 183  bytes 22545 (22.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
		
[root@kvm1 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fe93:ac3d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:93:ac:3d  txqueuelen 1000  (Ethernet)
        RX packets 25947  bytes 2427234 (2.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17971  bytes 1558222 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
		
[root@kvm1 ~]# brctl show 
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c2993ac3d       no              eth0
virbr0          8000.525400fc8347       yes             virbr0-nic
virbr1          8000.525400491786       yes             virbr1-nic
[root@kvm1 ~]# 

brctl show: 리눅스에서 제공하는 오픈소스 스위치인 linux bridge의 정보를 확인할 수 있다.

브릿지 네트워크에 신규 VM 연결하기

[root@kvm1 ~]# cp /remote/centos1.qcow2 /remote/centos11.qcow2 

[root@kvm1 ~]# virt-install \
> --name centos11 \
> --vcpus 1 \
> --ram 1024 \
> --disk /remote/centos11.qcow2 \
> --import \
> --network bridge:br0 \
> --graphics vnc \
> --noautoconsole 
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.

Starting install...
Domain creation completed.

--network bridge:br0 -> 브릿지 네트워크 br0에 연결
--import -> 새로 설치하는 것이 아닌 qcow2 이미지 불러오기

[KVM1의 centos11]

ip a 

-> ip주소: 211.183.3.131

ping www.google.com -c 3 

storage로 ping

ping 211.183.3.100 -c 3 

웹서버 실행하고 윈도우 10에서 접속 가능 여부 확인해보기

yum -y install httpd 
systemctl start httpd 
systemctl stop firewalld 
curl -L https://www.naver.com -o /var/www/html/index.html  

윈도우에서 211.183.3.131 접속

SSH 관리를 위한 CONTROL 노드 구성

우리는 현재 별도의 컨트롤 노드는 없다.
이를 대신하여 172.16.1.101 을 컨트롤 노드로 활용할 계획이다.
컨트롤 노드에서 관리할 컴퓨트 노드의 주소는 172.16.1.101, 172.16.1.102 두대이다.

   ssh root@kvm1 virsh list --all

   ssh root@kvm2 virsh list --all

단, 패스워드는 묻지 말아야 한다!

kvm1 에서 /etc/ssh/ssh_config 파일에는 root 로 모든 호스트에 접속할 때에는 개인키를 이용하도록 해야 한다
각 서버에서 /etc/ssh/sshd_config 에서는 public key 를 이용하여 인증하도록 설정해야 한다
참고: https://velog.io/@ptah0414/Linux-2207-19-TIL#원격지에-있는-서버로-접속하기

[KVM1]
키페어 생성

[root@kvm1 ~]# ssh-keygen -q -f ~/.ssh/id_rsa -N ""

클라이언트 설정파일(ssh_config) 맨 아래에 호스트 정보 추가

[root@kvm1 ~]# vi /etc/ssh/ssh_config
Host kvm1
        User root
        IdentityFile /root/.ssh/id_rsa
Host kvm2
        User root
        IdentityFile /root/.ssh/id_rsa

[KVM1/KVM2]
id_rsa.pub(공개키)의 데이터를 kvm1과 kvm2의 ~/.ssh/authorized_keys 파일에 추가함

chmod 644 authorized_keys 

권한 변경

[root@kvm1 ~]# vi /etc/ssh/sshd_config
 43 PubkeyAuthentication yes
 65 PasswordAuthentication no

위와 같이 수정

결과 확인

[root@kvm1 ~]# ssh root@kvm1 virsh list --all
 Id    Name                           State
----------------------------------------------------
 5     centos11                       running

[root@kvm1 ~]# ssh root@kvm2 virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos1                        shut off
 -     centos11                       shut off

초반 서버인증을 위한 각 서버의 public key를 수집하기 위하여

ssh-keyscan kvm1 >> ~/.ssh/known_hosts 
ssh-keyscan kvm2 >> ~/.ssh/known_hosts 

를 해두면 초반 접속 시 yes/no 물어보는 것을 넘어가서 편리함

profile
take a look

0개의 댓글