본문 바로가기

Cloud Native/Install_OpenStack

OpenStack Kilo Install - Network Service

OpenStack Neutron Install

드디어 Network Service를 설치할 순간이 왔다.


OpenStack에서 제공하는 네트워크 서비스는 2가지 타입이 있다.


nova network / neutron


본 포스팅에서는 neutron을 다루고자 한다.


OpenStack 사용자는 Neutron 서비스를 통하여 가상 네트워크를 구성한다.


간단하게는 가상네트워크(서브넷 범위 포함)를 생성하고 서브넷이 다른 가상 네트워크 끼리 가상 라우터를 사용하여 연동하는 네트워킹 서비스이다.


Neutron은 대표적으로 OpenvSwitch(이하, OVS)를 활용하여 가상의 네트워크를 구성한다.


Neutron의 동작 메커니즘을 파악하기 위해서는 OVS 관련 지식이 필요하다.


Neutron 메커니즘은 강효성 군의 블로그를 살펴보면 된다.

(아마도 이보다 더 잘 만들 수는 없을 것 이다. http://blog.naver.com/love_tolty/220237750951)


주의할 점은 OpenStack Network은 OpenStack을 구성하고 있는 Control/Network/Compute Node 모두 Neutron 이 설치되고 설정되어야 한다.


또한 실제 Network Service가 실행되는 Network/Compute Node 사이에는 Full mesh로 터널이 구성되기 때문에 Data Network을 위한 별도의 Network을 구성하여야 한다.


우리는 이미 eth2를 통하여 별도의 Data Network을 구성하였다.



OpenStack Neutron Install



1. Control Node


1-1. Neutron DataBase 사용자 등록 및 테이블 생성

    • DB 사용자 등록 (neutron)
$ mysql -u root -p
    • Neutron DB 생성
MariaDB [(none)]> CREATE DATABASE neutron;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';
MariaDB [(none)]> exit

1-2. Neutron 관련 OpenStack CLI 사용을 위한 admin 계정 활성화

$ source admin-openrc.sh

1-3. Keystone Neutron 서비스 등록

    • Neutron 사용자 등록
      • 여기서 설정한 Password는 neutron.conf 등의 파일에 사용함 (기억할 것)
$ openstack user create --password-prompt neutron

[결과]
User Password:
Repeat User Password:
+-----------+------------------------------------------+
| Field        | Value                                         |
+-----------+------------------------------------------+
| email       | None                                          |
| enabled    | True                                           |
| id            | 4ff9b670a6c444b2bb432545206f1322 |
| name       | neutron                                       |
| username | neutron                                        |
+-----------+------------------------------------------+
    • admin 및 nova 사용자의 nova 관련 제어를 위한 role 생성
$ openstack role add --project service --user neutron admin

[결과]
+-------+-------------------------------------------+
| Field   | Value                                           |
+-------+-------------------------------------------+
| id       | 9c6551f223cc492392c51c2e454756e4 |
| name  | admin                                          |
+-------+-------------------------------------------+
    • neutron 서비스 entry 생성
$ openstack service create --name neutron --description "OpenStack Networking" network

[결과]
+-------------+------------------------------------------+
| Field          | Value                                          |
+-------------+------------------------------------------+
| description | OpenStack Networking                    |
| enabled     | True                                            |
| id             | 1e6b43342a7e4cdeaf3112a2fb805014 |
| name        | neutron                                       |
| type          | network                                       |
+-------------+------------------------------------------+
    • neutron 서비스 end point 등록
$ openstack endpoint create --publicurl http://controlnode01:9696 --adminurl http://controlnode01:9696 --internalurl http://controlnode01:9696 --region RegionOne network

[결과]
+--------------+--------------------------------------------+
| Field            | Value                                           |
+--------------+--------------------------------------------+
| adminurl       | http://controlnode01:9696                |
| id                | 8d8b6c08f195433590bb7010667c8421 |
| internalurl     | http://controlnode01:9696                |
| publicurl       | http://controlnode01:9696                |
| region          | RegionOne                                    |
| service_id      | 1e6b43342a7e4cdeaf3112a2fb805014 |
| service_name | neutron                                        |
| service_type  | network                                        |
+--------------+--------------------------------------------+


1-4. Neutron 패키지 인스톨 및 설정

    • Neutron 패키지 인스톨
$ sudo apt-get install neutron-server neutron-plugin-ml2 python-neutronclient
    • Neutron 환경 설정
      • /etc/neutron/neutron.conf
$ sudo vi /etc/neutron/neutron.conf

[파일 내용 추가 및 수정]----------------------------------------------------------------

[DEFAULT]
...
verbose = True
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
...
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controlnode01:8774/v2

[oslo_messaging_rabbit]
...
rabbit_host = controlnode01
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

[database]
...
connection = mysql://neutron:NEUTRON_DBPASS@controlnode01/neutron

[keystone_authtoken]
...
auth_uri = http://controlnode01:5000
auth_url = http://controlnode01:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = <Neutron 사용자 등록시 설정한 Pass>

[nova]
...
auth_url = http://controlnode01:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = <Nova 사용자 등록시 설정한 Pass>
--------------------------------------------------------------------------------------------
      • /etc/neutron/plugins/ml2/ml2_conf.ini
        • mechanism_driver 관련하여 SDN Controller와 연동하는 경우 해당하는 이름을 설정하고 이에 따른 다른 설정도 완성한다.
        • SDN Controller와 연동되는 부분은 따로 포스팅 할 예정이다.
$ 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
----------------------------------------------------------------------------------------------


1-5. neutron 서비스를 위한 Nova 설정

    • Nova 설정
      • /etc/nova/nova.conf
$ sudo vi /etc/nova/nova.conf

[파일 내용 추가]--------------------------------------------------------------------

[DEFAULT]
...
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

[neutron]
...
url = http://controlnode01:9696
auth_strategy = keystone
admin_auth_url = http://controlnode01:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = <Neutron 사용자 등록시 설정한 Pass>
...
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET
------------------------------------------------------------------------------------------------
    • 변경사항 DB 적용
$ sudo su
$ su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron


1-6. neutron 서비스 재실행

    • neutron 서비스 재실행
$ sudo service nova-api restart
$ sudo service neutron-server restart


1-7. neutron 서비스 확인

    • neutron 서비스 동작확인
      • admin 사용자 계정 활성화
$ source admin-openrc.sh
    • neutron server 동작 확인
$ neutron ext-list

[결과]
+-------------------------+-------------------------------------------------------+
| alias                        | name                                                          |
+-------------------------+-------------------------------------------------------+
| security-group           | security-group                                              |
| l3_agent_scheduler      | L3 Agent Scheduler                                       |
| net-mtu                    | Network MTU                                              |
| ext-gw-mode             | Neutron L3 Configurable external gateway mode |
| binding                     | Port Binding                                                |
| provider                    | Provider Network                                          |
| agent                       | agent                                                         |
| quotas                      | Quota management support                           |
| subnet_allocation        | Subnet Allocation                                         |
| dhcp_agent_scheduler  | DHCP Agent Scheduler                                  |
| l3-ha                        | HA Router extension                                     |
| multi-provider            | Multi Provider Network                                  |
| external-net               | Neutron external network                               |
| router                       | Neutron L3 Router                                       |
| allowed-address-pairs  | Allowed Address Pairs                                   |
| extraroute                 | Neutron Extra Route                                     |
| extra_dhcp_opt           | Neutron Extra DHCP opts                               |
| dvr                           | Distributed Virtual Router                              |
+-------------------------+-------------------------------------------------------+


2. Network Node


2-1. Network Node 기본 설정

    • 커널 네트워킹 설정
$ sudo vi /etc/sysctl.conf

[파일 내용 수정]-----------------------------------------

net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
-----------------------------------------------------------
    • 변경 사항 적용
$ sudo sysctl -p


2-2. Neutron 패키지 인스톨 및 설정

    • Neutron 패키지 인스톨
$ sudo apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent
    • Neutron 환경 설정
      • /etc/neutron/neutron.conf
        • Database 섹션은 모두 comment 처리 함
$ sudo vi /etc/neutron/neutron.conf

[파일 내용 추가 및 수정]--------------------------------------------

[DEFAULT]
...
verbose = True
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

[oslo_messaging_rabbit]
...
rabbit_host = controlnode01
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

[keystone_authtoken]
...
auth_uri = http://controlnode01:5000
auth_url = http://controlnode01:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = <Neutron 사용자 등록시 설정한 Pass>
-----------------------------------------------------------------------
    • ml2 환경 설정
      • /etc/neutron/plugins/ml2/ml2_conf.ini
$ 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 = 10.0.1.21
tunnel_type = vxlan
tunnel_bridge = br-tun
integration_bridge = br-int
tunnel_id_ranges=1001:2000
tenant_network_type = vxlan
enable_tunneling = True

[agent]
...
tunnel_types = vxlan
vxlan_udp_port = 4789
------------------------------------------------------------------
    • L3 환경 설정
      • /etc/neutron/l3_agent.ini
$ sudo vi /etc/neutron/l3_agent.ini

[파일 내용 추가 및 수정]---------------------------------------

[DEFAULT]
...
verbose = True
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge =
router_delete_namespaces = True
------------------------------------------------------------------
    • dhcp 환경 설정
      • /etc/neutron/dhcp_agent.ini
$ sudo vi /etc/neutron/dhcp_agent.ini

[파일 내용 추가 및 수정]---------------------------------------

[DEFAULT]
...
verbose = True
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
dhcp_delete_namespaces = True
...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf
------------------------------------------------------------------
      • /etc/neutron/dnsmasq-neutron.conf 생성
$ sudo vi /etc/neutron/dnsmasq-neutron.conf

[신규 파일 생성]--------------------------------------------------

dhcp-option-force=26,1454
--------------------------------------------------------------------

* MTU 사이즈를 변경하는 경우 아래와 같이 변경하면 된다.
* 아래의 예는 MTU 사이즈 1400으로 고정하는 예이다.
[신규 파일 생성]--------------------------------------------------

dhcp-option-force=26,1400
--------------------------------------------------------------------
      • dhsmasq kill
$ pkill dnsmasq
    • Metadata 환경 설정
      • /etc/neutron/metadata_agent.ini
$ sudo vi /etc/neutron/metadata_agent.ini

[파일 내용 추가 및 수정]---------------------------------------

[DEFAULT]
...
verbose = True
...
auth_uri = http://controlnode01:5000
auth_url = http://controlnode01:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = <Neutron 사용자 등록시 설정한 Pass>
...
nova_metadata_ip = controlnode01
...
metadata_proxy_shared_secret = METADATA_SECRET
------------------------------------------------------------------


2-3. OpenvSwitch 설정

    • ovs 재실행
$ sudo service openvswitch-switch restart
    • ovs external bridge 생성 및 포트 바인딩
      • Network Node의 Public IP를 설정하여야 하는 인터페이스를 바인딩한다. (본 예제는 eth0 이다)
$ sudo ovs-vsctl add-br br-ex

$ sudo ovs-vsctl add-port br-ex eth0
      • network driver의 GRO(Generic Receive Offload) 종료
$ sudo ethtool -K eth0 gro off
    • network service 재실행
$ sudo service neutron-plugin-openvswitch-agent restart
$ sudo service neutron-l3-agent restart
$ sudo service neutron-dhcp-agent restart
$ sudo service neutron-metadata-agent restart


2-4. 동작 확인

    • Control Node에서 admin 사용자를 활성화 한다.
$ source admin-openrc.sh
    • neutron agent 리스트를 확인한다.
$ neutron agent-list

[결과]
+-----------------------------------------------+-----------------------+---------------+-------+----------------+-----------------------+
| id                                                      | agent_type            | host             | alive   | admin_state_up | binary                 |
+-----------------------------------------------+-----------------------+---------------+-------+----------------+-----------------------+
| 01ede9f9-fe57-4caf-b976-bae7f6a1f04d    | Metadata agent       | networknode01 | :-)   | True    | neutron-metadata-agent    |
| 2e0e5956-6fa6-406d-9f26-9b275f85c625   | Open vSwitch agent | networknode01 | :-)   | True    | neutron-openvswitch-agent |
| 44c9169b-b9d9-4251-9e7a-11097d3972f6 | Open vSwitch agent | networknode02 | :-)   | True    | neutron-openvswitch-agent |
| a6c75b6b-9723-4942-91ef-3d8f2b69b7f9  | Metadata agent       | networknode02 | :-)   | True    | neutron-metadata-agent     |
| b1ce9201-33cd-4c53-9c33-5783a807180c | L3 agent                 | networknode02 | :-)   | True    | neutron-l3-agent              |
| c9db2aa0-4086-44ec-bc1f-3e8755916964 | DHCP agent            | networknode02 | :-)   | True     | neutron-dhcp-agent          |
| cee50d11-f753-4c42-a678-06aee0c963da | L3 agent                 | networknode01 | :-)   | True     | neutron-l3-agent              |
| f8255b22-7833-4db1-b3f4-d6e4d6578f04 | DHCP agent            | networknode01 | :-)   | True     | neutron-dhcp-agent          |
+----------------------------------------------+-----------------------+---------------+-------+----------------+------------------------+


3. Compute Node


3-1. Network Node 기본 설정

    • 커널 네트워킹 설정
$ sudo vi /etc/sysctl.conf

[파일 내용 수정]-------------------------------------------------

net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
-------------------------------------------------------------------
    • 변경사항 적용
$ sudo sysctl -p


3-2. Neutron 패키지 인스톨 및 설정

    • Neutron 패키지 인스톨
$ sudo apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent
    • Neutron 환경 설정
      • /etc/neutron/neutron.conf
        • Database 섹션은 모두 comment 처리 함
$ sudo vi /etc/neutron/neutron.conf

[파일 내용 추가 및 수정]--------------------------------------------

[DEFAULT]
...
verbose = True
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

[oslo_messaging_rabbit]
...
rabbit_host = controlnode01
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

[keystone_authtoken]
...
auth_uri = http://controlnode01:5000
auth_url = http://controlnode01:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = <Neutron 사용자 등록시 설정한 Pass>
-----------------------------------------------------------------------
    • ml2 환경 설정
      • /etc/neutron/plugins/ml2/ml2_conf.ini
$ 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 = 10.0.1.31
tunnel_type = vxlan
tunnel_bridge = br-tun
integration_bridge = br-int
tunnel_id_ranges=1001:2000
tenant_network_type = vxlan
enable_tunneling = True

[agent]
...
tunnel_types = vxlan
vxlan_udp_port = 4789
------------------------------------------------------------------


3-3. OpenvSwitch 설정

    • ovs 재실행
$ sudo service openvswitch-switch restart


3-4. Nova Compute 설정

    • nova 설정
      • /etc/nova/nova.conf
$ sudo vim /etc/nova/nova.conf

[파일 내용 추가 및 수정]---------------------------------------

[DEFAULT]
...
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

[neutron]
...
url = http://controlnode01:9696
auth_strategy = keystone
admin_auth_url = http://controlnode01:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = <Neutron 사용자 등록시 설정한 Pass>
------------------------------------------------------------------
    • Compute Service 재 실행
$ sudo service nova-compute restart


3-5. Neutron Network 재실행

    • neutron agent 재 실행
$ sudo service neutron-plugin-openvswitch-agent restart


3-6. 동작 확인

    • Control Node에서 admin 사용자를 활성화 한다.
$ source admin-openrc.sh
    • neutron agent 리스트를 확인한다.
      • Open vSwitch agent의 Compute Node가 정상 동작하는지 확인
$ neutron agent-list

[결과]
+-----------------------------------------------+----------------------+-------------------+-------+----------------+---------------------------+
| id                                                     | agent_type             | host                | alive | admin_state_up | binary                    |
+-----------------------------------------------+----------------------+-------------------+-------+----------------+---------------------------+
| 01ede9f9-fe57-4caf-b976-bae7f6a1f04d    | Metadata agent       | networknode01 | :-)   | True    | neutron-metadata-agent            |
| 2e0e5956-6fa6-406d-9f26-9b275f85c625   | Open vSwitch agent | networknode01 | :-)   | True    | neutron-openvswitch-agent        |
| 44c9169b-b9d9-4251-9e7a-11097d3972f6 | Open vSwitch agent | networknode02 | :-)   | True    | neutron-openvswitch-agent        |
| 4c292855-5538-45dc-a6d1-26a52d7c9c8b | Open vSwitch agent | compute01       | :-)   | True    | neutron-openvswitch-agent        |
| a6c75b6b-9723-4942-91ef-3d8f2b69b7f9  | Metadata agent       | networknode02 | :-)   | True    | neutron-metadata-agent            |
| b1ce9201-33cd-4c53-9c33-5783a807180c | L3 agent                 | networknode02 | :-)   | True    | neutron-l3-agent                     |
| b62fa17c-c34e-4635-a76e-05fd419d7037  | Open vSwitch agent | compute02       | :-)   | True    | neutron-openvswitch-agent        |
| c9db2aa0-4086-44ec-bc1f-3e8755916964  | DHCP agent           | networknode02 | :-)   | True    | neutron-dhcp-agent                  |
| cee50d11-f753-4c42-a678-06aee0c963da  | L3 agent                | networknode01 | :-)   | True    | neutron-l3-agent                      |
| f8255b22-7833-4db1-b3f4-d6e4d6578f04  | DHCP agent           | networknode01 | :-)   | True    | neutron-dhcp-agent                  |
+-----------------------------------------------+----------------------+-------------------+-------+----------------+---------------------------+