背景
使用 PackStack 安装 OpenStack 后,我们面临网络问题。我们想要一个超级简单的网络,其中包含一个子网,所有虚拟机都应驻留在该子网中,因为这看起来是最简单的解决方案。我们必须从运行 nova 的三个节点开始。
我们使用的应答文件是这样的:答案文件(pastebin)
我们的设置
三个节点搭载 CentOS 6.5,节点连接到两个交换机。
- eth0:公共
- eth1:内部网络,ip 10.0.20.0/24,其中node1(10.0.20.1),node2(10.0.20.2)...
- 交换机端口没有 VLAN 标记或中继(不幸的是)。
- 我们希望实例不仅能够通信,还能访问互联网。
安全组规则
Ingress IPv4 TCP 1 - 65535 0.0.0.0/0 (CIDR)
Ingress IPv4 TCP 22 (SSH) 0.0.0.0/0 (CIDR)
Ingress IPv6 Any - default
Ingress IPv4 TCP 22 (SSH) 10.0.20.0/24 (CIDR)
Ingress IPv4 TCP 53 (DNS) 0.0.0.0/0 (CIDR)
Egress IPv4 Any - 0.0.0.0/0 (CIDR)
Ingress IPv4 ICMP - 0.0.0.0/0 (CIDR)
Egress IPv6 Any - ::/0 (CIDR)
Ingress IPv4 Any - default
中子
(neutron) agent-list
+--------------------------------------+--------------------+------------------------
| id | agent_type | host | alive | admin_state_up
+--------------------------------------+--------------------+------------------------
| 09add8dd-0328-4c63-8a79-5c61322a8314 | L3 agent | host3 | :-) | True
| 0d0748a9-4289-4a5d-b1d9-d06a764a8d25 | Open vSwitch agent | host2 | :-) | True
| 258c92fe-8e3a-4760-864e-281a47523e85 | Open vSwitch agent | host1 | :-) | True
| 2e886dc1-af93-4f4f-b66c-61177a6c9dba | L3 agent | host1 | :-) | True
| 50f37a33-2bfc-43f2-9d2f-4f42564d234d | Open vSwitch agent | host3 | :-) | True
| 535bf0a3-06aa-4072-ae5a-1b1ba1d377ab | L3 agent | host2 | :-) | True
| 9b17ef73-a602-4b5d-a4e9-e97445e594b4 | DHCP agent | host1 | :-) | True
ovs-vsctl
主机1ovs-vsctl 显示
43da814e-223c-4f66-ba2d-c3c9de91e1f8
Bridge br-ex
Port br-ex
Interface br-ex
type: internal
Bridge br-int
Port br-int
Interface br-int
type: internal
Port "tap3e0d3121-32"
tag: 4
Interface "tap3e0d3121-32"
type: internal
Port "tap4a397755-29"
tag: 4
Interface "tap4a397755-29"
ovs_version: "1.11.0"
主机2
afa75816-6a40-4f0c-842f-236a3a94cd63
Bridge br-int
Port br-int
Interface br-int
type: internal
Port "tap46f55af8-73"
tag: 1
Interface "tap46f55af8-73"
Bridge br-ex
Port br-ex
Interface br-ex
type: internal
ovs_version: "1.11.0"
出问题
实例无法相互通信,也无法访问互联网。坦率地说,当使用多节点 nova 设置时,当节点之间的“内部”网络仅使用一个链接时,我们不确定这方面的要求是什么。我认为问题是路由问题,因为我们无法连接不同节点上的实例,但在阅读了大量文档后,我不太确定如何进行。如果我对接口 br-int 进行 tcpdump,我可以看到 ARP 请求,但仅此而已。如果我尝试从相应主机上的实例进行 ping,那就是这样。
问题
所以问题是:我们如何继续寻找这个多节点网络问题的解决方案,我们需要考虑什么?可能是路由,还是主机操作系统或 openstack 的配置错误?(运行 CentOS)。
非常感谢任何反馈,因为我们在这个阶段已经停滞了几个星期。很抱歉发了这么长的帖子,但我希望这里有需要的信息。如果没有,不要害羞 :)
更新
我已经能够修复节点之间的内部网络,以便实例能够在物理节点之间进行通信。
- Changed the /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini:
[database]
connection = mysql://neutron:[email protected]:3306/ovs_neutron
[OVS]
tennant_network_type = gre
tunnel_id_ranges = 1:1000
integration_brige = br-int
tunnel_bridge = br-tun
local_ip = 10.0.20.1
enable_tunneling = True
- Restarted the service on controller
cd /etc/init.d/; for i in $( ls neutron-* ); do sudo service $i restart; done )
service openvswitch restart
在所有节点上都完成了此操作并创建了 GRE 隧道。虽然流程不起作用,但我需要使用ovs-ofctl add-flow br-tun action=normal
。
我现在面临的问题是能否将内部子网路由到互联网,以便所有实例都能访问互联网。我需要浮动 IP 才能连接到互联网吗?br-int 和 br-ex 或路由器之间没有补丁,那么是否需要它才能将流量路由到互联网?
我可以使用 ip netns exec ... ip add default gw via (ip of br-ex) 添加默认路由吗?还是我需要添加一些新的接口?
答案1
答案2
正如之前更新的那样,我设法使用 GRE 隧道而不是 nova 网络来启动并运行网络。如果您有备用的物理网络接口,Nova 网络似乎是一个不错的解决方案,但是如果您没有,它就不能很好地工作。
GRE 设置完成如下: - 更改了 /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini:
[database]
connection = mysql://neutron:[email protected]:3306/ovs_neutron
[OVS]
tennant_network_type = gre
tunnel_id_ranges = 1:1000
integration_brige = br-int
tunnel_bridge = br-tun
local_ip = "internal ip"
enable_tunneling = True
- Restarted the service on controller
cd /etc/init.d/; for i in $( ls neutron-* ); do sudo service $i restart; done )
service openvswitch restart
这被复制到每个计算节点。但是,使用 GRE 隧道时,重要的是,当您创建新网络时,您需要指定分段 ID。如果您尝试通过 Horizon 创建网络,它将无法工作。
keystone tenant-list
admin=$(keystone tenant-list | grep admin | awk -F' |' '{ print $2 }')
neutron net-create --tenant-id $admin network --provider:network_type gre --provider:segmentation_id 3
neutron subnet-create --tenant-id $admin network 192.168.0.0/24 --getaway 192.168.0.1
您还可以使用以下命令添加外部网络:
neutron net-create ext
neutron net-list
neutron subnet-create extnet --allocation-pool start=10.0.0.10,end=10.0.0.100 --gateway=10.0.0.1 --enable_dhcp=False 10.0.0.0/24
然后我们可以创建一个新的路由器,并将网络连接到这个外部路由器。这当然只是众多解决方案之一。
intsubnet=$(neutron subnet-list | grep 192.168.0.0/24| awk -F' |' '{ print $2 }')
extnet=$(neutron net-list | grep ext | awk -F' |' '{ print $2 }')
neutron router-create ext-to-int --tenant-id $admin
router=$(neutron router-list | grep ext-to-int | awk -F' |' '{ print $2 }')
neutron router-interface-add $router $intsubnet
neutron router-gateway-set $router $extnet
一开始,实例的吞吐量非常低。当我使用 DCHP 分发新的 MTU (1454) 时,这个问题得到了解决(在 /etc/neutron/ 下创建一个 dhcp 配置文件并添加dhcp-option-force=26,1454
到该文件中。dnsmasq_config_file
在 /etc/neutron/dhcp_agent.ini 中更新
这对我很有用并且是我所需要的全部。