Skip to content

Commit bf7ef1f

Browse files
committed
Finish the vxlan mode
1 parent da92ade commit bf7ef1f

File tree

18 files changed

+643
-79
lines changed

18 files changed

+643
-79
lines changed

SUMMARY.md

+10-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@
1010
* [计算节点](vlan_mode/compute_node.md)
1111
* [网络节点](vlan_mode/network_node.md)
1212
* [VXLAN 模式](vxlan_mode/README.md)
13-
* [计算节点](vxlan_mode/compute_node.md)
14-
* [网络节点](vxlan_mode/network_node.md)
13+
* [计算节点](compute_node/README.md)
14+
* [br-int](vxlan_mode/compute_node/br-int.md)
15+
* [br-tun](vxlan_mode/compute_node/br-tun.md)
16+
* [网络节点](vxlan_mode/network_node/README.md)
17+
* [br-tun](vxlan_mode/network_node/br-tun.md)
18+
* [br-int](vxlan_mode/network_node/br-int.md)
19+
* [br-ex](vxlan_mode/network_node/br-ex.md)
20+
* [网络命名空间](namespace/README.md)
21+
* [DHCP 服务](namespace/dhcp.md)
22+
* [路由服务](namespace/router.md)
1523
* [安全组](security_group/README.md)
1624
* [INPUT](security_group/input.md)
1725
* [OUTPUT](security_group/output.md)

_images/ovs_rules_network_br_tun.png

137 KB
Loading

appendix_install/README.md

+196
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,198 @@
11
# 附:安装配置
22
参考 https://github.com/yeasy/openstack-tool。
3+
4+
# DevStack 安装 OpenStack 多节点(Juno+Neutron+ML2+VXLAN)
5+
6+
目前安装 OpenStack 常见的方案有 Redhat 的 [RDO](https://openstack.redhat.com/) 和社区的 [DevStack](http://docs.openstack.org/developer/devstack/)
7+
8+
当然,也可以手动安装,可以参考:[github.com/ChaimaGhribi/OpenStack-Juno-Installation/blob/master/OpenStack-Juno-Installation.rst](https://github.com/ChaimaGhribi/OpenStack-Juno-Installation/blob/master/OpenStack-Juno-Installation.rst)
9+
10+
其中,RDO 功能比较强大,运行也稳定,可以在一个节点上通过一个 answer 文件直接部署多个节点,搭建一套 OpenStack 环境。但是可惜,在 Ubuntu 上还不支持。
11+
12+
DevStack 支持 Ubuntu、Fedora 等环境,需要在每个节点上单独执行,适合进行实验。目前常见的教程一般都是讲解 DevStack 单节点安装。本文讲解最新的 Juno 版本在多节点上的安装过程。
13+
14+
# 网络环境
15+
两台机器,分为控制节点(同时也作为网络节点)和计算节点。
16+
## 控制节点
17+
eth0: 9.186.100.77/24 作为管理网络(同时也是公共网络)。
18+
eth1: 10.0.100.77/24 作为内部网络接口。
19+
20+
## 计算节点
21+
eth0: 9.186.100.88/24 作为管理网络(同时也是公共网络)。
22+
eth1: 10.0.100.88/24 作为内部网络接口。
23+
24+
# 配置 stack 用户
25+
26+
创建 stack 用户
27+
```
28+
sudo groupadd stack
29+
sudo useradd -g stack -s /bin/bash -d /opt/stack -m stack
30+
```
31+
32+
添加 stack 用户权限。
33+
34+
```
35+
sudo echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
36+
```
37+
38+
切换到 stack 用户
39+
```
40+
sudo su - stack
41+
```
42+
43+
# 下载代码
44+
45+
下载 devstack 代码,并切换到 stable/juno 分支。
46+
```
47+
sudo apt-get install git -y
48+
git clone https://git.openstack.org/openstack-dev/devstack -b stable/juno
49+
```
50+
51+
# 编写运行配置文件
52+
53+
在 devstack 根目录下,编写 local.conf。
54+
55+
控制节点的 local.conf
56+
57+
```sh
58+
[[local|localrc]]
59+
60+
MULTI_HOST=true
61+
HOST_IP=9.186.100.77 # management network
62+
63+
FIXED_RANGE=10.0.0.0/24 #tenant private network
64+
NETWORK_GATEWAY=10.0.0.1
65+
#FIXED_NETWORK_SIZE=4096
66+
67+
PUBLIC_INTERFACE=eth0 #public network
68+
FLOATING_RANGE=9.186.100.128/25
69+
PUBLIC_NETWORK_GATEWAY=9.186.100.1
70+
71+
TUNNEL_ENDPOINT_IP=10.0.100.77 # data network endpoint for vxlan
72+
73+
LOGFILE=/opt/stack/logs/stack.sh.log
74+
75+
# Credentials
76+
ADMIN_PASSWORD=admin
77+
MYSQL_PASSWORD=secret
78+
RABBIT_PASSWORD=secret
79+
SERVICE_PASSWORD=secret
80+
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
81+
82+
# enable neutron-ml2-vxlan
83+
disable_service n-net
84+
enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,q-metering,q-lbaas,q-fwaas,q-vpn,neutron,tempest,heat
85+
86+
#OFFLINE=True
87+
88+
LOG_COLOR=False
89+
LOGDIR=$DEST/logs
90+
SCREEN_LOGDIR=$LOGDIR/screen
91+
92+
```
93+
94+
计算节点的 local.conf
95+
96+
```sh
97+
[[local|localrc]]
98+
MULTI_HOST=true
99+
100+
HOST_IP=9.186.100.88 # management network
101+
102+
FIXED_RANGE=10.0.0.0/24 # tenant private network
103+
NETWORK_GATEWAY=10.0.0.1
104+
#FIXED_NETWORK_SIZE=4096
105+
106+
TUNNEL_ENDPOINT_IP=10.0.100.88 # data network endpoint for vxlan
107+
108+
# Credentials
109+
ADMIN_PASSWORD=admin
110+
MYSQL_PASSWORD=secret
111+
RABBIT_PASSWORD=secret
112+
SERVICE_PASSWORD=secret
113+
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
114+
115+
# Service information
116+
SERVICE_HOST=9.186.100.77
117+
MYSQL_HOST=$SERVICE_HOST
118+
RABBIT_HOST=$SERVICE_HOST
119+
GLANCE_HOSTPORT=$SERVICE_HOST:9292
120+
Q_HOST=$SERVICE_HOST
121+
KEYSTONE_AUTH_HOST=$SERVICE_HOST
122+
KEYSTONE_SERVICE_HOST=$SERVICE_HOST
123+
124+
CEILOMETER_BACKEND=mongodb
125+
DATABASE_TYPE=mysql
126+
127+
ENABLED_SERVICES=n-cpu,q-agt,neutron
128+
129+
# vnc config
130+
NOVA_VNC_ENABLED=True
131+
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
132+
VNCSERVER_LISTEN=$HOST_IP
133+
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
134+
135+
#OFFLINE=True
136+
137+
LOG_COLOR=False
138+
LOGDIR=$DEST/logs
139+
SCREEN_LOGDIR=$LOGDIR/screen
140+
#LOGFILE=/opt/stack/logs/stack.sh.log
141+
142+
```
143+
144+
# 执行配置
145+
146+
执行命令。
147+
```
148+
./stack.sh
149+
```
150+
151+
会输出各项操作的结果。日志会写到 stack.sh.log 文件。成功后最后会打印出相关信息。
152+
153+
控制节点上
154+
155+
```
156+
Horizon is now available at http://9.186.100.77/
157+
Keystone is serving at http://9.186.100.77:5000/v2.0/
158+
Examples on using novaclient command line is in exercise.sh
159+
The default users are: admin and demo
160+
The password: admin
161+
This is your host ip: 9.186.100.77
162+
```
163+
执行成功后,在控制节点上,将物理网卡 eth0 绑定到 br-ex 网桥上。
164+
```sh
165+
sudo ifconfig eth0 0.0.0.0; sudo ovs-vsctl add-port br-ex eth0; sudo ifconfig br-ex 9.186.100.77/24; sudo route add default gw 9.186.100.1
166+
```
167+
168+
# 其它事项
169+
170+
## 停止服务
171+
停止 OpenStack 的各个服务(DevStack 默认每个服务都在一个 screen 中以进程方式运行,可以通过 screen -x stack 进入查看)。
172+
```sh
173+
./unstack.sh
174+
```
175+
176+
## 清除安装。
177+
```sh
178+
./clean.sh
179+
```
180+
181+
## 手动清除
182+
有时候有些文件可能清除不干净,手动执行
183+
```
184+
sudo rm -rf /etc/libvirt/qemu/inst*
185+
sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy
186+
```
187+
## 依赖版本
188+
安装过程中可能会报某些包版本不满足的问题,手动安装后。
189+
190+
例如报 six 包版本过低。
191+
192+
```
193+
sudo pip install six --upgrade
194+
```
195+
196+
## screen 操作
197+
ctrl+a+" 显示 session 列表。
198+
ctrl+a+d 挂起到后台。

compute_node/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# 计算节点
2+
计算节点上运行着虚拟机。如果不启用 DVR 特性,则所有的网络相关的服务,都在网络节点上进行。即计算节点上的网络只需要实现二层转发即可。

namespace/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 网络名字空间
2+
在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。
3+
4+
可以用ip netns list命令来查看已经存在的名字空间。
5+
```sh
6+
$ ip net
7+
qdhcp-ea3928dc-b1fd-4a1a-940e-82b8c55214e6
8+
qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e
9+
```
10+
qdhcp开头的名字空间是dhcp服务器使用的,qrouter开头的则是router服务使用的。
11+
可以通过 `ip netns exec namespaceid command` 来在指定的网络名字空间中执行网络命令,例如
12+
```sh
13+
# ip netns exec qdhcp-88b1609c-68e0-49ca-a658-f1edff54a264 ip addr
14+
71: ns-f14c598d-98: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
15+
link/ether fa:16:3e:10:2f:03 brd ff:ff:ff:ff:ff:ff
16+
inet 10.1.0.3/24 brd 10.1.0.255 scope global ns-f14c598d-98
17+
inet6 fe80::f816:3eff:fe10:2f03/64 scope link
18+
valid_lft forever preferred_lft forever
19+
```
20+
可以看到,dhcp服务的网络名字空间中只有一个网络接口“ns-f14c598d-98”,它连接到br-int的tapf14c598d-98接口上。
21+
22+
23+

namespace/dhcp.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
## DHCP 服务
2+
dhcp服务是通过dnsmasq进程(轻量级服务器,可以提供dns、dhcp、tftp等服务)来实现的,该进程绑定到dhcp名字空间中的br-int的接口上。可以查看相关的进程。
3+
```sh
4+
# ps -fe | grep 88b1609c-68e0-49ca-a658-f1edff54a264
5+
nobody 23195 1 0 Oct26 ? 00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=ns-f14c598d-98 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/host --dhcp-optsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/opts --dhcp-script=/usr/bin/neutron-dhcp-agent-dnsmasq-lease-update --leasefile-ro --dhcp-range=tag0,10.1.0.0,static,120s --conf-file= --domain=openstacklocal
6+
root 23196 23195 0 Oct26 ? 00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=ns-f14c598d-98 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/host --dhcp-optsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/opts --dhcp-script=/usr/bin/neutron-dhcp-agent-dnsmasq-lease-update --leasefile-ro --dhcp-range=tag0,10.1.0.0,static,120s --conf-file= --domain=openstacklocal
7+
```

namespace/router.md

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
## 路由服务
2+
首先,要理解什么是 router,router是提供跨 subnet 的互联功能的。比如用户的内部网络中主机想要访问外部互联网的地址,就需要router来转发(因此,所有跟外部网络的流量都必须经过router)。目前router的实现是通过iptables进行的。
3+
4+
同样的,router服务也运行在自己的名字空间中,可以通过如下命令查看:
5+
```sh
6+
$ sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e ip addr
7+
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
8+
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9+
inet 127.0.0.1/8 scope host lo
10+
valid_lft forever preferred_lft forever
11+
inet6 ::1/128 scope host
12+
valid_lft forever preferred_lft forever
13+
49: qr-694450d6-f6: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
14+
link/ether fa:16:3e:5d:18:10 brd ff:ff:ff:ff:ff:ff
15+
inet 10.0.0.1/24 brd 10.0.0.255 scope global qr-694450d6-f6
16+
valid_lft forever preferred_lft forever
17+
inet6 fe80::f816:3eff:fe5d:1810/64 scope link
18+
valid_lft forever preferred_lft forever
19+
50: qg-e76de35e-90: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
20+
link/ether fa:16:3e:70:24:92 brd ff:ff:ff:ff:ff:ff
21+
inet 9.186.100.2/24 brd 9.186.100.255 scope global qg-e76de35e-90
22+
valid_lft forever preferred_lft forever
23+
inet 9.186.100.129/32 brd 9.186.100.129 scope global qg-e76de35e-90
24+
valid_lft forever preferred_lft forever
25+
inet6 fe80::f816:3eff:fe70:2492/64 scope link
26+
valid_lft forever preferred_lft forever
27+
```
28+
可以看出,该名字空间中包括两个网络接口。
29+
30+
第一个接口 qr-694450d6-f6(10.0.0.1)跟 br-int 上的接口相连。即任何从 br-int 来的找 10.0.0.1 (租户的私有网段)的网包都会到达这个接口。
31+
32+
第一个接口 qg-e76de35e-90 连接到 br-ex 上的接口,即任何从外部来的网包,询问 9.186.100.2(默认的静态 NAT 外部地址)或 9.186.100.129(租户申请的 floating IP 地址),都会到达这个接口。
33+
34+
查看该名字空间中的路由表:
35+
```sh
36+
$ sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e ip route
37+
default via 9.186.100.1 dev qg-e76de35e-90
38+
9.186.100.0/24 dev qg-e76de35e-90 proto kernel scope link src 9.186.100.2
39+
10.0.0.0/24 dev qr-694450d6-f6 proto kernel scope link src 10.0.0.1
40+
```
41+
默认情况,以及访问外部网络的时候,休会从 qg-xxx 接口发出,经过 br-ex 发布到外网。
42+
43+
访问租户内网的时候,会从 qr-xxx 接口发出,发给 br-int。
44+
45+
```sh
46+
$ sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e iptables -t nat -S
47+
-P PREROUTING ACCEPT
48+
-P INPUT ACCEPT
49+
-P OUTPUT ACCEPT
50+
-P POSTROUTING ACCEPT
51+
-N neutron-postrouting-bottom
52+
-N neutron-vpn-agen-OUTPUT
53+
-N neutron-vpn-agen-POSTROUTING
54+
-N neutron-vpn-agen-PREROUTING
55+
-N neutron-vpn-agen-float-snat
56+
-N neutron-vpn-agen-snat
57+
-A PREROUTING -j neutron-vpn-agen-PREROUTING
58+
-A OUTPUT -j neutron-vpn-agen-OUTPUT
59+
-A POSTROUTING -j neutron-vpn-agen-POSTROUTING
60+
-A POSTROUTING -j neutron-postrouting-bottom
61+
-A neutron-postrouting-bottom -j neutron-vpn-agen-snat
62+
-A neutron-vpn-agen-OUTPUT -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
63+
-A neutron-vpn-agen-POSTROUTING ! -i qg-e76de35e-90 ! -o qg-e76de35e-90 -m conntrack ! --ctstate DNAT -j ACCEPT
64+
-A neutron-vpn-agen-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
65+
-A neutron-vpn-agen-PREROUTING -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
66+
-A neutron-vpn-agen-float-snat -s 10.0.0.2/32 -j SNAT --to-source 9.186.100.129
67+
-A neutron-vpn-agen-snat -j neutron-vpn-agen-float-snat
68+
-A neutron-vpn-agen-snat -s 10.0.0.0/24 -j SNAT --to-source 9.186.100.2
69+
```
70+
其中SNAT和DNAT规则完成外部 floating ip (9.186.100.129)到内部 ip(10.0.0.2) 的映射:
71+
```sh
72+
-A neutron-vpn-agen-OUTPUT -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
73+
-A neutron-vpn-agen-PREROUTING -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
74+
-A neutron-vpn-agen-float-snat -s 10.0.0.2/32 -j SNAT --to-source 9.186.100.129
75+
```
76+
77+
另外有一条SNAT规则把所有其他的内部IP出来的流量都映射到外部IP 9.186.100.2。这样即使在内部虚拟机没有外部IP的情况下,也可以发起对外网的访问。
78+
```
79+
-A neutron-vpn-agen-snat -s 10.0.0.0/24 -j SNAT --to-source 9.186.100.2
80+
```

vlan_mode/network_node.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ NXST_FLOW reply (xid=0x4):
5757
cookie=0x0, duration=608.373s, table=0, n_packets=23, n_bytes=1706, idle_age=65534, hard_age=65534, priority=2,in_port=5 actions=drop
5858
cookie=0x0, duration=675.373s, table=0, n_packets=58, n_bytes=10625, idle_age=24, hard_age=65534, priority=1 actions=NORMAL
5959
```
60-
1.4.2.2 br-int
60+
### br-int
6161
br-int上挂载了大量的agent来提供各种网络服务,另外负责对发往br-eth1的流量,实现local vlan转化为外部vlan。
6262
```sh
6363
#ovs-ofctl dump-flows br-int

vxlan_mode/README.md

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
# VXLAN 模式
2-
VXLAN 模式下,网络的架构跟 GRE 模式类似,所不同的是,不同节点之间通过 VXLAN 隧道互通。
2+
VXLAN 模式下,网络的架构跟 GRE 模式类似,所不同的是,不同节点之间通过 VXLAN 隧道互通,即虚拟化层是采用的 VXLAN 协议
33

4-
如下图所示
4+
基本结构如下图所示
55

66
![VXLAN 模式](../_images/vxlan.png)
7+
8+
9+
其中,节点网络配置如下所示,注意数据网络接口需要 IP 地址,因为是隧道协议需要底下的三层转发支持。
10+
11+
控制节点
12+
* eth0: 9.186.100.77/24 作为管理网络(同时也是公共网络)。
13+
* eth1: 10.0.100.77/24 作为数据网络接口。
14+
15+
计算节点
16+
* eth0: 9.186.100.88/24 作为管理网络(同时也是公共网络)。
17+
* eth1: 10.0.100.88/24 作为数据网络接口。

0 commit comments

Comments
 (0)