Open vSwitch 찍먹해보기 - VxLAN

Kim, Beomgoo·2023년 5월 26일
0
post-thumbnail

환경 구성

물리적인 컴퓨터 두 대로, 각각 컴퓨터에 하나씩 가상 머신을 생성하는 것이 이상적이지만 사용 가능한 x86 컴퓨터가 한 대 뿐이라 가상 머신을 두 개 띄우고, 각 가상 머신을 물리 머신으로 간주하여 각 가상 머신 위에 또 가상 머신을 구동하는 형태로 환경을 구성하였다.

KVM을 이용해 가상 머신을 생성하게 되면, 기본적으로 가상 브릿지 virbr0이 생성된다. 이 가상 브릿지는 NAT 기능을 제공하여 외부(가상 머신 입장에서)와의 통신이 가능하게 해준다.

용어 정리

본 글에서 가상 머신이라는 단어의 혼동을 막기 위해 다음과 같이 용어를 정리한다.

  • 머신 노드. 물리적인 두 대의 머신을 흉내내고자 생성한 가장 바깥의 가상 머신
    • KVM Machine 01, 02
  • 게스트 또는 게스트 OS. 실질적으로 가상 머신 역할을 할 가장 안쪽의 가상 머신
    • Guest 01, Guest 02

목표

현재 Guest01과 Guest02는 현재 물리적으로 떨어져 있는 노드 위에서 동작하고 있는 가상 머신들이다(라고 가정하자!). 이들은 서로 다른 로컬 네트워크에 속해있으므로 서로 통신할 수 있는 방법이 없다.
OVS 스위치를 추가하여, VxLAN을 구성하고 터널링으로 연결하여 서로 통신할 수 있게 구성해 보자!

Open vSwitch

소개

Open vSwitch(OVS)는 분산 가상 멀티플레이어 스위치의 오픈 소스 구현체이다. Open vSwitch의 주요 목적은 하드웨어 가상화의 스위칭 스택을 제공하면서 컴퓨터 네트워크에 사용되는 다중 프로토콜과 표준들을 지원하는 것이다.
[출처: 위키백과]

설치

Ubuntu 22.04 LTS 기준으로 설치 과정을 서술한다.
양쪽 머신 노드 모두 OVS를 설치한다.

$ sudo apt-get update 
$ sudo apt-get install openvswitch-common openvswitch-switch
$ sudo ovs-vsctl --version

설치가 끝났다면 각 머신 노드에서 설정을 진행해야 한다. 우리의 게스트 OS들은 외부 인터넷과 통신할 NIC 1개, VxLAN 통신용 NIC 1개로 총 2개의 NIC가 필요하다. 이를 위해서 기존에 생성했던 게스트 OS들은 삭제하고 다시 생성한다. (게스트 OS 생성 시 가상 디스크 파일을 남겨뒀으므로 이를 이용해 import하여 생성한다.)

머신 노드 1 설정

ovs bridge 생성

VxLAN을 연결할 가상 스위치 vswitch02를 생성한다.

$ sudo ovs-vsctl add-br vswitch02

게스트 1 재생성

sudo virt-install --name guest_01 \
  --vcpus 1 \
  --ram 2048 \
  --disk /home/user01/kvm/guest_01.img --import \
  --network bridge:virbr0,model=virtio \
  --network bridge:vswitch02,model=virtio,virtualport_type=openvswitch,target=guest01_port1 \
  --graphics none \
  --noautoconsole \
  --os-variant ubuntu20.04

게스트 1 네트워크 설정

게스트1의 콘솔에 접속해 다음과 같이 네트워크 인터페이스를 설정한다.

$ sudo vi /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0:
      dhcp4: true
    enp2s0:
      addresses:
        - 172.16.10.10/24
      nameservers:
        addresses:
          - 1.1.1.1
          - 8.8.8.8
      routes:
        - to: 172.16.10.0/24
          via: 172.16.10.1
  version: 2

파일을 저장하고 netplan apply 한다. netplan은 yaml 파일을 이용해 네트워크 인터페이스를 관리할 수 있는 네트워크 관리 시스템이다.

$ sudo netplan apply

머신 노드 2 설정

ovs bridge 생성

VxLAN을 연결할 가상 스위치 vswitch02를 생성한다.

$ sudo ovs-vsctl add-br vswitch02

게스트 2 재생성

sudo virt-install --name guest_02 \
  --vcpus 1 \
  --ram 2048 \
  --disk /home/user02/kvm/guest_02.img --import \
  --network bridge:virbr0,model=virtio \
  --network bridge:vswitch02,model=virtio,virtualport_type=openvswitch,target=guest02_port1 \
  --graphics none \
  --noautoconsole \
  --os-variant ubuntu20.04

게스트 2 네트워크 설정

게스트2의 콘솔에 접속해 다음과 같이 네트워크 인터페이스를 설정한다.

$ sudo vi /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0:
      dhcp4: true
    enp2s0:
      addresses:
        - 172.16.10.11/24
      nameservers:
        addresses:
          - 1.1.1.1
          - 8.8.8.8
      routes:
        - to: 172.16.10.0/24
          via: 172.16.10.1
  version: 2
$ sudo netplan apply

여기까지는 VxLAN으로 구성될 네트워크 인터페이스들을 세팅한 것으로, 당연히 VxLAN과 터널링은 구성하지 않았으므로 아직 통신은 되지 않는다.

VxLAN 구성

머신 노드 1 설정

$ sudo ip addr add 172.16.10.1/24 dev vswitch02 && sudo ip link set dev vswitch02 up
$ sudo ovs-vsctl add-port vswitch02 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=192.168.122.43

이때 원격지 IP remote_ip는 머신 노드 2(반대편 노드)의 IP를 설정한다.
ovs-vsctl show로 잘 설정되었는지 확인한다.

머신 노드 2 설정

$ sudo ip addr add 172.16.10.1/24 dev vswitch02 && sudo ip link set dev vswitch02 up
$ sudo ovs-vsctl add-port vswitch02 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=192.168.122.166

마찬가지로 원격지 IP remote_ip는 머신 노드 1(반대편 노드)의 IP를 설정한다.

통신 확인

  • 게스트1 -> 게스트2

    • 172.16.10.10/24 -> 172.16.10.11/24

  • 게스트2 -> 게스트1

    • 172.16.10.11/24 -> 172.16.10.10/24

참고자료

profile
하나에 하나를 보탠다

0개의 댓글