Neutron网络服务(网络节点)
目录[隐藏] |
参考
由于硬件条件所限并结合实际网络环境,本页并不是完全按照官方给出的指导[1]进行.
前置工作
调整内核参数
由于网络节点要承担起路由器的角色,必须把内核的转发功能打开,同时关闭反向路径过滤功能,编辑 /etc/sysctl.conf 修改其中的相关参数如下:
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
应用配置
# sysctl -p
安装
# apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent openvswitch-datapath-dkms neutron-l3-agent neutron-dhcp-agent
注意:Ubuntu installations using Linux kernel version 3.11 or newer do not require the openvswitch-datapath-dkms package.
配置
主要涉及以下配置文件
- /etc/neutron/neutron.conf
- neutron服务本身
- /etc/neutron/plugins/ml2/ml2_conf.ini
- ml2,二层网络插件
- /etc/neutron/l3_agent.ini
- 虚拟网络路由服务
- /etc/neutron/dhcp_agent.ini
- 虚拟网络DHCP
- /etc/neutron/dnsmasq/dnsmasq-neutron.conf
- DHCP服务具体配置,这里创建这个文件主要为了配置合适的网络MTU
- /etc/neutron/metadata_agent.ini
- 元数据...
- /etc/nova/nova.conf(控制节点上)
- 元数据...
keystone对接
编辑配置文件/etc/neutron/neutron.conf,在对应小节修改(或添加)相关字段如下
[DEFAULT]
...
auth_strategy = keystone
...
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_host = controller
auth_protocol = http
auth_port = 35357
admin_tenant_name = service
admin_user = neutron
admin_password = neutron_pass
这里假定neutron服务的keystone帐号密码为neutron_pass
rabbitmq对接
修改配置文件/etc/neutron/neutron.conf, 在对应小节修改(或添加)相关字段如下
[DEFAULT]
...
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = controller
rabbit_password = rabbit123
这里假定消息队列默认用户(guest)的密码为rabbit123
metadata服务对接
修改配置文件/etc/neutron/metadata_agent.ini, 修改配置文件相关字段如下:
[DEFAULT]
...
auth_url = http://controller:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = neutron_pass
nova_metadata_ip = controller
metadata_proxy_shared_secret = metadatasceret
这里假定neutron服务的keystone帐号密码为neutron_pass,且在控制节点上配置的metadata_proxy_shared_secret为metadatasceret
ML2插件配置
首先修改配置文件/etc/neutron/neutron.conf指定使用的插件
[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
注释掉所有[service_providers]下的内容 然后修改ml2插件单独的配置文件/etc/neutron/plugins/ml2/ml2_conf.ini,指定其使用openswitch,并采用GRE隧道,添加或修改相应的小节字段如下
[ml2]
...
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch [ml2_type_gre]
...
tunnel_id_ranges = 1:1000 [ovs]
...
local_ip = 10.14.39.50
tunnel_type = gre
enable_tunneling = True [securitygroup]
...
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
其中[ovs]小节中local_ip指定的时GRE隧道通信使用的网络接口的ip地址,由于我们台式机只有一张网卡,所以和管理服务共用一个接口.
L3-agent
L3即三层网络(这里是ip网络),进行网络路由的层.修改配置文件 /etc/neutron/l3_agent.ini, 将相关字段小节添加(修改)如下:
[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
关于linux网络命名空间在路由上的实际使用可以查看虚拟路由
DHCP-agent
这里DHCP服务主要用于虚拟网络中ip地址动态分配,并指定合适的MTU值,修改配置文件/etc/neutron/dhcp_agent.ini,编辑相关内如下:
[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
...
# Override the default dnsmasq settings with this file
dnsmasq_config_file = /etc/neutron/dnsmasq/dnsmasq-neutron.conf
这里我们指定了dnsmasq服务的配置文件以覆盖默认配置,因为我们使用了GRE隧道,对于虚拟机来说MTU不再是默认的1500,必须进行修改,否则会造成数据传输卡顿,参见[2].
创建dnsmasq的配置文件/etc/neutron/dnsmasq/dnsmasq-neutron.conf,加入如下内容
# explicitly set the MTU when using a GRE Tunnel(or big data packets won't tx/rx normally)
dhcp-option-force=26,1454 # set the dns server for internal virtual machines
server=10.10.0.21 # set local domain name
domain=dblab
注意网上有些文章,给出MTU为1400的配置,这个值在虚拟机内使用VPN时也会造成网络传输问题,因为VPN隧道的MTU默认是1400,如果此时再指定虚拟以太网的MTU为1400则,大数据将无法收发,造成VPN能够连上,但依然无法访问网络的现象.
接口配置
单网卡接口配置方案
网络节点由于只有一个物理网络接口,但是按照三节点部署方案,在网络节点上需要用一个接口来接到外部网络,使得虚拟机能够访问外部网络,并且通过浮动IP配置,外部网络能够访问虚拟网络内的虚拟机.为此我们采用右图所示的配置方案.
首先我们按照官方指导创建两个neutron系统默认使用的openswitch网桥(br-ex, br-int)如下
# service openvswitch-switch restart # ovs-vsctl add-br br-int # ovs-vsctl add-br br-ex
接下来官方中,需要将一个连接在外网上的接口(比如eth2)加入到br-ex(该网桥就是负责外网与虚拟路由的连接)中,如下
# ovs-vsctl add-port br-ex eth2
很遗憾我们没有这样的另一个网络接口(网卡),如果把我们仅有的网络接口(eth0)加入到网桥中比如
# ovs-vsctl add-port br-ex eth0
很快就会发现,网络节点不能上网了,就连网关也ping不通了,因为加入到网桥的接口是作为二层接口来看待的,因此没有IP地址,也就是说我们现在的网络节点没有了IP地址了,沦落为一台二层设备了,不能进行任何的三层(IP网络)操作了.其实使用ovs-vsctl命令创建网桥时,会默认加入一个与网桥名同名的一个三层接口,对br-ex来说就是br-ex网络接口,可以通过ifconfig命令或以下命令查看:
admin@network:~$ sudo ovs-vsctl show
[sudo] password for admin:
dbee7ef4-5fda-45ab-a441-bf3adcfe2835
Bridge br-ex
Port br-ex
Interface br-ex
type: internal
Port "eth0"
Interface "eth0"
...
因此我们可以将该接口的ip地址设成原来eth0的地址,即网络节点的地址10.14.39.50 / 24(在这之前确保eth0接口的地址已经被清零), 同时需要修改路由表,添加一条从br-ex接口上的默认路由(原先的默认路由会随着eth0地址的清空而被删除).至此网络节点的网络访问又恢复正常了,而且我们也向br-ex网桥中添加了一个接口eth0,这样至少可以使得虚拟机在校园网内被访问.
总的来说需要进行如下配置
# ovs-vsctl add-br br-int # ovs-vsctl add-br br-ex # ifconfig eth0 0 # ovs-vsctl add-port br-ex eth0 # ifconfig br-ex 10.14.39.50 netmask 255.255.255.0 # route add default gw 10.14.39.1 br-ex
如果网络节点拨了学校VPN的话请另外添加一条路由,使得其他校园内网能够正常访问,这对于其他节点主机也是一样的.
route add -net 10.0.0.0/8 gw 10.14.39.1 br-ex
服务更新
为了日后管理方便,在admin用户下创建两个脚本文件
- openvswitch_restart.sh
#! /bin/bash
service openvswitch-switch restart
- neutron_restart.sh
##! /bin/bash
service neutron-plugin-openvswitch-agent restart \
&& service neutron-l3-agent restart \
&& service neutron-dhcp-agent restart \
&& service neutron-metadata-agent restart
修改脚本权限
$ chmod +x openvswitch_restart.sh
$ chmod +x neutron_restart.sh
运行脚本,重启服务以应用上述的配置
# ./openvswitch_restart.sh
# ./neutron_restart.sh
服务验证
可以neutron客户端查看各个节点的agent状态(l2,l3,dhcp等)
admin@network:~$ . admin-openrc.sh
admin@network:~$ neutron
(neutron) agent-list
+--------------------------------------+--------------------+----------+-------+----------------+
| id | agent_type | host | alive | admin_state_up |
+--------------------------------------+--------------------+----------+-------+----------------+
| 276b1204-db1a-4157-867b-c442e82221fc | Open vSwitch agent | network | :-) | True |
| 798ce163-c600-48a6-a0a4-0b8eeb03a752 | Metadata agent | network | :-) | True |
| bc34ff15-aa0d-4b7e-9efb-c4413264fa24 | L3 agent | network | :-) | True |
| be1e8354-ce08-480e-aea1-2e5a17a64c60 | DHCP agent | network | :-) | True |
| dda050ed-6e90-43de-852c-6bb5c4a5daae | Open vSwitch agent | compute1 | :-) | True |
+--------------------------------------+--------------------+----------+-------+----------------+
关注alive列,如果是":-)"则该服务正常,如果是XXX则说明该节点的相关服务出现问题.
附加配置
共享上网
为了使得虚拟机能够直接通过网络节点的VPN上外网(方便测试和虚拟机配置),我们需要修改网络节点上的路由表和虚拟路由的路由表。
iptables NAT
在拨通VPN连接后,系统一般会多出一个ppp0接口,需要将其他机器请求转发的包由这个网络接口送出,同时为了更好的伪装,我们修改报文的TTL数值,这使得外部无法区分本机发包和转发包。 首先使用iptables在nat表中加入一条如下
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
然后在mangle表中加入一条修改包TTL的规则,统一将报文TTL修改为64
sudo iptables -t mangle POSTROUTING -o ppp0 -j TTL --ttl-set 64
虚拟路由
先通过以下命令获得虚拟路由所在的命名空间
# ip netns
qrouter-e7286b63-5ea3-4470-9308-898be00b475b
qdhcp-e798d0d9-88a0-4f56-b412-599372e26409
qdhcp-a7b60bd2-b03f-4ea8-8b9e-ba0e022259c0
qdhcp-e2215146-953f-4fe0-b2fa-6864d44285a5
其中含有router的即为虚拟路由命名空间
删除原有默认路由(走10.14.39.1网关)
ip netns exec qrouter-e7286b63-5ea3-4470-9308-898be00b475b route del default
然后添加一条默认路由(走10.14.39.50,即刚刚配置了MASQUERADE规则的网络节点,即本机),该默认路由需要添加在指向10.14.39.0/24网段的那个接口上 查看虚拟路由接口:
root@network:/home/admin# ip netns exec qrouter-e7286b63-5ea3-4470-9308-898be00b475b ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) qg-f8c30f08-16 Link encap:Ethernet HWaddr fa:16:3e:9d:a6:8e
inet addr:10.14.39.113 Bcast:10.14.39.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fe9d:a68e/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:83378 errors:0 dropped:0 overruns:0 frame:0
TX packets:33333 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16702676 (16.7 MB) TX bytes:25097978 (25.0 MB) qr-0b260f87-20 Link encap:Ethernet HWaddr fa:16:3e:c1:96:32
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fec1:9632/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:38719 errors:0 dropped:0 overruns:0 frame:0
TX packets:26447 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:26061304 (26.0 MB) TX bytes:6118682 (6.1 MB) qr-4a43399e-9d Link encap:Ethernet HWaddr fa:16:3e:df:02:7b
inet addr:192.100.0.1 Bcast:192.100.255.255 Mask:255.255.0.0
inet6 addr: fe80::f816:3eff:fedf:27b/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2612 (2.6 KB) TX bytes:738 (738.0 B)
可以看到是qg-f8c30f08-16接口
ip netns exec qrouter-e7286b63-5ea3-4470-9308-898be00b475b route add default gw 10.14.39.50 qg-f8c30f08-16