이미지 출처: https://www.fiber-optic-transceiver-module.com/ovs-vs-linux-bridge-who-is-the-winner.html
이미지 출처: https://www.researchgate.net/figure/List-of-available-SDN-controllers_tbl1_338703576
SDN 더 알아보기
yum -y install epel-release https://www.rdoproject.org/repos/rdo-release.rpm
yum -y install openvswitch bridge-utils
yum update -y
systemctl start openvswitch && systemctl enable openvswitch
[KVM1/KVM2]
[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]# mv ifcfg-br0 ifcfg-vswitch01
[root@kvm1 network-scripts]# vi ifcfg-vswitch01
TYPE=OVSBridge
BOOTPROTO=none
NAME=vswitch01
DEVICE=vswitch01
DEVICETYPE=ovs
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8
TYPE, NAME, DEVICE, DEVICETYPE를 변경
[root@kvm1 network-scripts]# vi ifcfg-eth0
TYPE=OVSPort
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
DEVICETYPE=ovs
ONBOOT=yes
OVS_BRIDGE=vswitch01
TYPE, DEVICETYPE, OVS_BRIDGE를 변경
[root@kvm1 ~]# ifconfig vswitch01
vswitch01: 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::c4f1:6eff:fe93:5e46 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:93:ac:3d txqueuelen 1000 (Ethernet)
RX packets 199 bytes 15899 (15.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 148 bytes 18965 (18.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vswitch01에 ip주소가 할당되었다.
[root@kvm1 ~]# ovs-vsctl show
17cd6709-4b17-474e-8fd4-c8f668139677
Bridge "vswitch01"
Port "vswitch01"
Interface "vswitch01"
type: internal
Port "eth0"
Interface "eth0"
ovs_version: "2.12.0"
[root@kvm1 ~]#
[KVM1/KVM2]
[root@kvm1 ~]# ovs-vsctl add-br vswitch02
[KVM1]
[root@kvm1 ~]# virt-install \
> --name centos01 \
> --vcpus 1 \
> --ram 1024 \
> --disk /remote/centos01.qcow2 \
> --import \
> --network bridge:vswitch01,model=virtio,virtualport_type=openvswitch \
> --network bridge:vswitch02,model=virtio,virtualport_type=openvswitch,target=centos01_port1 \
> --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.
target: vswitch02는 centos01과 연결되는데, vswitch02에서 연결되는 포트의 이름을 centos1_port1로 할 것임. 추후에 이 포트에 vlan을 할당할 것임.
[KVM2]
[root@kvm2 ~]# virt-install \
--name centos02 \
--vcpus 1 \
--ram 1024 \
--disk /remote/centos02.qcow2 \
--import \
--network bridge:vswitch01,model=virtio,virtualport_type=openvswitch \
--network bridge:vswitch02,model=virtio,virtualport_type=openvswitch,target=centos02_port1 \
--graphics vnc \
--noautoconsole
virtual machine manager에서 인스턴스(centos01, centos02) 생성 확인 후 접속하기
만약 로그인이 되지 않고 멈춘다면 5.X대로 커널 업데이트 하기
yum 을 이용한 커널 업데이트 -> https://nirsa.tistory.com/64
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-ml
재부팅 후 5.X대 커널 선택
-----vswtich02---------[172.16.123.0/24]
|
| eth1 <--- .101
centos01
| eth0
|
-----vswitch01---------[211.183.3.0/24]
[centos01/centos02]
cd /etc/sysconfig/network-scripts
cp ifcfg-ens3 ifcfg-eth1
vi ifcfg-eth1
TYPE=Ethernet
NAME=eth1
DEVICE=eth1
IPADDR=172.16.123.101
PREFIX=24
ONBOOT=yes
centos01은 주소 .101로 설정
centos02는 주소 .102로 설정
이후,
ifdown eth1
ifup eth1
ip a
eth1 에 ip 주소가 보여야 함
vswitch02 <-(gre12)--- tunnel ---(gre21)-> vswitch01
[KVM1-centos1]
centos02로 ping 보내기
ping 172.16.123.102
지금은 터널이 없기 때문에 안 됨
[KVM1]
[root@kvm1 ~]# ovs-vsctl add-port vswitch02 gre12 \
> -- set interface gre12 type=gre options:remote_ip=211.183.3.102
vswitch02에 포트를 만듦
remote_ip는 centos2의 ip(.102)
[KVM2]
[root@kvm2 ~]# ovs-vsctl add-port vswitch02 gre21 \
> -- set interface gre21 type=gre options:remote_ip=211.183.3.101
vswitch02에 포트를 만듦
remote_ip는 centos1의 ip(.101)
[KVM1-centos1]
centos02로 ping 보내기
ping 211.183.3.102
[KVM1-centos2]
centos01로 ping 보내기
ping 211.183.3.101
[KVM1]
[root@kvm1 ~]# ovs-vsctl show
17cd6709-4b17-474e-8fd4-c8f668139677
Bridge "vswitch02"
Port "vswitch02"
Interface "vswitch02"
type: internal
Port "gre12"
Interface "gre12"
type: gre
options: {remote_ip="211.183.3.102"}
Port "centos01_port1"
Interface "centos01_port1"
Bridge "vswitch01"
Port "vnet0"
Interface "vnet0"
Port "vswitch01"
Interface "vswitch01"
type: internal
Port "eth0"
Interface "eth0"
ovs_version: "2.12.0"
centos01_port1가 있음
[KVM2]
[root@kvm2 ~]# ovs-vsctl show
fad52c82-5092-48d0-94da-19cb2e5f6b09
Bridge "vswitch01"
Port "vswitch01"
Interface "vswitch01"
type: internal
Port "eth0"
Interface "eth0"
Port "vnet0"
Interface "vnet0"
Bridge "vswitch02"
Port "gre21"
Interface "gre21"
type: gre
options: {remote_ip="211.183.3.101"}
Port "centos02_port1"
Interface "centos02_port1"
Port "vswitch02"
Interface "vswitch02"
type: internal
ovs_version: "2.12.0"
centos02_port1이 있음
1) 태그 다르게 설정
[KVM1]
[root@kvm1 ~]# ovs-vsctl set port centos01_port1 tag=123
centos01_port1의 태그를 123으로 지정
[KVM2]
[root@kvm2 ~]# ovs-vsctl set port centos02_port1 tag=12
centos02_port1의 태그를 12로 지정
[KVM1-centos01]
centos02로 ping 보내기
ping 211.183.3.102
vlan의 태그를 다르게 했으므로 통신 안 됨
2) 태그 같게 설정
[KVM2]
[root@kvm2 ~]# ovs-vsctl set port centos02_port1 tag=123
centos02_port1의 태그를 centos01_port1과 같은 123로 설정
[KVM1-centos01]
centos02로 ping 보내기
ping 211.183.3.102
vlan의 태그를 같게 했으므로 통신 됨
인스턴스 또는 VM을 만드는 방법
1. iso 파일을 이용한 설치
2. 클라우드 환경에서는 사용자별 필요한 볼륨의 사이즈, computing 자원 뿐만 아니라 필요한 key-pair 등을 설치 시 즉시 제공할 수 있어야 한다.
볼륨 사이즈 지정 + 웹서버 배포 + index.html 베포
virt-customize는 볼륨 사이즈에 대한 조절은 없다. virt-builder는 virt-customize의 기능과 virt-resize의 기능이 포함되어있어 원하는 크기의 볼륨 지정 및 패스워드, 패키지 설치 등이 가능하다.
[root@kvm1 ~]# virt-builder -l
opensuse-13.1 x86_64 openSUSE 13.1
opensuse-13.2 x86_64 openSUSE 13.2
opensuse-42.1 x86_64 openSUSE Leap 42.1
opensuse-tumbleweed x86_64 openSUSE Tumbleweed
alma-8.5 x86_64 AlmaLinux 8.5
centos-6 x86_64 CentOS 6.6
centos-7.0 x86_64 CentOS 7.0
centos-7.1 x86_64 CentOS 7.1
...
[root@kvm1 ~]# virt-builder centos-7.0 \
> --size 20G \
> --format qcow2 \
> -o /remote/test1.qcow2 \
> --root-password password:test123 \
> --install httpd,net-tools \
> --selinux-relabel
[ 14.2] Downloading: http://builder.libguestfs.org/centos-7.0.xz
[ 15.1] Planning how to build this image
[ 15.1] Uncompressing
[ 29.5] Resizing (using virt-resize) to expand the disk to 20.0G
[ 71.4] Opening the new disk
[ 80.0] Setting a random seed
[ 80.1] Setting the machine ID in /etc/machine-id
[ 80.1] Installing packages: httpd net-tools
[ 106.5] Setting passwords
[ 108.4] SELinux relabelling
[ 118.3] Finishing off
Output file: /remote/test1.qcow2
Output size: 20.0G
Output format: qcow2
Total usable space: 18.5G
Free space: 17.6G (94%)
virt-builder :
" 클라우드용 볼륨 이미지를 20GB 로 확장시킴" -> 볼륨의 이름은 "test1.qcow2"
--root-password password:test123 -> 볼륨내에 설치되어 있는 centos 의 루트패스워드를 test123 으로 설정하겠다.
--install -> 볼륨내에 미리 필요한 패키지를 설치해 두겠다.
--install httpd,net-tools => (yum -y install httpd net-tools)
--selinux-relabel: selinux를 활성화하여 로그인창으로 넘어갈 수 있게 됨
[root@kvm1 ~]# virt-install \
> --name test1 \
> --vcpus 1 \
> --ram 1024 \
> --network bridge:vswitch01,model=virtio,virtualport_type=openvswitch \
> --disk /remote/test1.qcow2 \
> --import \
> --graphics none
noautoconsole 옵션을 안 주었기 때문에 명령어 실행 후 바로 해당 인스턴스의 콘솔로 접속됨
https://libguestfs.org/virt-builder.1.html
--upload: 로컬 파일을 인스턴스에 업로드
--install: 볼륨 자체에 필요한 패키지를 설치하는 것
--firstboot-install: virt-install을 통해 인스턴스로 배포될 때 처음 부팅하면서 설치할 페키지
--run '스크립트파일': 스크립트 파일 -> 호스트에 스크립트를 작성해두고 이 내용을 볼륨에 적용하는 것
--runcommand '명령어': 명령어 -> 한 개 정도의 간단한 명령어를 볼륨에 적용하고자 하는 경우
--firstboot-command '명령어': 명령어 -> 인스턴스로 처음 부팅될 때 인스턴스 내에서 실행할 명령어
--mkdir DIR: 볼륨 내에 미리 필요한 디렉토리를 생성해 두고 싶을 때
--selinux-relabel: selinux 활성화
quiz. 나는 생성된 이미지가 인스턴스화 될 때 자동으로 웹서비스가 실행되도록 하고 싶다.
방법 1)
--install httpd --run-command 'systemctl enable httpd'
run command -> enable
방법 2)
--install httpd --firstboot-command 'systemctl start httpd'
firstboot-command -> start
quiz.
1. 로컬(kvm1 또는 kvm2)에 index.html 파일을 간단히 만드세요
[KVM1]
[root@kvm1 ~]# echo "<center><h2>DEFAULT WEG PAGE</h2></center>" > index.html
virt-builder centos-7.0 \
--size 20G \
--format qcow2 \
-o /remote/test1.qcow2 \
--root-password password:test123 \
--install httpd,net-tools \
--upload index.html:/var/www/html/index.html \
--run-command 'systemctl enable httpd' \
--run-command 'systemctl disable firewalld' \
--selinux-relabel
virt-install \
--name test1 \
--vcpus 1 \
--ram 1024 \
--network bridge:vswitch01,model=virtio,virtualport_type=openvswitch \
--disk /remote/test1.qcow2 \
--import \
--graphics none
[KVM1-test1]
ip주소 확인
[root@localhost ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 211.183.3.136 netmask 255.255.255.0 broadcast 211.183.3.255
inet6 fe80::5054:ff:fef9:dc6b prefixlen 64 scopeid 0x20<link>
ether 52:54:00:f9:dc:6b txqueuelen 1000 (Ethernet)
RX packets 60 bytes 8761 (8.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 35 bytes 5678 (5.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
윈도우에서 해당 ip로 접속
현재 eth0은 dhcp 방식으로 ip를 할당해준다.
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cat ifcfg-eth0
# Generated by dracut initrd
DEVICE="eth0"
ONBOOT=yes
NETBOOT=yes
UUID="05aa7060-4f43-416b-a9d0-5bfceb397193"
IPV6INIT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
NAME="eth0"
인스턴스를 생성한 뒤 eth0 인터페이스를 수정해 ip를 고정할 수 있다.
quiz. 우리는 위의 실습과제를 그대로 반영한 인스턴스를 추가로 하나 더 만든다.
단 아래의 조건을 만족해야 한다.
1. IP 주소는 211.183.3.222 를 사용해야 한다.
2. kvm1 또는 kvm2 의 ~/.ssh/authorized_keys 에 있는 퍼블릭 키를 가상머신에도 입력하여
kvm1 에 있는 사설키를 통해 가상머신에 접근할 수 있어야 한다!!!
3. --root-password 는 적용하지 않는다. 개인키로 kvm1 에서 접속할 수 있어야 한다.