실습1)
--upload 를 비롯한 virt-builder --help 목록에 나오는 명령어들을 활용하여 암호입력 없이 ssh 접속가능한 cent-ssh.img 이미지를 만들어보세요.(베이스이미지 - centos7.8) 위에서 수동으로 했던 설정(퍼블릭키 복사)을 아예 이미지화 하라는 뜻
--selinux-relabel : 혹시 이미지생성할때 셀리눅스관련 에러가 뜬다면 이 옵션을 붙이세요. ssh 접속시 암호 안묻게 할때도 이 옵션을 꼭 붙여주세요.
풀이1-1) 파일 업로드
1. 퍼블릭키 업로드( --upload /root/.ssh/id_rsa.pub:/root/id_rsa.pub )
- 일단은 root의 홈디렉토리에 파일을 업로드하고.
- 디렉토리 생성후(--mkdir /root/.ssh)
2. 혹시 authorized_keys에 다른 퍼블릭키가 존재할 수도 있으니까 첫부팅시 업로드한 퍼블릭키를 덮어쓰기가 아니라 추가하는 리다이렉션(>>)을 하면 좋을것 같다
--firstboot-command 'cat /root/id_rsa.pub >> /root/.ssh/authorized_keys'
[root@kvm3 ~]# virt-builder centos-7.8 --size=6G --format=qcow2 -o /remote/vm/cent-ssh.img --root-password password:test123 --mkdir /root/.ssh --upload /root/.ssh/id_rsa.pub:/root/id_rsa.pub --firstboot-command 'cat /root/id_rsa.pub >> /root/.ssh/authorized_keys' --selinux-relabel
virt-install --name cent-ssh --ram=2048 --vcpus=2 --network bridge=br0 --disk=/remote/vm/cent-ssh.img --import --noautoconsole --graphic=vnc

풀이1-2) --ssh-inject 명령
[root@kvm vm]# virt-builder centos-7.8 --size=6G --format=qcow2 -o /remote/vm/cent-inject.img --root-password password:test123 --ssh-inject root:file:/root/.ssh/id_rsa.pub --selinux-relabel
[root@kvm vm]# virt-install --name cent-inject --ram=2048 --vcpus=2 --network bridge=br0 --disk=/remote/vm/cent-inject.img --import --noautoconsole --graphic=vnc
자율과제)
centos-7.8을 베이스이미지로 하여 커스터마이징된 이미지로 VM을 생성했을때 해당 vm의 주소로 웹브라우저 접속시 KVM is easy라는 문구가 뜨도록 해보세요.
풀이)
centos7 자체가(iso는 물론 img파일들도) 레포지토리에 문제가 있다. 따라서 레포를 수정해줘야 httpd 설치가 가능할 것이다.
- 이미지 커스터마이징
virt-customize -a /remote/vm/repo.img --selinux-relabel --upload /etc/yum.repos.d/CentOS-Base.repo:/etc/yum.repos.d/CentOS-Base.repo --firstboot-install httpd --firstboot-command 'echo kvm is easy > /var/www/html/index.html' --firstboot-command 'systemctl disable --now firewalld && systemctl enable --now httpd'
# 베이스이미지를 업로드
# 호스트에서 게스트이미지에 파일 등을 복사할때, 이미 해당파일이 존재하는 경우 어떻게 될지 생각해야 함
ex. 덮어쓰기, 이미 파일이 존재해서 실패 등
# 이미지를 생성 후 잘 되는지 검증(테스트) 필요
- VM 생성
virt-install --name repo --ram=2048 --vcpus=2 --network bridge=br0 --disk=/remote/vm/repo.img --import --noautoconsole --graphic=vnc

Open vSwitch(OVS)
서로 다른 서버에 존재하는 '가상의' 네트워크끼리 통신하기 위한 '오버레이 네트워크'를 구성하는 틀
- OVS: 가상 네트워크끼리의 오버레이 네트워크
- VPN: 사설 네트워크끼리의 오버레이 네트워크

- 각 호스트에 있는 가상네트워크끼리는 통신이 안된다.
= 물리적으로 동떨어진 지역(site)에 있는 사설네트워크끼리 통신이 안되는것과 동일한 개념 - 목적: 서로 다른 호스트에 존재하는 가상의 네트워크가 서로 통신되도록 하는 것
< srv1 >
2 X 2 core 8GB 20GB, vm & hostname : srv1
IP: 211.183.3.10 /24, OS: centos7 minimal
- 방화벽 & 셀리눅스 off & 레포 수정
- 네트워크 매니저 off 및 비활성화
[root@srv1 ~]# systemctl stop NetworkManager
[root@srv1 ~]# systemctl disable NetworkManager
- 패키지 목록 업뎃
yum -y install epel-release https://www.rdoproject.org/repos/rdo-release.rpm
yum -y install wget openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel
mkdir -p ~/rpmbuild/SOURCES
wget http://openvswitch.org/releases/openvswitch-2.5.4.tar.gz
cp openvswitch-2.5.4.tar.gz ~/rpmbuild/SOURCES/
tar xfz openvswitch-2.5.4.tar.gz
rpmbuild -bb --nocheck openvswitch-2.5.4/rhel/openvswitch-fedora.spec
yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.5.4-1.el7.x86_64.rpm
[root@srv1 ~]# systemctl status openvswitch

- 패키지 설치
[root@srv1 ~]# yum install -y openvswitch bridge-utils net-tools
- 스냅샷

[root@srv1 ~]# cd /etc/sysconfig/network-scripts/
[root@srv1 network-scripts]# mv ifcfg-ens32 ifcfg-eth0


- ifcfg-ovsbr0 파일
[root@srv1 network-scripts]# vi ifcfg-ovsbr0
DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=none
NAME=ovsbr0
ONBOOT=yes
DNS1=8.8.8.8
IPADDR=211.183.3.10
PREFIX=24
GATEWAY=211.183.3.2
NM_CONTROLLED=no
- ifcfg-eth0 파일
[root@srv1 network-scripts]# vi ifcfg-eth0
NAME=eth0
DEVICE=eth0
DEVICETYPE=ovs
BOOTPROTO=none
TYPE=OVSPort
ONBOOT=yes
OVS_BRIDGE=ovsbr0
NM_CONTROLLED=no
- 인터페이스 이름 수정을 위한 부트로더파일 수정
[root@srv1 network-scripts]# vi /etc/default/grub

[root@srv1 network-scripts]# grub2-mkconfig -o /boot/grub2/grub.cfg
- 반영
[root@srv1 network-scripts]# systemctl enable openvswitch
[root@srv1 network-scripts]# init 6

# ifconfig = 활성화된 장치들만 보인다
- kvm관련 패키지들 설치
[root@srv1 ~]# yum -y install qemu-kvm libvirt virt-install virt-viewer virt-manager libguestfs*
[root@srv1 ~]# vi /etc/libvirt/qemu.conf

[root@srv1 ~]# systemctl enable --now libvirtd
[root@srv1 ~]# ovs-vsctl show


vswitch1 생성
현재 kvm에서 만든 vm들을 ovs에 두고 싶기 때문에 kvm에서 vswitch1이라는 네트워크를 하나 만들자!

- kvm의 네트워크들이 정의된 곳
[root@srv1 ~]# cd /etc/libvirt/qemu/networks/
- 대역대가 정의되지 않은 네트워크 생성
[root@srv1 networks]# vi vswitch1.xml
<network>
<name>vswitch1</name>
<forward mode='bridge'/>
<bridge name='vswitch1'/>
<virtualport type='openvswitch'/>
</network>
[root@srv1 networks]# virsh net-define vswitch1.xml
[root@srv1 networks]# virsh net-start vswitch1
[root@srv1 networks]# virsh net-autostart vswitch1

# kvm상에 네트워크가 잘 정의 되어 활성화된걸 확인 가능
[root@srv1 networks]# ovs-vsctl add-br vswitch1
# bridge=br=스위치, ovs상에 vswitch1이라는 스위치를 추가

[root@srv1 networks]# wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img
# 위에서 만든 스위치에 연결시킬 vm을 만들기 위해 cirros 이미지를 다운
- vm들을 둘 디렉토리 생성
[root@srv1 networks]# mkdir /vm
- 테스트 용도로 4개의 이미지 복사
[root@srv1 networks]# mv cirros-0.5.2-x86_64-disk.img /vm/cirros.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c1.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c2.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c3.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c4.img
[root@srv1 networks]# chmod 777 -R /vm
- c1 생성
[root@srv1 networks]# virt-install --name c1 --ram=512 --disk /vm/c1.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port1 --noautoconsole --graphics=vnc
# 가상의 포트 타입(virtualport_type='openvswitch')은 openvswitch
# source=vswitch1 이 포트는 vswitch이라는 이름을 갖는 ovs에 존재하는 포트
# target=port1 해당 포트의 이름은 port1이다. 이름은 내가 정하기 나름
- c2 생성
[root@srv1 networks]# virt-install --name c2 --ram=512 --disk /vm/c2.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port2 --noautoconsole --graphics=vnc

- 콘솔 접속
[root@srv1 networks]# virsh console c1
- eth0 인터페이스 장치의 아이피: 192.168.100.10/24
$ sudo ip a add 192.168.100.10/24 dev eth0

# 비슷한 방식으로 c2에 콘솔 접속하여 ip를 192.168.100.20/24로 구성

# 같은 호스트(srv1)의 같은 스위치에 연결되어있으므로 c2에서 c1으로 통신이 잘된다.
< srv2 >
2 X 2 core 8GB 20GB, vm & hostname : srv2
IP: 211.183.3.20 /24, OS: centos7 minimal
실습)
srv2에서 vswitch1을 구성하시고, port5,port6에 연결된 c5,c6을 만들어보세요. c5,c6에서 c1,c2로 통신이 되는지 확인해보세요. c5,c6의 IP는 192.168.100.50/24, 192.168.100.60/24 로 하세요.
[root@srv2 networks]# vi vswitch1.xml
<network>
<name>vswitch1</name>
<forward mode='bridge'/>
<bridge name='vswitch1'/>
<virtualport type='openvswitch'/>
</network>
[root@srv2 networks]# virsh net-define vswitch1.xml
[root@srv2 networks]# virsh net-start vswitch1
[root@srv2 networks]# virsh net-auto vswitch1
[root@srv2 networks]# virsh net-autostart vswitch1
[root@srv2 networks]# ovs-vsctl add-br vswitch1
[root@srv2 networks]# mkdir /vm
[root@srv2 networks]# cd /vm
[root@srv2 vm]# wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c5.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c6.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c7.img
[root@srv2 vm]# chmod 777 -R .

- c5의 주소
$ sudo ip addr add 192.168.100.50/24 dev eth0
- c6의 주소
$ sudo ip addr add 192.168.100.60/24 dev eth0


# vpn할때도 peer와 local을 정했던것처럼 여기서도 ovs를 통해 비슷한걸 할것이다.
[root@srv1 networks]# ovs-vsctl add-port vswitch1 gre12 -- set interface gre12 type=gre option:remote_ip=211.183.3.20
# srv1에서 srv2(211.183.3.20) 상대를 지정
[root@srv2 vm]# ovs-vsctl add-port vswitch1 gre21 -- set interface gre21 type=gre option:remote_ip=211.183.3.10
# srv2에서 srv1(211.183.3.10) 상대를 지정

# 양쪽에서 gre터널링을 구성후에 c6에서 c1으로 통신이 되는걸 확인 가능
= 같은 스위치에 연결되었고, 이미 ip대역은 동일하게 설정해놓은 상태
→ 목적: 이렇게 서로 다른 호스트에 존재하는 VM끼리 통신이 되게 하는것


# 하나의 스위치이기때문에 vlan으로 나눌수도 있을것이다.
srv1에서
virt-install --name c3 --ram=512 --disk /vm/c3.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port3 --noautoconsole --graphics=vnc
virt-install --name c4 --ram=512 --disk /vm/c4.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port4 --noautoconsole --graphics=vnc
- c3의 ip설정
sudo ip addr add 192.168.100.30/24 dev eth0
- c4의 ip설정
sudo ip addr add 192.168.200.40/24 dev eth0
- vlan 10 태깅
ovs-vsctl set port port3 tag=10
- vlan 20 태깅
ovs-vsctl set port port4 tag=20
srv2에서
virt-install --name c7 --ram=512 --disk /vm/c7.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port7 --noautoconsole --graphics=vnc
virt-install --name c8 --ram=512 --disk /vm/c8.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port8 --noautoconsole --graphics=vnc
- c7의 ip설정
sudo ip addr add 192.168.100.70/24 dev eth0
- c8의 ip설정
sudo ip addr add 192.168.200.80/24 dev eth0
- vlan 10 태깅
ovs-vsctl set port port7 tag=10
- vlan 20 태깅
ovs-vsctl set port port8 tag=20


kvm-자율과제)
서울 본사에 존재하는 WEB과 TOMCAT은 커스터마이징된 이미지를 통해 설치된 kvm의 vm이며 본사내에 다른 대역에 존재한다. DB는 부산지사에 존재하는 VMware의 vm이다. 3 tier로 구성된 이들 서버들은 211.183.3.80을 통해 간단한 웹페이지를 배포하고, 211.183.3.80/was 를 통해 jsp파일을 배포할 예정이며 이를 지사의 데이터베이스가 연동되는 간단한 파일로 증명해야한다.
*모든 서버는 TUI로 하세요.
ovs-자율과제)
서버 3개를 설치한다. 각각의 이름은 park chan min.
각 서버에서 kvm으로 두개의 vm을 생성하세요.
park = 12
chan = 34
min = 56
13 = vlan 10 (192.168.10.0/24)
45 = vlan 20 (192.168.20.0/24)
26 = vlan 30 (192.168.30.0/24)
이렇게 구성 후 서로 통신이 잘 되는지 확인해보세요.
'AWS Cloud School 8기 > openVswitch' 카테고리의 다른 글
45일차) 2025-03-05(KVM, OVS 문제풀이, STP) (0) | 2025.03.05 |
---|