4、端口管理:添加端口到网桥、删除端口、查看端口状态、端口类型(Internal, Patch, Tunnel)
端口管理这块,说白了就是网桥的「手脚」怎么接、怎么拆、怎么查。我刚开始玩 OVS 的时候,觉得端口不就是加加减减嘛,后来踩过坑才明白——端口类型选不对,整个网络拓扑都得崩。今天咱们就把这块掰开揉碎了讲。
4.1 添加端口到网桥
添加端口,最常用的命令就是 ovs-vsctl add-port。我个人习惯先确认网桥存在,再加端口,免得报错。
# 添加一个普通端口(物理网卡)
ovs-vsctl add-port br0 eth0
# 添加时指定端口类型
ovs-vsctl add-port br0 myport -- set Interface myport type=internal
# 添加时带 VLAN tag
ovs-vsctl add-port br0 eth0 tag=100
这里有个细节:如果你加的是物理网卡,比如 eth0,那这块网卡就不能再配 IP 了。为什么?因为 OVS 接管了它的数据面。我曾经在线上环境犯过这个错——加完端口发现 SSH 断了,吓得我赶紧跑机房。
ovs-vsctl list port 看一眼,确认端口确实挂上去了。我每次加完端口都会跑一遍这个命令,心里踏实。
4.2 删除端口
删除端口比添加简单,但要注意——删了就没了,别手滑。
# 删除端口
ovs-vsctl del-port br0 eth0
# 或者直接指定端口名(不指定网桥也行)
ovs-vsctl del-port eth0
嗯,这里有个坑:如果你删的是 Internal 端口,那这个端口对应的虚拟网卡也会消失。我之前有个同事,删端口的时候没注意,把管理用的 Internal 端口给删了,结果整个控制面都连不上了。所以我的建议是——删之前先 ovs-vsctl show 看清楚。
ovs-ofctl dump-ports br0 查看端口流量统计,如果 rx/tx 字节数还在增长,说明有流量,别急着删。
4.3 查看端口状态
查看端口状态,我一般用三个命令,各有各的用处:
| 命令 | 作用 | 我常用的场景 |
|---|---|---|
ovs-vsctl show |
查看网桥和端口概览 | 快速确认拓扑结构 |
ovs-vsctl list port |
查看端口详细配置 | 查 VLAN tag、trunk 配置 |
ovs-ofctl dump-ports br0 |
查看端口实时流量统计 | 排查丢包、流量异常 |
# 查看所有端口
ovs-vsctl list port
# 查看某个具体端口
ovs-vsctl list port eth0
# 查看端口流量统计
ovs-ofctl dump-ports br0
你想想看,如果端口状态是 down,那多半是物理链路有问题,或者对端设备没起来。我遇到过最奇葩的一次——端口状态一直 up,但就是不通,查了半天发现是网线松了。嗯,硬件问题有时候比软件还难搞。
4.4 端口类型详解
端口类型这块,是 OVS 的核心概念之一。说白了,不同类型的端口,干的活不一样。我按实际使用频率来介绍:
4.4.1 Internal 端口
Internal 端口,就是 OVS 内部创建的虚拟网卡。它跟物理网卡长得一样,可以配 IP、可以当网关。我最常用的场景就是给网桥配管理 IP:
# 创建 Internal 端口
ovs-vsctl add-port br0 mgmt -- set Interface mgmt type=internal
# 配 IP
ip addr add 192.168.1.10/24 dev mgmt
ip link set mgmt up
我记得有一次做 OpenStack 集成,控制节点和计算节点之间通信全靠 Internal 端口。当时有个 bug,Internal 端口老是丢包,查到最后发现是 MTU 不匹配。所以我的建议是——Internal 端口的 MTU 一定要跟物理链路保持一致。
4.4.2 Patch 端口
Patch 端口,说白了就是一根「虚拟网线」,用来连接两个网桥。我经常用它来做多网桥之间的流量转发:
# 创建一对 Patch 端口
ovs-vsctl add-port br0 patch0 -- set Interface patch0 type=patch options:peer=patch1
ovs-vsctl add-port br1 patch1 -- set Interface patch1 type=patch options:peer=patch0
这里要注意:Patch 端口必须成对出现,而且 peer 名字要写对。我曾经手抖写错了 peer 名,结果两个网桥之间死活不通,查了半天才发现是名字拼错了。你想想看,这种低级错误多冤啊。
vlan_mode 或者流表来处理。我一般用流表做,更灵活。
4.4.3 Tunnel 端口
Tunnel 端口,就是用来做 overlay 网络的。VXLAN、GRE、Geneve 这些隧道协议,都得靠它。我部署 SDN 的时候,Tunnel 端口是标配:
# 创建 VXLAN 隧道端口
ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=192.168.100.2 options:key=100
# 创建 GRE 隧道端口
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.100.3 options:key=200
嗯,这里有个关键点:Tunnel 端口的 remote_ip 一定要能通。我遇到过最头疼的问题——隧道建起来了,但流量就是过不去,最后发现是底层网络 MTU 太小,VXLAN 包被分片了。所以我的习惯是,建隧道之前先 ping 一下对端,确认 MTU 没问题。
4.5 实战经验总结
说了这么多,我总结几条实战经验:
- 加端口前先确认网桥存在——别问我为什么,问就是吃过亏。
- 删端口前看流量统计——流量还在跑就别手贱。
- Internal 端口当管理口用——别把它当普通数据口,性能有限。
- Patch 端口成对创建——少一个都不行,peer 名别写错。
- Tunnel 端口注意 MTU——这是最容易出问题的地方,没有之一。
端口管理这块,说白了就是细心活。你只要记住每个端口类型是干什么的,加加减减的时候多看一眼,基本不会出大问题。好了,下一章咱们聊聊流表——那才是 OVS 真正牛逼的地方。