EVE环境模拟搭建一个基于主机VTEP的VXLAN数据中心网络。
实验里vtep是在linux主机上,同时linux主机还得有路由功能使VTEP的端点IP可达,所以两台linux服务器需要安装FRR。
数据转发平面使用VXLAN封装;在控制平面我打算选择使用EVPN和OVN两种不同方式实现。
这次实验控制平面使用了OVN,控制平面使用EVPN的实验可以参见链接:VXLAN 主机VTEP(EVPN)。
拓扑图
Spine、Leaf、服务器之间配置OSPF,完成Underlay路由可达;
Linux5 OVN Central;
Linux6和Linux7作为Controller,同时使用namespace模拟租户虚机。
本来我是打算用Lo接口设置为vtep的端点IP,这样服务器双上联任意断掉一条vxlan隧道都不受影响,但是不知道哪的问题设置总是不生效。只能“曲线救国”,将服务器两个接口做了桥接并在网桥上配置了IP,这样也可以达到双上联冗余的效果。
安装frr
服务器与leaf之间配置OSPF构建Underlay网络,所以三台服务器都需要按照FRR。
curl -O https://rpm.frrouting.org/repo/frr-7-repo-1-0.el7.noarch.rpm
yum install frr-7-repo-1-0.el7.noarch.rpm -y
yum install frr frr-pythontools -y
sed -i “s/=no/=yes/g” /etc/frr/daemons
cat /etc/frr/daemons,路由协议功能全部打开
systemctl enable frr && systemctl start frr && systemctl status frr
linux 主机上都安装好frr后就可以配置路由协议了。
配置Underlay路由
交换机的Underlay路由配置大同小异,只例举一下leaf3即可。
Leaf3
interface Ethernet1
no switchport
ip address 172.16.0.3/31
!
interface Ethernet2
no switchport
ip address 172.16.6.3/24
!
interface Loopback0
ip address 10.0.0.3/32
!
ip routing
!
router ospf 1
network 10.0.0.3/32 area 0.0.0.0
network 172.16.0.2/31 area 0.0.0.0
network 172.16.6.0/24 area 0.0.0.0
max-lsa 12000
Linux5
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ip link set eth0 promisc on #这种组网方式接口需要打开混杂模式
ip link set eth1 promisc on
ip add add 172.16.5.2/24 dev br0 # 服务IP
Linux6 同样方式配置Linux7
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ip link set eth0 promisc on
ip link set eth1 promisc on
ip add add 172.16.6.2/24 dev br0 #vtep 源IP
vtysh #进入frr 配置ospf
router ospf
network 172.16.6.0/24 area 0
hv6# show ip ospf neighbor #Linux6、Leaf3、Leaf6的OSPF 邻居FULL。
Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
10.0.0.3 1 Full/DROther 31.459s 172.16.6.3 br0:172.16.6.2 0 0 0
10.0.0.66 1 Full/DR 38.699s 172.16.6.6 br0:172.16.6.2 0 0 0
Underlay路由配置完成后,Linux6到Linux7(172.16.7.2),到Linux5(172.16.5.1)都是两条等价路由,可以做到冗余+负载。Linux5、7同样
[root@hv6 ~]# ip route
172.16.5.0/24 proto 188 metric 20
nexthop via 172.16.6.3 dev br0 weight 1
nexthop via 172.16.6.6 dev br0 weight 1
172.16.7.0/24 proto 188 metric 20
nexthop via 172.16.6.3 dev br0 weight 1
nexthop via 172.16.6.6 dev br0 weight 1
…
配置OVN
详细OVN组件安装和配置可以参见链接:OVN配置
Central
Linux5:
ovn-nbctl set-connection ptcp:6641:172.16.5.1 #br0的IP
ovn-sbctl set-connection ptcp:6642:172.16.5.1 #br0的IP
ovn-nbctl ls-add ls1
ovn-nbctl lsp-add ls1 ls1-node1-ns1
ovn-nbctl lsp-set-addresses ls1-node1-ns1 00:00:00:00:00:01
ovn-nbctl lsp-set-port-security ls1-node1-ns1 00:00:00:00:00:01
ovn-nbctl lsp-add ls1 ls1-node2-ns1
ovn-nbctl lsp-set-addresses ls1-node2-ns1 00:00:00:00:00:02
ovn-nbctl lsp-set-port-security ls1-node2-ns1 00:00:00:00:00:02
Controller
Linux6:
ovs-vsctl set open . external-ids:ovn-remote=tcp:172.16.5.1:6642
ovs-vsctl set open . external-ids:ovn-encap-type=vxlan
ovs-vsctl set open . external-ids:ovn-encap-ip=172.16.6.2 #br0 IP 封装外层包
Linux7:
ovs-vsctl set open . external-ids:ovn-remote=tcp:172.16.5.1:6642
ovs-vsctl set open . external-ids:ovn-encap-type=vxlan
ovs-vsctl set open . external-ids:ovn-encap-ip=172.16.7.2 #br0 IP 封装外层包
在服务器上配置ns模拟租户虚机
Linux6:
ip netns add ns1
ip link add veth11 type veth peer name veth12
ip link set veth12 netns ns1
ip link set veth11 up
ip netns exec ns1 ip link set veth12 address 00:00:00:00:00:01
ip netns exec ns1 ip link set veth12 up
ovs-vsctl add-port br-int veth11
ip netns exec ns1 ip addr add 192.168.1.10/24 dev veth12
ovs-vsctl set interface veth11 external_ids:iface-id=ls1-node1-ns1
Linux7
ip netns add ns1
ip link add veth11 type veth peer name veth12
ip link set veth12 netns ns1
ip link set veth11 up
ip netns exec ns1 ip link set veth12 address 00:00:00:00:00:02
ip netns exec ns1 ip link set veth12 up
ovs-vsctl add-port br-int veth11
ip netns exec ns1 ip addr add 192.168.1.20/24 dev veth12
ovs-vsctl set interface veth11 external_ids:iface-id=ls1-node2-ns1
验证
Central 北向、南向数据库
[root@central ~]# ovn-nbctl show
switch 138fdb3b-3c6b-4727-afd5-7072810a6042 (ls1)
port ls1-node2-ns1
addresses: [“00:00:00:00:00:02”]
port ls1-node1-ns1
addresses: [“00:00:00:00:00:01”]
[root@central ~]# ovn-sbctl show
Chassis “4aba04df-085f-440c-aebb-b31b76e39325”
hostname: “hv7”
Encap vxlan
ip: “172.16.7.2”
options: {csum=“true”}
Port_Binding “ls1-node2-ns1”
Chassis “0271f35d-ea73-497a-9389-3a7415c434da”
hostname: “hv6”
Encap vxlan
ip: “172.16.6.2”
options: {csum=“true”}
Port_Binding “ls1-node1-ns1”
**Controller **
[root@hv6 ~]# ovs-vsctl show
62a36857-32d3-47ce-98b6-740d8f395090
Bridge br-int
fail_mode: secure
Port br-int
Interface br-int
type: internal
Port “ovn-4aba04-0”
Interface “ovn-4aba04-0”
type: vxlan
options: {csum=“true”, key=flow, remote_ip=“172.16.7.2”}
Port “veth11”
Interface “veth11”
ovs_version: “2.7.2”
租户间可以ping通
[root@hv6 ~]# ip netns exec ns1 ping 192.168.1.20
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=35.8 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=30.7 ms
64 bytes from 192.168.1.20: icmp_seq=3 ttl=64 time=24.9 ms