'OpenStack'에 해당되는 글 9건

  1. 2015.10.13 OpenStack Kilo Single Node install (45)
  2. 2015.10.08 ONOS Controller와 OpenStack 연결
  3. 2015.07.07 OpenStack M 릴리즈 네이밍을 반대합니다.
  4. 2015.06.29 OpenStack DVR - SlideShare
  5. 2015.06.29 OpenStack DVR – DNAT Traffic
  6. 2015.06.29 OpenStack DVR – SNAT Traffic
  7. 2015.06.19 OpenStack DVR Overview
  8. 2015.06.19 OpenStack DVR - East/West Traffic Flow
  9. 2015.06.19 OpenStack Juno Install using DevStack

OpenStack Kilo Single Node install

OpenStack/Install_OpenStack 2015.10.13 22:19

서버 하나에 OpenStack 설치


OpenStack을 설치하는 방법에는 여러가지가 있다.


대표적으로 Single Node / Multi Node로 나뉠 수 있는데 Single Node는 서버 하나에 모든 OpenStack을 설치하는 것이고 Multi Node는 OpenStack 서비스에 맞게 서버를 나뉘어 설치하는 것이다.


보통 Single Node에 설치하는 경우 DevStack 또는 ContOS에서 PackStack을 사용하곤 한다.

(CentOS 에서 사용하는 PackStack은 매우 매력적이다.)


DevStack을 이용하는 경우 설치 및 실행에는 문제가 없으나 서비스 별 리스타트를 해야하는 경우 꽤 복잡한 절차가 기다리고 있다.


이런 경우에 '그냥 서버 하나에 모두 설치할걸..' 하는 생각을 많이 하곤 한다.


본 포스팅은 서버하나에 OpenStack Kilo 버전을 설치하는 내용이다. (VirtualBox 및 VMware를 사용하지 않는다)



OpenStack Single Node Install (Kilo version)




1. 기본 설정


1-1. IP 설정

    • neutron 인스톨 이후에 br-ex를 사용
    • neutron 인스톨 전에는 eth0에 br-ex에 설정할 IP 내용이 적용되어야 함

$ sudo vi /etc/network/interfaces


# Public Network

auto br-ex

iface br-ex inet static

      address <Public_IP>

      gateway <Public Network GW>

      netmask 255.255.255.0

      dns-nameservers 8.8.8.8 8.8.4.4


auto eth0

iface eth0 inet manual

      up ip link set dev $IFACE up

      down ip link set dev $IFACE down


# Management Network

auto eth1

iface eth1 inet static

      address 10.0.0.5

      netmask 255.255.255.0


# Data Network

auto eth2

iface eth2 inet static

      address 20.0.0.5

      netmask 255.255.255.0


1-2. 업데이트 & 업그레이드 / 필수 프로그램 설치


$ sudo apt-get update

$ sudo apt-get -y upgrade


1-3. OpenStack Kilo Repository 설정


apt-get install ubuntu-cloud-keyring

$ sudo su

$ sudo echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu trusty-updates/kilo main" > /etc/apt/sources.list.d/cloudarchive-kilo.list

$ exit

$ sudo apt-get update

$ sudo apt-get -y upgrade


$ sudo reboot



2. RabbitMQ Server


2-1. RabbitMQ Server install


sudo apt-get install -y rabbitmq-server


2-2. change user guest password

  • 본 예제에서 guest 사용자에 대한 password는 rabbit으로 교체

sudo rabbitmqctl change_password guest rabbit



3. MYSQL Server


3-1. MySql Server install

  • root password를 설정

sudo apt-get install -y mysql-server python-mysqldb


3-2. MySql 설정


sudo vi /etc/mysql/my.cnf


--------------------------------------------------------------

...

[mysqld]

...

bind-address = 0.0.0.0

default-storage-engine = innodb

innodb_file_per_table

collation-server = utf8_general_ci

init-connect = 'SET NAMES utf8'

character-set-server = utf8

...

--------------------------------------------------------------


3-3. MySql Server 재실행


sudo service mysql restart



4. NTP 및 Utility


4-1. ntp/vlan/bridge-utils install


sudo apt-get install -y ntp vlan bridge-utils


4-2. NTP 설정


sudo vi /etc/sysctl.conf


--------------------------------------------------------------

net.ipv4.ip_forward=1

net.ipv4.conf.all.rp_filter=0

net.ipv4.conf.default.rp_filter=0

--------------------------------------------------------------


4-3. NTP 재실행


sudo sysctl -p



5. Keystone


5-1. keystone install


sudo apt-get install -y keystone


5-2. keystone DB 테이블 생성


$ mysql -u root -p


CREATE DATABASE keystone;

# GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone_dbpass';

# quit


5-3. keystone 설정


$ sudo vi /etc/keystone/keystone.conf


--------------------------------------------------------------

...

connection = mysql://keystone:keystone_dbpass@<management_ip>/keystone

...

--------------------------------------------------------------


5-4. keystone 재실행 및 DB sync


sudo service keystone restart

$ sudo keystone-manage db_sync


5-5. keystone 사용자 등록


export OS_SERVICE_TOKEN=ADMIN

$ export OS_SERVICE_ENDPOINT=http://<management_ip>:35357/v2.0


$ keystone tenant-create --name=admin --description="Admin Tenant"

$ keystone tenant-create --name=service --description="Service Tenant"

$ keystone user-create --name=admin --pass=admin --email=admin@example.com

$ keystone role-create --name=admin

$ keystone user-role-add --user=admin --tenant=admin --role=admin


5-6. keystone 서비스 및 endpoint 생성


keystone service-create --name=keystone --type=identity --description="Keystone Identity Service"

$ keystone endpoint-create --region=testbed01 --service=keystone --publicurl=http://<management_ip>:5000/v2.0 --internalurl=http://<management_ip>:5000/v2.0 --adminurl=http://<management_ip>:35357/v2.0


5-7. export 정보 삭제


unset OS_SERVICE_TOKEN

$ unset OS_SERVICE_ENDPOINT


5-8. keystone admin 계정 파일 생성


$ vi admin_keystone


--------------------------------------------------------------

export OS_USERNAME=admin

export OS_PASSWORD=admin

export OS_TENANT_NAME=admin

export OS_AUTH_URL=http://<management_ip>:35357/v2.0

--------------------------------------------------------------


5-9. keystone 동작 및 토큰 확인


source admin_keystone


$ keystone token-get

$ keystone user-list



6. Glance


6-1. glance install


sudo apt-get install -y glance


6-2. glance DB 테이블 생성


mysql -u root -p


# CREATE DATABASE glance;

# GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_dbpass';

# quit


6-3. keystone 사용자 glance 등록


keystone user-create --name=glance --pass=glance_pass --email=glance@example.com

$ keystone user-role-add --user=glance --tenant=service --role=admin

$ keystone service-create --name=glance --type=image --description="Glance Image Service"

$ keystone endpoint-create --region=testbed01 --service=glance --publicurl=http://<management_ip>:9292 --internalurl=http://<management_ip>:9292 --adminurl=http://<management_ip>:9292



6-4. glance 설정


sudo vi /etc/glance/glance-api.conf


--------------------------------------------------------------

...

rabbit_password = rabbit

...

# sqlite_db = /var/lib/glance/glance.sqlite

connection = mysql://glance:glance_dbpass@<management_ip>/glance

...


[keystone_authtoken]

identity_uri = http://<management_ip>:35357

admin_tenant_name = service

admin_user = glance

admin_password = glance_pass

...


[paste_deploy]

flavor = keystone

...

--------------------------------------------------------------


sudo vi /etc/glance/glance-registry.conf


--------------------------------------------------------------

...

rabbit_password = rabbit

...

# sqlite_db = /var/lib/glance/glance.sqlite

connection = mysql://glance:glance_dbpass@<management_ip>/glance


...

[keystone_authtoken]

identity_uri = http://<management_ip>:35357

admin_tenant_name = service

admin_user = glance

admin_password = glance_pass


...

[paste_deploy]

flavor = keystone

...

--------------------------------------------------------------


6-5. glance 재실행


sudo service glance-api restart

$ sudo service glance-registry restart


6-6. glance DB sync 및 이미지 등록/확인


sudo glance-manage db_sync


$ glance image-create --name Cirros --is-public true --container-format bare --disk-format qcow2 --location https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img


$ glance image-list



7. NOVA


7-1. nova install


sudo apt-get install -y nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient nova-compute nova-console


7-2. nova DB 테이블 생성


mysql -u root -p


# CREATE DATABASE nova;

# GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_dbpass';

# quit


7-3. keystone 사용자 nova 등록


keystone user-create --name=nova --pass=nova_pass --email=nova@example.com

$ keystone user-role-add --user=nova --tenant=service --role=admin

$ keystone service-create --name=nova --type=compute --description="OpenStack Compute"

$ keystone endpoint-create --region=testbed01 --service=nova --publicurl=http://<management_ip>:8774/v2/%\(tenant_id\)s --internalurl=http://<management_ip>:8774/v2/%\(tenant_id\)s --adminurl=http://<management_ip>:8774/v2/%\(tenant_id\)s


7-4. nova 설정


sudo vi /etc/nova/nova.conf


--------------------------------------------------------------

[DEFAULT]

dhcpbridge_flagfile=/etc/nova/nova.conf

dhcpbridge=/usr/bin/nova-dhcpbridge

logdir=/var/log/nova

state_path=/var/lib/nova

lock_path=/var/lock/nova

force_dhcp_release=True

libvirt_use_virtio_for_bridges=True

verbose=True

ec2_private_dns_show_ip=True

api_paste_config=/etc/nova/api-paste.ini

enabled_apis=ec2,osapi_compute,metadata

rpc_backend = rabbit

auth_strategy = keystone

my_ip = <management_ip>

vnc_enabled = True

vncserver_listen = <management_ip>

vncserver_proxyclient_address = <management_ip>

novncproxy_base_url = http://<public_ip>:6080/vnc_auto.html


network_api_class = nova.network.neutronv2.api.API

security_group_api = neutron

linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver

firewall_driver = nova.virt.firewall.NoopFirewallDriver


scheduler_default_filters=AllHostsFilter


[database]

connection = mysql://nova:nova_dbpass@<management_ip>/nova


[oslo_messaging_rabbit]

rabbit_host = 127.0.0.1

rabbit_password = rabbit


[keystone_authtoken]

auth_uri = http://<management_ip>:5000

auth_url = http://<management_ip>:35357

auth_plugin = password

project_domain_id = default

user_domain_id = default

project_name = service

username = nova

password = nova_pass


[glance]

host = <management_ip>


[oslo_concurrency]

lock_path = /var/lock/nova


[neutron]

service_metadata_proxy = True

metadata_proxy_shared_secret = openstack

url = http://<management_ip>:9696

auth_strategy = keystone

admin_auth_url = http://<management_ip>:35357/v2.0

admin_tenant_name = service

admin_username = neutron

admin_password = neutron_pass

--------------------------------------------------------------


sudo vi /etc/nova/nova-compute.conf


[DEFAULT]

compute_driver=libvirt.LibvirtDriver

[libvirt]

virt_type=qemu


7-5. nova DB sync 및 재실행/확인


sudo nova-manage db sync


$ sudo service nova-api restart

$ sudo service nova-cert restart

$ sudo service nova-consoleauth restart

$ sudo service nova-scheduler restart

$ sudo service nova-conductor restart

$ sudo service nova-novncproxy restart

$ sudo service nova-compute restart

$ sudo service nova-console restart


$ sudo nova-manage service list



8. Neutron


8-1. neutron install


sudo apt-get install -y neutron-server neutron-plugin-openvswitch neutron-plugin-openvswitch-agent neutron-common neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent openvswitch-switch


8-2. neutron DB 테이블 생성


mysql -u root -p


# CREATE DATABASE neutron;

# GRANT ALL ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron_dbpass';

# quit


8-3. keystone 사용자 neutron 등록


keystone user-create --name=neutron --pass=neutron_pass --email=neutron@example.com

$ keystone service-create --name=neutron --type=network --description="OpenStack Networking"

$ keystone user-role-add --user=neutron --tenant=service --role=admin

$ keystone endpoint-create --region=testbed01 --service=neutron --publicurl http://<management_ip>:9696 --adminurl http://<management_ip>:9696  --internalurl http://<management_ip>:9696


8-4. neutron 설정


sudo vi /etc/neutron/neutron.conf


--------------------------------------------------------------

[DEFAULT]

......

verbose = True

debug = True

core_plugin = ml2

service_plugins = router

auth_strategy = keystone

allow_overlapping_ips = True

notify_nova_on_port_status_changes = True

notify_nova_on_port_data_changes = True

nova_url = http://<management_ip>:8774/v2

nova_region_name = testbed01

...

rpc_backend=rabbit


[agent]

......

root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf


[keystone_authtoken]

auth_uri = http://<management_ip>:5000

auth_url = http://<management_ip>:35357

auth_plugin = password

project_domain_id = default

user_domain_id = default

project_name = service

username = neutron

password = neutron_pass


[database]

......

connection = mysql://neutron:neutron_dbpass@<management_ip>/neutron


[nova]

......

auth_url = http://<management_ip>:35357

auth_plugin = password

project_domain_id = default

user_domain_id = default

region_name = testbed01

project_name = service

username = nova

password = nova_pass


[oslo_concurrency]

......

lock_path = /var/lock/neutron/


[oslo_messaging_rabbit]

......

rabbit_host = localhost

rabbit_userid = guest

rabbit_password = rabbit

rabbit_virtual_host = /

--------------------------------------------------------------


sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini


--------------------------------------------------------------

[ml2]

type_drivers = flat,vlan,gre,vxlan

tenant_network_types=vxlan

mechanism_drivers=openvswitch

...


[ml2_type_gre]

tunnel_id_ranges = 1:1000


[ml2_type_vxlan]

vni_ranges = 1001:2000


[securitygroup]

enable_security_group=True

enable_ipset = True

firewall_driver=neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver


[ovs]

local_ip = <data_ip>

tunnel_type = vxlan

tunnel_bridge = br-tun

integration_bridge = br-int

tunnel_id_ranges=1001:2000

tenant_network_type = vxlan

enable_tunneling = True


[agent]

minimize_polling = True

root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf

tunnel_types = vxlan

vxlan_udp_port = 4789

l2_population = False

--------------------------------------------------------------


sudo vi /etc/neutron/metadata_agent.ini


--------------------------------------------------------------

[DEFAULT]

auth_url = http://<management_ip>:5000/v2.0

auth_region = testbed01

admin_tenant_name = service

admin_user = neutron

admin_password = neutron_pass

metadata_proxy_shared_secret = openstack

--------------------------------------------------------------


sudo vi /etc/neutron/dhcp_agent.ini


--------------------------------------------------------------

[DEFAULT]

interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

use_namespaces = True

--------------------------------------------------------------


sudo vim /etc/neutron/l3_agent.ini


--------------------------------------------------------------

[DEFAULT]

interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

use_namespaces = True

--------------------------------------------------------------


8-5. ovs 브릿지 생성 및 포트 바인딩

    • 최초 설정한 네트워크(/etc/network/interfaces)의 br-ex 활성화

$ sudo ovs-vsctl add-br br-ex

$ sudo ovs-vsctl add-port br-ex eth0


8-6. neutron DB sync 및 재실행


sudo neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade kilo


$ sudo service neutron-server restart

$ sudo service neutron-plugin-openvswitch-agent restart

$ sudo service neutron-metadata-agent restart

$ sudo service neutron-dhcp-agent restart

$ sudo service neutron-l3-agent restart



9. Horizon


9-1. horizon install


sudo apt-get install -y openstack-dashboard



10. 사용자 UI 접속 및 서비스 사용


horizon url : http://<public_ip>/horizon


user name : admin

password : admin



Trackbacks 0 : Comments 45

ONOS Controller와 OpenStack 연결

Software Defined Network/Research_SDN 2015.10.08 20:35

ONOS ml2 mechanism driver 연결


ONOS Controller도 여타 컨트롤러와 같이 OpenStack과 연동하는 메커니즘을 개발하고 있다.


Huawei에서 주도적으로 개발하는 이 서브시스템들은 동시에 netowrking-onos라는 프로젝트로 Neutron에도 개발되고 있다.


아직은 매우 불안정하고 미완성이다.


본 포스팅에서는 ONOS (origin/master, 1.4.0) 버전과 OpenStack Kilo 버전을 그 대상으로 한다.

(물론 ONOSFW에서 권고하는 사항은 OpenStack Liberty 버전이다.)


Reference는 다음과 같다.


http://forum.onosfw.com/t/how-to-integrate-onos-master-1-4-0-with-openstack-kilo/80

https://www.youtube.com/watch?v=qP8nPYhz_Mo



OpenStack과 ONOS 연동



1. networking-onos


1.1 install networking-onos


    • OpenStack Version : Kilo
    • Control Node
      • Python-pip install
$ sudo apt-get install python-pip


      • networking-onos install

$ sudo pip install networking_onos


      • 설치 확인
$ cd /usr/local/lib/python2.7/dist-packages/networking_onos




1.2 edit config neutron


    • Control Node
      • Copy to installed networking-onos directory and paste openstack neutron plugins drivers
      • edit entry_points.txt (neutron-2015.1.1-py2.7.egg-info)
[파일 확인 및 내용 복사]
$ sudo vi /usr/local/lib/python2.7/dist-packages/networking_onos-1.0.0.dist-info/entry_points.txt

[파일 수정]
$ sudo vi /usr/lib/python2.7/dist-packages/neutron-2015.1.1.egg-info/entry_points.txt

[파일 내용 추가]-----------------------------------------
...
[neutron.ml2.mechanism_drivers]
...
onos_ml2 = networking_onos.plugins.ml2.driver:ONOSMechanismDriver
...

[neutron.service_plugins]
...
onos_router = networking_onos.plugins.l3.driver:ONOSL3Plugin
...
      • edit ml2_conf.ini
        • /etc/neutron/plugins/ml2/ml2_conf.ini
          • edit mechanism_drivers
$ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini

[파일 내용 변경]--------------------------------------------
...
mechanism_drivers=onos_ml2
...
-----------------------------------------------------------

          • added onos section

[파일 확인 및 내용 복사]

sudo vi /usr/local/etc/neutron/plugins/ml2/conf_onos.ini


[파일 수정]

$ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini


[파일 내용 추가]--------------------------------------------
...
[onos]
url_path = http://<ONOS Controller IP>:8181/onos/vtn
username = karaf
password = karaf
-----------------------------------------------------------




1.3 Restart neutron-server


    • Control Node
neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head

$ sudo service neutron-server restart



2. ONOS Feature Install


2.1 start ONOS Controller


    • ONOS Version : origin/master (1.4.0)
    • ONOS Controller
      • ONOS Start
$ . ~/.bash_profile
$ cd onos
$ mvn clean install

$ onos-karaf clean

      • feature Install
onos> feature:install onos-ovsdatabase
onos> feature:install onos-app-vtn-onosfw


3. OpenStack OVS connect ONOS

3.1 OpenStack Network/Compute Nodes

    • Network/Compute Node
      • Check OVS
$ sudo ovs-vsctl show
      • Connection ONOS
$ sudo ovs-vsctl set-manager tcp:<ONOS IP>:6640


3.2 Check Tunnel


    • Network Node
      • Check OVS Tunnel

$ sudo ovs-vsctl show


7bd8744b-3d53-4d8f-ad3e-a51d3c78fe95

Manager "tcp:192.168.56.10:6640"

    is_connected: true

Bridge br-int

    Controller "tcp:192.168.56.10:6653"

        is_connected: true

    fail_mode: secure

    Port "vxlan-192.168.56.40"

        Interface "vxlan-192.168.56.40"

            type: vxlan

            options: {key=flow, local_ip="192.168.56.30", remote_ip="192.168.56.40"}

    Port br-int

        Interface br-int

            type: internal

ovs_version: "2.3.2"

    • Compute Node
      • Check OVS Tunnel
$ sudo ovs-vsctl show

21a339e2-a4cf-4ff0-97ed-7940bf8d07c7
Manager "tcp:192.168.56.10:6640"
    is_connected: true
Bridge br-int
    Controller "tcp:192.168.56.10:6653"
        is_connected: true
    fail_mode: secure
    Port br-int
        Interface br-int
            type: internal
    Port "vxlan-192.168.56.30"
        Interface "vxlan-192.168.56.30"
            type: vxlan
            options: {key=flow, local_ip="192.168.56.40", remote_ip="192.168.56.30"}
ovs_version: "2.3.2"


터널은 정상적으로 연결된 것으로 보인다.


단, openvswitch mechanism driver를 사용하는 경우 br-int/br-tun이 구분되었는데 br-int에 터널 포트를 생성하는 것을 확인하였다.



4. Tunnel Check Flows (OpenFlow)

4.1 Tunnel Flows

OVSDB를 사용하여 Tunnel 연결에 대한 제어를 하게되는데 openvswitch 플러그인이나 [OVS] 섹션이 없는 경우 br-tun 브릿지가 생성되지 않기 때문에 확인에 조금 어려움을 느낀다.
Network/Compute 노드의 br-int 브릿지를 활용하여 터널링을 지원하기 때문에 br-int의 Flow 정보를 살펴보아야 한다.

    • Network Node
$ sudo ovs-ofctl dump-flows -O openflow13 br-int
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x2d0000807a0678, duration=975.957s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:50
cookie=0x1000082b6aa90, duration=975.906s, table=0, n_packets=312, n_bytes=25272, send_flow_rem priority=40000,dl_type=0x88cc actions=CONTROLLER:65535
cookie=0x10000807b9861, duration=975.897s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=5,ip actions=CONTROLLER:65535
cookie=0x1000082b6b8da, duration=975.906s, table=0, n_packets=312, n_bytes=25272, send_flow_rem priority=40000,dl_type=0x8942 actions=CONTROLLER:65535
cookie=0x1000082c61296, duration=975.897s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=40000,arp actions=CONTROLLER:65535
cookie=0x10000807b991b, duration=975.908s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=5,arp actions=CONTROLLER:65535
cookie=0x2d0000807a06aa, duration=975.957s, table=50, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=drop
    • Compute Node
$ sudo ovs-ofctl dump-flows -O openflow13 br-int
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x2c0000d242d785, duration=22.933s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:50
 cookie=0x10000d47f7b9d, duration=22.933s, table=0, n_packets=7, n_bytes=567, send_flow_rem priority=40000,dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0x10000d244696e, duration=22.933s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=5,ip actions=CONTROLLER:65535
 cookie=0x10000d47f89e7, duration=22.932s, table=0, n_packets=7, n_bytes=567, send_flow_rem priority=40000,dl_type=0x8942 actions=CONTROLLER:65535
 cookie=0x10000d48ee3a3, duration=22.932s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=40000,arp actions=CONTROLLER:65535
 cookie=0x10000d2446a28, duration=22.932s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=5,arp actions=CONTROLLER:65535
 cookie=0x2d0000d242d7b7, duration=143.792s, table=50, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=drop



문제점


1) ovsdatabase 사용
  • 터널을 생성하게 되는데 OpenStack에서 기본 생성되는 브릿지인 br-int를 사용하여 터널을 생성함
  • 이 경우 터널 네트워크는 management network를 사용함
  • data network를 사용하지 않아서 그런지 몰라도 Flow가 active/pending 상태를 반복함

2) ovs-vsctl set-manager tcp:ONOS_IP:6640
  • 위 명령이 실행됨과 동시에 터널이 생성되고 Flow가 만들어짐
  • 문제는 OpenStack 각 노드에 생성이 되어야 하는데 OVS를 사용하는 모든 부분에 터널이 생성됨
  • 즉, 물리적인 OF SW를 OVS를 이용하였다면 ovs-vsctl set-controller bridgename tcp:ONOS_IP:6633을 하는 경우 터널 연결을 시도하게 됨
  • OpenStack의 network/compute 노드들 사이에 터널이 생성되어야 함








'Software Defined Network > Research_SDN' 카테고리의 다른 글

Yang Model as a Service  (2) 2016.08.02
openvSwitch에서 OpenFlow 룰을 확인하고 싶을때  (1) 2016.04.14
ONOS Controller와 OpenStack 연결  (0) 2015.10.08
Buffalo AP - OpenFlow SW 설정  (7) 2015.10.05
ONOS prolog  (0) 2015.07.20
Trackbacks 0 : Comments 0

OpenStack M 릴리즈 네이밍을 반대합니다.

OpenStack/Overview_OpenStack 2015.07.07 21:57

OpenStack M 릴리즈 네임을 반대합니다.


OpenStack은 디자인 서밋이 있는 국가의 도시/도로명을 따서 abc 순으로 네이밍합니다.


2015년 가을에 일본 동경에서 OpenStack 디자인 서밋이 개최되며 알파벳 순서상 'M'으로 시작되어야 합니다.


OpenStack에서는 이에 투표를 실시하였습니다.


그런데...



투표 결과는 다음과 같았습니다.



OpenStack의 'M' 릴리즈 명칭은 'Mita' 였습니다.


http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_4983776e190c8dbc




그런데...


이상한 일이 일어났습니다.



법적인 이유로 이름을 바꾸려고 합니다.



투표한 결과를 뒤로 하고 'Meiji'로 명칭을 수정하였습니다.


Mita 와 Minato는 법적인 문제가 있다는 이유로 말입니다.


https://wiki.openstack.org/wiki/Release_Naming




왜 그럴까요?


왜 바꾸는 것 일까요?



OpenStack은 비영리 단체입니다.



OpenStack은 OpenSource를 기반으로 구성된 비영리 단체입니다.


그 어떤 정치적/역사적 문제가 개입되면 안됩니다.


일본에서 Meiji는 왕조일지 몰라도 우리에게 그 이름은 침략자이고 약탈자 였습니다.


그 어떠한 행위로도 용서할 수 없는 이름이었습니다.


당장 'Meiji' 명칭을 교체하여 주기 바랍니다.

'OpenStack > Overview_OpenStack' 카테고리의 다른 글

OpenStack 'Mitaka'  (0) 2015.07.15
OpenStack M naming 철회  (0) 2015.07.09
OpenStack M 릴리즈 네이밍을 반대합니다.  (0) 2015.07.07
OpenStack DVR Overview  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack DVR - SlideShare

OpenStack/Research_OpenStack 2015.06.29 15:04




http://www.slideshare.net/uni2u/open-stack-dvr-deep-dive


'OpenStack > Research_OpenStack' 카테고리의 다른 글

OpenStack with networking-sfc (devstack)  (6) 2016.03.23
OpenStack REST 확인  (0) 2015.10.19
OpenStack DVR - SlideShare  (0) 2015.06.29
OpenStack DVR – DNAT Traffic  (0) 2015.06.29
OpenStack DVR – SNAT Traffic  (0) 2015.06.29
OpenStack DVR - East/West Traffic Flow  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack DVR – DNAT Traffic

OpenStack/Research_OpenStack 2015.06.29 14:57
OpenStack DVR DNAT Traffic Flow


이번 포스팅에서는 Neutron의 주요 서비스 중 DNAT 서비스에 대하여 알아보고자 한다.

DNAT 는 Destination NAT의 약자로서 우리나라 말로 억지로 번역하자면 ‘수신측 주소 변환’ 정도가 되겠다.

어려운 말은 둘째로 치고 쉽게 설명하자면…

OpenStack에서는 Floating IP를 생각하면 되겠다.

Floating IP는 이미 잘 알고 있는 것 처럼 VM에 Public Network을 사용할 수 있도록 IP를 부여하는 것이다.

VM이 외부와 네트워킹을 할때에 공용 IP를 각각 할당받아서 사용하는 방법이다.

즉, 여러 VM이 각각 하나씩 공용 IP를 할당받아 사용하는 것이 되겠다.

 

OpenStack Topology – DNAT (Floating IP)



OpenStack의 Horizon을 통하여 Public Network 및 Virtual Network을 생성하고 DVR을 만들어 통신한다.

OPENSTACK DVR – DNAT

또한 각 VM은 Floating IP를 할당 받는다.

OPENSTACK – DNAT FLOATING IP

 

DVR 생성



DVR은 Private Network(net01, net02)에 생성된 VM(vm01, vm02)들이 외부 네트워크에 대한 IP를 각각 부여받아 외부 네트워크를 사용하는 경우에 Traffic 처리를 담당하게 된다.

COMPUTE NODE – DNAT NAMESPACE
위 그림에서 Compute Node에 Router Namespace 및 FIP Namespce가 생성된 것을 확인할 수 있다.
  • Router Namespace: qrouter-2fa96ed7-795c-441c-80a8-23ad36af8501
  • FIP Namesapce: fip-62e976f8-2dc2-48af-950f-925d52b4e43b
여기에서 fip로 시작되는 것이 DNAT에 대한 Namespace, 즉 FloatingIP(FIP) Namespace이다.
Router Namespace인 qrouter-2fa96ed7-795c-441c-80a8-23ad36af8501의 인터페이스를 살펴보면 다음과 같다.

COMPUTE NODE – ROUTER NAMESPACE

상기 그림에서 확인할 수 있는것 처럼 rfp-2fa96ed7-7이라는 인터페이스가 생성된다.
  • rfp-2fa96ed7-7: 129.254.171.228 (Floating IP), 6e:57:de:10:ab:c1
해당 인터페이스는 Floating IP를 부여받은 인터페이스 이다.
FIP Namespace인 fip-62e976f8-2dc2-48af-950f-925d52b4e43b의 인터페이스를 살펴보면 다음과 같다.


COMPUTE NODE – FIP NAMESPACE
상기 그림처럼 FIP Namespace에는 fpr-2fa96ed7-7 및 fg-8ff046eb-25 인터페이스가 생성된다.
  • fpr-2fa96ed7-7
    • rfp-2fa96ed7-7과 veth pair
  • fg-8ff046eb-25
    • external device 인터페이스
Router Namespace에 적용된 Rule을 살펴보면 다음과 같다.
COMPUTE NODE – ROUTER NAMESPACE RULE
private IP에 대한 lookup 테이블이 설정되며 해당 테이블에는 rfp 인터페이스(Router Namespace)에 대한 Rule이 설정된다.
FIP Namespace에 적용된 Rule을 살펴보면 다음과 같다.
COMPUTE NODE – FIP NAMESPACE RULE
External Device로 부터 발생하는 패킷에 대한 Rule이 적용되어 있다.

 

DNAT (Floating IP) Traffic Flow



상기 토폴로지에서 DVR은 External Network(public) 과 Private Network(net01: 10.0.0.0/24, net02: 20.0.0.0/24)를 연결하고 있다.
Private Network에 연결된 각 VM(vm01, vm02)은 모두 Floating IP를 할당 받았다.
이렇게 Floating IP를 할당 받은 경우 각 VM에서 외부 네트워크와 통신을 하는데 DNAT를 사용한다.

DNAT TRAFFIC
위 그림에서 파란색으로 표기된 Flow가 바로 DNAT Flow 이다.
이미 East/West 및 SNAT Flow에서 확인한 것 처럼 Flow 는 대략 예상할 수 있을 것이다.
예를 들어 vm02가 외부 네트워크와 통신을 시도하는 경우 다음과 같은 순서를 따르게 된다.
vm02에서 Google.com 으로 통신을 시도하는 경우 vm02는 이미 Floating IP를 가지고 있기 때문에 Router Namespace에서 해당하는 Rule을 매칭한다.
  • qrouter-2fa96ed7-795c-441c-80a8-23ad36af8501의 rfp-2fa96ed7-7 인터페이스
  • private IP에 대한 lookup 테이블: default via <IP> dev rfp-2fa96ed7-7
FIP Namespace는 Router Namespace의 rfp-xxx 인터페이스와 veth pair를 이루는 fpr-xxx 인터페이스가 있으므로 이에 대한 Rule을 확인한다.
  • 62e976f8-2dc2-48af-950f-925d52b4e43b의 fpr-2fa96ed7-7 인터페이스
이때 패킷의 src MAC은 rfp-2fa96ed7-7의 MAC으로 dest MAC은 fpr-2fa96ed7-7의 MAC으로 src IP는 vm02의 floating IP로 변환된다. (DNAT)
FIP Namespace는 External Device에 대한 인터페이스인  fg-8ff046eb-25를 통하여 외부 네트워크와 통신을 완성한다.
이때 src MAC은 fg-8ff046eb-25의 MAC으로 dest MAC은 default GW MAC으로 변환된다.


'OpenStack > Research_OpenStack' 카테고리의 다른 글

OpenStack with networking-sfc (devstack)  (6) 2016.03.23
OpenStack REST 확인  (0) 2015.10.19
OpenStack DVR - SlideShare  (0) 2015.06.29
OpenStack DVR – DNAT Traffic  (0) 2015.06.29
OpenStack DVR – SNAT Traffic  (0) 2015.06.29
OpenStack DVR - East/West Traffic Flow  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack DVR – SNAT Traffic

OpenStack/Research_OpenStack 2015.06.29 14:49
OpenStack DVR SNAT Traffic Flow


이번 포스팅에서는 Neutron의 주요 서비스 중 SNAT 서비스에 대하여 알아보고자 한다.

SNAT 는 Source NAT의 약자로서 우리나라 말로 억지로 번역하자면 ‘송신측 주소 변환’ 정도가 되겠다.

어려운 말은 둘째로 치고 쉽게 설명하자면…

SNAT와 반대되는 개념이 DNAT라고 하는 것인데 OpenStack에서는 Floating IP를 생각하면 되겠다.

Floating IP는 이미 잘 알고 있는 것 처럼 VM에 Public Network을 사용할 수 있도록 IP를 부여하는 것인데…

OpenStack에서는 이런 방법 말고도 다른 방법으로 VM이 외부 네트워크를 사용할 수 있다.

어떤 방법이냐고 하면…

VM이 외부와 네트워킹을 할때에 공용 IP 하나를 사용하는 방법이다.

즉, 여러 VM이 공용 IP 하나를 공유하여 사용하는 것이 되겠다.

이와 같이 공용 IP를 만들어 VM들이 공유하는 방법으로 외부와 네트워킹을 하는 것을 SNAT라고 한다.

# SNAT를 사용하면 VM은 외부로 접근이 가능하지만 외부에서 VM으로의 접근은 할 수 없다.

# SNAT는 OpenStack의 Network Node를 사용한다.


OpenStack Topology – SNAT



OpenStack의 Horizon을 통하여 Public Network 및 Virtual Network을 생성하고 DVR을 만들어 통신한다.

OpenStack DVR - SNAT Topology

External Network(public) 및 Private Network(net01, net02)를 생성한 뒤 External Network와 Private Network 사이에 DVR을 생성하면 Interface가 2개씩 생성된다.
왜 2개의 인터페이스가 생성될까?
이유는 하나는 Router Namespace에 대한 인터페이스이고 하나는 SNAT를 위한 인터페이스이다.
즉, External Network와 연결된 Private Network 사이의 DVR은 SNAT 만을 위한 인터페이스를 생성하며 이를 통하여 Private Network에 위치하는 VM이 External Network를 사용할 수 있다.

L3_agent.ini

# SNAT에 대한 설정은 Network Node의 l3_agent.ini에서 agent_mode=dvr_snat 로 설정한다.

 

DVR 생성



DVR은 Private Network(net01, net02)에 생성된 VM(vm01, vm02)들이 외부 네트워크를 사용하는 경우에 Traffic 처리를 담당하게 된다.

VM 사이의 트래픽 처리는 앞서 East/West Traffic에서 설명하였다.

NETWORK NODE – SNAT/ROUTER NAMESPACE

위 그림에서 네트워크 노드에 생성된 인터페이스를 확인하면 SNAT 및 Router Namespace가 생성된 것을 확인할 수 있다.
  • SNAT Namespace: snat-cc857096-450e-4c57-9ed1-38a90fb6a85e
  • Router Namespace: qrouter-cc857096-450e-4c57-9ed1-38a90fb6a85e
생성된 SNAT Namespace의 인터페이스 목록을 살펴보면 각 VM들에서 발생한 SNAT Traffic에 대한 인터페이스(sg-xxx, sg-yyy) 및 External Network Device에 대한 인터페이스(qg-xxxx)를 확인할 수 있다.
  • SNAT Interface: 토폴로지에서 확인한 2개의 인터페이스 중 SNAT를 위한 인터페이스
    • sg-748e9c85-fb: net01 네트워크를 사용하는 VM에 대한 SNAT 인터페이스(10.0.0.2/24, fa:16:3e:bd:29:ef)
    • sg-a79f8f6f-15: net02 네트워크를 사용하는 VM에 대한 SNAT 인터페이스(20.0.0.2/24, fa:16:3e:d5:54:d4)
    • qg-80252773-66: sg-xxx 인터페이스와 연결된 External Device 인터페이스로서 sg-xxx 로 부터 수신한 트래픽을 해당 인터페이스로 전달
VM이 위치하는 컴퓨트 노드의 Router Namespace를 살펴보면 다음과 같다.

COMPUTE NODE – ROUTER NAMESPACE

위 그림에서 확인할 수 있는 것 처럼 Compute Node의 Router Namespace에는 SNAT 및 East/West Traffic에 대한 Rule이 이미 설정되어 있음을 알 수 있다.
  • Router Namespace: qrouter-cc857096-450e-4c57-9ed1-38a90fb6a85e
    • Network Node의 Router Namespace와 동일
  • Rule
    • default via 10.0.0.2 dev qr-36ca57b4-23
    • default via 20.0.0.2 dev qr-9d513ed6-af
# 이를 통하여 동일한 Rule이 Network 및 Compute의 Router Namespace에 생성됨을 알 수 있다.

NETWORK NODE – ROUTER NAMESPACE

 

SNAT Traffic Flow



상기 토폴로지에서 DVR은 External Network(public) 과 Private Network(net01: 10.0.0.0/24, net02: 20.0.0.0/24)를 연결하고 있다.

이러한 경우 각 Private Network에 생성된 VM(vm01: 10.0.0.3, vm02: 20.0.0.3)들은 SNAT을 통하여 External Network와 통신할 수 있다.
SNAT을 위한 SNAT Namespace는 Network Node에 생성되며 Network Node의 br-ex 브릿지에 부여한 External IP를 VM들이 공유할 수 있도록 Source NAT 서비스를 제공한다.
즉, Private Network에 연결된 VM이 External IP 없이 External Network와 통신하기 위해서는 반드시 네트워크 노드를 사용하여야 하며 네트워크 노드에 부여된 External IP를 공유하여야 한다. (SNAT Traffic)

SNAT Traffic

위 그림으로 설명하자면…
vm02(20.0.0.3)가 External IP 없이 외부 네트워크와 통신을 하고자 한다.
vm02에서 ping google.com 을 하였을 경우를 가정해보자.
최초 vm02에서 발생한 패킷은 Compute Node의 Router Namespace에 도달하여 매칭 정보를 확인하게 된다.
Router Namespace에는 상기 토폴로지에서 확인할 수 있는 2개의 포트에 대한 Rule 정의가 되어 있다.
  • East/West 에 대한 Rule
  • SNAT에 대한 Rule
목적지인 google.com에 대한 Rule은 East/West Rule에서 찾을 수 없기 때문에 SNAT Rule과 매칭된다.
즉, Network Node의 SNAT Namespace로 연결하는 Rule이 매칭된다.
이때 SNAT 인터페이스에 대한 기본 경로가 src MAC(qr-9d513ed6-af의 MAC), dest MAC(sg-a79f8f6f-15의 MAC)에 설정된다.
이후 Compute Node 와 Network Node 사이의 Overlay Network 구간에서 src MAC은 Compute Node의 MAC으로 변환이 되어 VxLAN 또는 GRE 형식으로 이동한다.
Network Node에서 해당 패킷을 받으면 Overlay 구간의 src MAC을 제거하고 dest MAC(sg-a79f8f6f-15의 MAC)을 확인한 뒤 SNAT Namespace와 매핑한다.
SNAT Namespace에서는 External Network Device인 qg-80252773-66 인터페이스가 존재하기 때문에 src MAC은 qg-80252773-66의 MAC으로 dest MAC은 defaule GW MAC으로 src IP는 qg-80252773-66의 IP로 Source NAT 를 시행하고 통신한다.
이때 SNAT(Source NAT) 서비스가 실행되어 External Network와 통신하게 된다.


'OpenStack > Research_OpenStack' 카테고리의 다른 글

OpenStack with networking-sfc (devstack)  (6) 2016.03.23
OpenStack REST 확인  (0) 2015.10.19
OpenStack DVR - SlideShare  (0) 2015.06.29
OpenStack DVR – DNAT Traffic  (0) 2015.06.29
OpenStack DVR – SNAT Traffic  (0) 2015.06.29
OpenStack DVR - East/West Traffic Flow  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack DVR Overview

OpenStack/Overview_OpenStack 2015.06.19 17:15

What is OpenStack DVR?

DVR... 무슨 의미니?


OpenStack의 10번째 버전인 JUNO 가 Release된 지도 꽤 시간이 흘렀다.


얼마전 Kilo가 Release 되었는데 OpenStack의 Release 속도를 보면 기겁할 정도다.


OpenStack Juno 버전에서 소개된 DVR에 대해서 알아보고자 한다.



DVR (Distributed Virtual Router)



네트워크 노드에 집중되었던 가상 라우터를 가상 머신이 생성되는 컴퓨트 노드에 분산배치하여 네트워크 노드로의 트래픽 집중을 해결하고 네트워크 노드에 장애가 발생하는 경우 VM 간 또는 외부 통신을 일정부분 보완하는 내용이다.

요컨데, 네트워크 노드의 단일 장애점(SPOF: Single Point Of Failure) 및 트래픽 집중 문제를 해결하기 위한 기술이다.



DVR 관련 설치 및 설정


각 컴퓨트 노드에 가상 라우터가 분산배치 되어야 하기 때문에 네트워크 노드 및 컴퓨트 노드에 L3 Agent가 설치된다.

Juno 버전을 다운로드 받으면 자연스럽게 설치되는 내용이다.

DVR을 활성화 하기 위하여 설정을 하여야 하는데 크게 3부분으로 나뉜다.


  • L3 Plugin
    • Neutron의 기본 설정 파일
    • neutron.conf 에서 router_distributed 설정 값을 True
  • L3 Agent
    • l3_agent.ini 에서
    • 네트워크 노드인 경우: agent_mode 설정 값을 dvr_snat 으로 설정
    • 컴퓨트 노드인 경우: agent_mode 설정 값을 dvr로 설정
    • router_delete_namespace 설정 값을 True로 설정
  • L2 Agent
    • ml2_conf.ini 에서
    • enable_distributed_routing 설정 값을 True로 설정
    • l2_population 설정 값을 True로 설정
    • 테넌트 네트워크 유형을 VxLAN 또는 NVGRE로 설정



Namespace


DVR 환경은 Linux Namespace를 활용한다.

네트워크 및 컴퓨트 노드에 각각 설치된 L3 Agent에 의해 다양한 Namespace가 생성된다.


<OpenStack DVR Overview - Namespace>


임의의 테넌트에 대해 하나의 가상 라우터가 생성되는 경우 모든 네트워크 및 가상 머신이 생성되는 컴퓨트 노드에 가상 라우터에 대한 Router Namespace 가 생성된다.

아래 그림에서

  • Router Namespace: qrouter-3d14a2af-cf37-46d5-88a8-926aee62efea
  • 가상 인터페이스: qr-xxx


<OpenStack DVR Overview - Router Namespace>


이 Router Namespace 내부에 서브넷 간 라우팅을 위한 라우팅 테이블이 설정된다.


<OpenStack DVR Overview - ARP Table>


가상 네트워크에 VM이 생성되면 VM이 속한 컴퓨트 노드 및 네트워크 노드에 동일한 Router Namespace가 생성된다.

이러한 경우 동일한 테넌트의 서로 다른 서브넷 간의 연결은 네트워크 노드의 Router Namespace를 경유하지 않고 컴퓨트 노드의 Router Namespace를 통해 컴퓨트 노드 간 직접 통신을 한다. (east-west Routing)

DVR 환경에서는 하나의 가상 라우터에 대하여 SNAT Namespace가 네트워크 노드에 추가된다.

아래 그림에서

  • SNAT Namespace: snat-cc857096-450e-4c57-9ed1-38a90fb6a85e
  • 가상 인터페이스: sg-xxx (snat interface) / qg-xxx (External Device)


<OpenStack DVR Overview - SNAT Namespace>


SNAT Namespace는 VM이 공인 IP(즉, Floating IP)를 가지지 않는 경우 외부에 접속을 하기 위하여 소스 네트워크 주소 변환(SNAT: Source NAT)을 진행하며 이를 위한 네트워크 주소 변환 규칙이 정의되어 있다.

 DVR 환경에서 VM이 Floating IP를 갖는 경우 VM이 생성된 컴퓨트 노드에 목적지 주소 변환(DNAT: Destination NAT)을 위한 FIP Namespace가 생성된다.

아래 그림에서

  • FIP Namespace: fip-62e976f8-2dc2-48af-950f-925d52b4e43b
  • DVR_fip-namespace.png


FIP(Floating IP) Namespace는 컴퓨트 노드에 VM이 Floating IP를 갖는 경우 생성되는데 가상 포트를 통하여 Router Namespace와 연결된다.

즉, VM에 할당된 Floating IP에 대한 모든 트래픽을 Router Namespace로 전달하는 테이블을 가지고 있다.

Floating IP에 해당하는 DNAT 기능은 FIP Namespace가 아닌 Router Namespace에서 담당한다.

특징적으로 DVR 환경에서 생성한 가상 라우터는 하나의 서브넷에 대하여 2개의 포트가 생성된다.


<OpenStack DVR Overview - Topology>


하나는 서브넷의 게이트웨이 포트인 qr-xxx 로서 Router Namespace에서의 라우팅을 위한 포트하고 다른 하나는 sg-xxx 로서 SNAT Namespace에서 할당하는 포트이다.



앞으로 설명


앞으로 DVR 환경에서의 동작 방식을 다음과 같은 순서로 포스팅 할 것이다.




'OpenStack > Overview_OpenStack' 카테고리의 다른 글

OpenStack 'Mitaka'  (0) 2015.07.15
OpenStack M naming 철회  (0) 2015.07.09
OpenStack M 릴리즈 네이밍을 반대합니다.  (0) 2015.07.07
OpenStack DVR Overview  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack DVR - East/West Traffic Flow

OpenStack/Research_OpenStack 2015.06.19 16:30

OpenStack DVR - East/West Traffic


OpenStack의 Neutron은 VM간의 통신을 위한 서비스를 제공한다.


이번 포스팅에서는 VM간의 통신 중 East/West Traffic을 살펴보고자 한다.


East/West Traffic은 데이터 센터에서 같은 Tenant에 속하는 2개 이상의 Segment (즉, 서로다른 서브넷 네트워크)에 존재하는 VM 사이의 통신에서 발생한다.


좀 더 쉽게 이야기 하자면


OpenStack을 통하여 서로다른 서브넷 네트워크를 2개 이상 생성하고 각 서브넷마다 VM이 동작한다고 할 경우 DVR은 서로 다른 서브넷 네트워크를 연결하는 역할을 담당한다.


이 경우에 DVR로 연결된 서로 다른 서브넷 네트워크에 존재하는 VM 사이에 Traffic은 모두 DVR에서 관리한다. (East/West Traffic)



OpenStack Topology - East/West case



OpenStack의 Horizon을 통하여 서로 다른 서브넷을 생성하고 각 서브넷 마다 VM을 할당한 뒤 DVR을 만들어 통신한다.


<OpenStack DVR - East/West Traffic Topology>


이때 생성되는 Router는 모두 DVR 이다. (Neutron.conf 등에 이미 설정하였다.)



DVR 생성


DVR은 VM이 생성되는 Compute Node에 생성되어 Traffic 처리를 담당하게 된다.


<OpenStack DVR - Compute Node 1>


<OpenStack DVR - Compute Node 2>


상기 그림과 같이 VM이 생성된 Compute Node(node01/node02)의 DVR을 확인하면 모두 동일함을 확인할 수 있다.

즉, OpenStack에서 Router를 생성하면 DVR이 생성되는 Compute Node에서는 Router Namespace를 활용하여 interface를 생성한다. (해당 interface에 대한 MAC/IP등의 정보를 서로 공유하여 동일하게 생성)


<OpenStack DVR Namespace - Compute Node 1>


<OpenStack DVR Namespace - Compute Node 2>


상기 그림에서 qrouter-3d14a2af-cf37-46d5-88a8-926aee62efea는 node01/node02에 동일하게 생성되었으며 인터페이스에 설정된 IP/MAC 등도 동일하다. (qr-xxxx 확인)

또한 이렇게 생성된 DVR Namespace는 서브넷 간의 통신을 위한 Table이 설정되어 있다.


<OpenStack DVR ARP Table - Compute Node 1>

Compute Node 01의 Table은

  • DHCP: 100.0.0.3
  • Compute Node 01에 생성된 VM: 100.0.0.2 / 100.0.20.2
  • Compute Node 02에 생성된 VM: 100.0.10.2


<OpenStack DVR ARP Table - Compute Node 2>

Compute Node 02의 Table은

  • DHCP: 100.0.10.3 / 100.0.0.3
  • Compute Node 01에 생성된 VM: 100.0.0.2 / 100.0.20.2
  • Compute Node 02에 생성된 VM: 100.0.10.2


결과적으로 DVR이 생성된다는 것은 관련된 노드에 Namespace를 생성하고 Table이 구성된다는 것으로 생각할 수 있다.



East/West Traffic Flow



상기 Topology에서 vm03(100.0.20.2)은 Compute Node 02(node02)에 vm01(100.0.0.2), vm02(100.0.10.2)는 Compute Node 01(node01)에 생성되어 있다.

또한 DVR은 서로 다른 서브넷인 net01, net02, net03 을 걸쳐서 생성되어 있다.

이 경우 vm03에서 다른 VM(vm01, vm02)로 발생하는 Traffic은 DVR을 통하여 전달된다. (East/West Traffic)


<OpenStack DVR - East/West Traffic Flow>


위 그림으로 설명을 하자면...

vm03에서 vm02로 발생하는 Traffic은 vm03이 생성된 Compute Node의 Router Namespace(qrouter-3d14a2af-cf37-46d5-88a8-926aee62efea)에 도달하게 된다.

vm03이 존재하는 Compute Node의 Router에서는 도착한 패킷에 대하여 Table에 매칭되는 것이 있는지 확인하게 되는데 해당 Table에는 모든 VM들에 대한 Table이 이미 구성되어 있기 때문에 매칭 룰을 확인하게 된다.

즉, src (vm03) 및 dest (vm02)에 대한 매칭 rule이 존재하기 때문에 이를 참조한다. (qr-61134c0d-4d, fa:16:3e:12:37:77)

매칭 룰에 의하여 vm02의 Router Namespace의 interface에 대한 MAC이 설정된다. (qr-61134c0d-4d에 대한 vm02 Router Namespace의 MAC은 fa:16:3e:cb:59:c9, Compute Node 02 - DVR Namespace 참조)

매칭 룰에 의해 src의 MAC이 변경되면 그 이후 Overlay Network(VXLAN/GRE) 구간을 거치게 되는데 이 때의 src MAC은 Compute Node 02의 MAC 이다.

해당 패킷이 vm02가 존재하는 Compute Node 01에 도달하면 Overlay 구간의 src MAC을 벗겨내고 vm02와의 통신이 완료된다.

'OpenStack > Research_OpenStack' 카테고리의 다른 글

OpenStack with networking-sfc (devstack)  (6) 2016.03.23
OpenStack REST 확인  (0) 2015.10.19
OpenStack DVR - SlideShare  (0) 2015.06.29
OpenStack DVR – DNAT Traffic  (0) 2015.06.29
OpenStack DVR – SNAT Traffic  (0) 2015.06.29
OpenStack DVR - East/West Traffic Flow  (0) 2015.06.19
tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0

OpenStack Juno Install using DevStack

OpenStack/Install_OpenStack 2015.06.19 15:17

OpenStack Juno 버전 설치 - DevStack DVR 설정


이번 포스팅에서는 VirtualBox 기반으로 DevStack을 활용하려고 한다.



VirtualBox



VirtualBox를 통하여 3개의 VM을 생성한다.

VM은 각각 All-in-one Node, Network Node, Compute Node로 설치될 것이다.

VirtualBox VM 생성에 사용할 이미지는 ubuntu 14.04 Server 버전을 사용하였다.

네트워크는 호스트 전용 2개를 만들었으며 하나는 Management 다른 하나는 Tunnel 전용 포트로 사용할 것이다.



All-in-one Node

Controller Node 및 Compute Node가 하나의 VM에서 동작한다.

NIC는 다음과 같이 설정하였다.

  • eth0: 인터넷과 연결되는 IP로 NAT 설정
  • eth1: Management 포트, 호스트 전용
  • eth2: Tunnel 포트, 호스트 전용


Compute Node

NIC는 다음과 같이 설정하였다.


  • eth0: 인터넷과 연결되는 IP로 NAT 설정
  • eth1: Management 포트, 호스트 전용
  • eth2: Tunnel 포트, 호스트 전용


Network Node


NIC는 다음과 같이 설정하였다.


  • eth0: 인터넷과 연결되는 IP로 NAT 설정
  • eth1: Management 포트, 호스트 전용
  • eth2: Tunnel 포트, 호스트 전용



DevStack



모든 노드는 다음과 같이 업데이트 및 업그레이드를 시행하고 필요한 프로그램을 설치한다.



sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade

sudo apt-get install -y git vim


모든 노드에 DevStack Juno 버전을 설치한다.


git clone -b stable/juno https://github.com/openstack-dev/devstack.git



All-in-one Node


cd devstack

vim local.conf


[[local|localrc]]

DEST=/opt/openstack

DATA_DIR=$DEST/data

LOGFILE=$DATA_DIR/logs/stack.log

SCREEN_LOGDIR=$DATA_DIR/logs

VERBOSE=False


MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_TOKEN=openstack

SERVICE_PASSWORD=openstack

ADMIN_PASSWORD=openstack


disable_service n-net

enable_service neutron

enable_service q-svc

enable_service q-meta

enable_service q-agt

enable_service q-dhcp

enable_service q-l3


# TODO: Set this host's IP

HOST_IP=<All-in-one Node Management IP>


[[post-config|$NEUTRON_CONF]]

[DEFAULT]

router_distributed=True


[[post-config|/$Q_PLUGIN_CONF_FILE]]

[ml2]

type_drivers=flat,vlan,vxlan

tenant_network_types=vxlan

mechanism_drivers=openvswitch,l2population


[ml2_type_vxlan]

vni_ranges=1000:1999


[ovs]

local_ip=$HOST_IP


[agent]

tunnel_types=vxlan

l2_population=True

enable_distributed_routing=True


[[post-config|$Q_L3_CONF_FILE]]

[DEFAULT]

agent_mode=dvr

router_delete_namespaces=True


[[post-config|$Q_DHCP_CONF_FILE]]

[DEFAULT]

dhcp_delete_namespaces=True


./stack.ch 



Compute Node


cd devstack

vim local.conf


[[local|localrc]]

DEST=/opt/openstack

DATA_DIR=$DEST/data

LOGFILE=$DATA_DIR/logs/stack.log

SCREEN_LOGDIR=$DATA_DIR/logs

VERBOSE=False


MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_TOKEN=openstack

SERVICE_PASSWORD=openstack

ADMIN_PASSWORD=openstack


ENABLED_SERVICES=n-cpu,neutron,n-novnc,q-agt,q-l3,q-meta


# TODO: Set this host's IP

HOST_IP=<Compute Node Management IP>


# TODO: Set the controller's IP

SERVICE_HOST=<All-in-one Node Management IP>

MYSQL_HOST=$SERVICE_HOST

RABBIT_HOST=$SERVICE_HOST

Q_HOST=$SERVICE_HOST

GLANCE_HOSTPORT=$SERVICE_HOST:9292


VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

VNCSERVER_LISTEN=0.0.0.0


[[post-config|/$Q_PLUGIN_CONF_FILE]]

[ovs]

local_ip=$HOST_IP


[agent]

tunnel_types=vxlan

l2_population=True

enable_distributed_routing=True


[[post-config|$Q_L3_CONF_FILE]]

[DEFAULT]

agent_mode=dvr

router_delete_namespaces=True


./stack.ch 



Network Node


cd devstack

vim local.conf


[[local|localrc]]

DEST=/opt/openstack

DATA_DIR=$DEST/data

LOGFILE=$DATA_DIR/logs/stack.log

SCREEN_LOGDIR=$DATA_DIR/logs

VERBOSE=False


MYSQL_PASSWORD=openstack

RABBIT_PASSWORD=openstack

SERVICE_TOKEN=openstack

SERVICE_PASSWORD=openstack

ADMIN_PASSWORD=openstack


ENABLED_SERVICES=neutron,q-agt,q-l3,q-meta


# TODO: Set this host's IP

HOST_IP=<Network Node Management IP>


# TODO: Set the controller's IP

SERVICE_HOST=<All-in-one Node Management IP>

MYSQL_HOST=$SERVICE_HOST

RABBIT_HOST=$SERVICE_HOST

GLANCE_HOSTPORT=$SERVICE_HOST:9292


[[post-config|/$Q_PLUGIN_CONF_FILE]]

[ovs]

local_ip=$HOST_IP


[agent]

tunnel_types=vxlan

l2_population=True

enable_distributed_routing=True


[[post-config|$Q_L3_CONF_FILE]]

[DEFAULT]

agent_mode=dvr_snat

router_delete_namespaces=True 


./stack.ch 


tags : DVR, Juno, OpenStack
Trackbacks 0 : Comments 0