ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클라우드 인스턴스에서 devstack 구축하기
    오픈스택 2021. 7. 25. 12:49

    devstack은 openstack 테스트 환경을 구축할 수 있는 가장 손 쉬운 방법이다. 보통은 자신의 컴퓨터에서 virtualbox vm을 생성해서 devstack을 설치하지만, 실수로 vm을 끄기라도 한다면 온전한 형태의 devstack을 다시 만들기는 어렵다. 이 경우 devstack 환경을 다시 만드는 것이 마음이 편하다.

     

    그래서 요즘에 virtualbox를 이용하지 않고, 클라우드 인스턴스에 devstack을 구축해서 항상 구동중이면서 어디에서든지 접근할 수 있도록 하고 싶은 요구사항이 생겨났다. virtualbox에서 구현하는 것과 큰 차이는 없지만, 클라우드라는 환경에서 고려해야하는 점들이 있었고 어떻게 해결하였는지 이제부터 설명하겠다.

     

    고민) provider network를 어떻게 제공할 것인가?

    provider network는 OpenStack 입장에서 인터넷 통신이 가능한 (주로 공인 IP를 사용하는) 네트워크를 의미한다. 이 네트워크는 OpenStack에 floating ip를 제공하거나 가상 네트워크의 nat ip를 제공한다. virtualbox를 이용할 경우, 이 네트워크를 컴퓨터가 연결된 공유기의 네트워크와 인터페이스로 지정하고 공유기의 dhcp에서 일정 대역을 빼서 OpenStack에 할당해준다. 그런데 클라우드 인스턴스에서는 이런 네트워크를 어떻게 만들어야할까?

     

    기본적으로 클라우드 인스턴스에는 인터넷이 가능한 네트워크에 연결된 nic 포트 하나가 제공된다. 제공되는 네트워크의 IP는 클라우드에 의해 자동으로 할당 및 관리되기 때문에 OpenStack에서 임의로 사용하기 어렵다. 따라서, 인스턴스 내부에서 가상의 provider network를 만들고 그것을 OpenStack이 사용하도록 해줘야한다. 

     

    방법) Linux Bridge로 가상의 provider network만들기

    가상의 provider network를 만들기 위해 Linux Bridge를 이용할 것이다. Linux Bridge에 사설 네트워크를 할당한 뒤 iptables를 이용해 인터넷이 가능한 인터페이스와 nat를 시켜주면 bridge network에서도 인터넷이 가능하다.

    그림으로 표현하면 다음과 같다.

    apt install bridge-utils
    
    brctl addbr mybr0
    ifconfig mybr0 192.168.100.1 netmask 255.255.255.0 up
    ip link set mybr0 up
    
    iptables -I FORWARD -j ACCEPT
    iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADE

     

    고민2) 외부에서 horizon 접근가능하도록 설정하기

    devstack을 설치하면 기본적으로 OS에 설정된 ip로 horizon을 비롯한 api endpoint를 지정한다. 클라우드 인스턴스 OS에 설정된 ip는 사설 대역이므로, 인스턴스에 floating ip (aws는 elastic ip)를 붙인다고 해도, api endpoint와 horizon을 온전하게 외부에서 이용하기 어렵다. 따라서, devstack 설정파일에 인스턴스의 floating ip를 넣어주고, 그 아이피로 바인딩할 수 있게 loopback interface에 ip를 넣어줘야한다.

     

    예를 들어 인스턴스에 연결된 floating ip 가 1.2.3.4 라면 다음과 같이 loopback interface에 ip를 추가한다.

    ip addr add 1.2.3.4/32 dev lo

     

    local.conf 설정

    마지막으로 local.conf를 설정해주면 devstack을 구축할 준비가 완료되었다.

    이 설정에서는 openvswitch를 이용해 네트워크를 구축하며, floating ip 대역으로 192.168.100.0/24 를 사용하고, 그 네트워크를 제공하는 인터페이스는 위에서 생성한 mybr0 Linux Bridge로 지정하였다.

     

    [[local|localrc]]
    HOST_IP=1.2.3.4
    FORCE=yes
    ADMIN_PASSWORD=secret
    DATABASE_PASSWORD=$ADMIN_PASSWORD
    RABBIT_PASSWORD=$ADMIN_PASSWORD
    SERVICE_PASSWORD=$ADMIN_PASSWORD
    
    disable_service etcd3
    
    ## Neutron options
    Q_USE_SECGROUP=True
    FLOATING_RANGE="192.168.100.0/24"
    IPV4_ADDRS_SAFE_TO_USE="10.0.0.0/22"
    Q_FLOATING_ALLOCATION_POOL=start=192.168.100.50,end=192.168.100.250
    PUBLIC_NETWORK_GATEWAY="192.168.100.1"
    PUBLIC_INTERFACE=mybr0
    
    # Open vSwitch provider networking configuration
    Q_USE_PROVIDERNET_FOR_PUBLIC=True
    OVS_PHYSICAL_BRIDGE=br-ex
    PUBLIC_BRIDGE=br-ex
    OVS_BRIDGE_MAPPINGS=public:br-ex

    이렇게 설정하면 public interface로 mybr0를 이용하고, ovs가 public network를 이용하기 위한 ovs bridge `br-ex`를 만들어서 floating ip network와 연결하도록 설정한다. 

    아래는 "ovs-vsctl show" 를 통해 확인한 br-ex ovs bridge 설정 내용이다.

        Bridge br-ex
            Controller "tcp:127.0.0.1:6633"
                is_connected: true
            fail_mode: secure
            datapath_type: system
            Port phy-br-ex
                Interface phy-br-ex
                    type: patch
                    options: {peer=int-br-ex}
            Port mybr0
                Interface mybr0
            Port br-ex
                Interface br-ex
                    type: internal

    그리고 `ip a`를 통해 인터페이스를 확인해보면 mybr0에 할당한 192.168.100.1 이, br-ex로 옮겨져간 것을 확인할 수 있다.

    10: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
        link/ether 46:6f:e7:cc:b4:4b brd ff:ff:ff:ff:ff:ff
        inet 192.168.100.1/24 brd 192.168.100.255 scope global br-ex
           valid_lft forever preferred_lft forever
        inet6 2001:db8::2/64 scope global
           valid_lft forever preferred_lft forever
        inet6 fe80::446f:e7ff:fecc:b44b/64 scope link
           valid_lft forever preferred_lft forever

     

    반응형

    댓글 0

Designed by Tistory.