Openshift SDN 增加了2个bridge br0 和lbr0。 lbr0用做docker作为docker的网关;docker会自动根据lbr0的IP,给生成的容器分配地址。 br0是 openvswitch使用的brdige,openvswich 将使用vxlan协议与其他的minions 实现网络通信。 lbr0 与 br0之间定了Veth peer 网卡(voxbr,lilnuxbr)实现两个bridge间的消息转发。

下面关于vlan的解释可以有助于我们理解本次网络配置的意义。

802.1.q VLAN 协议的主要目的是从逻辑上隔离子网。现实世界中的 802.1.q 交换机存在多个 VLAN,每个 VLAN 拥有多个端口,同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离,所以其包含两层功能:交换与隔离。Linux VLAN device 实现的是隔离功能,没有交换功能。一个 VLAN 母设备不可能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。如果想让一个 VLAN 里接多个设备,就需要交换功能。在 Linux 里 Bridge 专门实现交换功能,因此将 VLAN 子设备 attach 到一个 Bridge 上就能完成后续的交换功能。总结起来,Bridge 加 VLAN device 能在功能层面完整模拟现实世界里的 802.1.q 交换机。
需要注意的是数据流的方向。对于一个被 attach 到 Bridge 上的设备来说,只有它收到数据时,此包数据才会被转发到 Bridge 上,进而完成查表广播等后续操作。当请求是发送类型时,数据是不会被转发到 Bridge 上的,它会寻找下一个发送出口。
VETH 设备的作用是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。
VETH 设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。该设备不能被用户程序直接操作,但使用起来比较简单。创建并配置正确后,向其一端输入数据,VETH 会改变数据的方向并将其送入内核网络核心,完成数据的注入。在另一端能读到此数据

Openshift SDN node 配置流程

从openshift-sdn-master获得所定义的IP 地址
controller.go:47] Self IP : 192.168.0.99
registry.go:195] unmashaling {"Minion":"192.168.0.99","Sub":"10.1.1.0/24"}
controller.go:175] Output of setup script: + echo 10.1.1.1 10.1.1.0/24 10.1.0.0/16

使用openvswitch 搭建 bridge br0
1) 添加 br0
ovs-vsctl add-br br0 -- set Bridge br0 fail-mode=secure
ovs-vsctl set bridge br0 protocols=OpenFlow13

2) 新建 VXLAN 设备,并添加到 br0
ovs-vsctl del-port br0 vxlan0
ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=flow

** 创建两块点对点(veth pear)虚拟网卡vlinuxbr、vovsbr,用于 br0与lbr0之间的通讯
ip link add vlinuxbr type veth peer name vovsbr
ip link set vlinuxbr up
ip link set vovsbr up
ip link set vlinuxbr txqueuelen 0
ip link set vovsbr txqueuelen 0

** br0与 vear peer 网卡关联**
3)vovsbr 添加至br0
ovs-vsctl add-port br0 vovsbr -- set Interface vovsbr ofport_request=9

搭建 bridge lbr0 最为 docker 容器的默认bridge
4) 新建openvswitch bridge lbr0,并配置地址
brctl addbr lbr0
ip addr add 10.1.1.1/24 dev lbr0?
ip link set lbr0 up

** lbr0与 vear peer 网卡关联**
5) 设置vlinuxbr, 添加到 openvswitch 的 bridge lbr0
brctl addif lbr0 vlinuxbr

添加路由表

6) 增加 IP 路由及iptables配置
ip route del 10.1.1.0/24 dev lbr0 proto kernel scope link src 10.1.1.1
ip route add 10.1.0.0/16 dev lbr0 proto kernel scope link src 10.1.1.1

iptables -t nat -D POSTROUTING -s 10.1.0.0/16 '!' -d 10.1.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 '!' -d 10.1.0.0/16 -j MASQUERADE
iptables -nvL INPUT --line-numbers
iptables -I INPUT 2 -p udp -m multiport --dports 4789 -m comment --comment '001 vxlan incoming' -j ACCEPT

重启服务及测试
7) 重启daemon
[[ -z --insecure-registry=0.0.0.0/0 -b=lbr0 --mtu=1450 --selinux-enabled ]]
grep -q '^OPTIONS='\''--insecure-registry=0.0.0.0/0 -b=lbr0 --mtu=1450 --selinux-enabled'\''' /etc/sysconfig/docker
systemctl daemon-reload
systemctl restart docker.service

8) 启动一个pods,生成的容器会衍生一个vxlan网卡vethc2d198a, 我们看到它的mac与lbr0 是一致的

Openshift SDN node 内容展示
1) 网络设备配置
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:6e:88:e7 brd ff:ff:ff:ff:ff:ff
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
link/ether 32:40:11:48:05:e2 brd ff:ff:ff:ff:ff:ff
11: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
link/ether da:7b:18:0c:a0:4a brd ff:ff:ff:ff:ff:ff
12: vovsbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP mode DEFAULT
link/ether fe:10:ca:03:37:8c brd ff:ff:ff:ff:ff:ff
13: vlinuxbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master lbr0 state UP mode DEFAULT
link/ether 76:00:89:55:31:97 brd ff:ff:ff:ff:ff:ff
14: lbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT
link/ether 4a:e9:51:ff:10:f8 brd ff:ff:ff:ff:ff:ff
26: vethc2d198a: <BROADCAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast master lbr0 state UP mode DEFAULT qlen 1000
link/ether 4a:e9:51:ff:10:f8 brd ff:ff:ff:ff:ff:ff

2) openvswitch 设置
ovs-dpctl show
system@ovs-system:
lookups: hit:57 missed:48 lost:0
flows: 0
masks: hit:82 total:0 hit/pkt:0.78
port 0: ovs-system (internal)
port 1: br0 (internal)
port 2: vxlan_sys_4789 (vxlan: df_default=false, ttl=0)
port 3: vovsbr

ovs-vsctl show
5d575f12-46db-428f-b9b4-55dd15c04a7a
Bridge "br0"
fail_mode: secure
Port vovsbr
Interface vovsbr
Port "vxlan0"
Interface "vxlan0"
type: vxlan
options: {key=flow, remote_ip=flow}
Port "br0"
Interface "br0"
type: internal
ovs_version: "2.3.1-git3282e51"

3) bridge 设置
brctl show
bridge name bridge id STP enabled interfaces
lbr0 8000.4ae951ff10f8 no vethc2d198a
vlinuxbr

VxLan简介: http://blog.csdn.net/freezgw1985/article/details/16354897

抽象网络设备:http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/