同vpc、subnet不同node的pod流量
同vpc子网不同node下pod在OVN逻辑层面:
在vpc逻辑路由器下,存在子网逻辑交换机,pod在该交换机下均有对应的逻辑端口,逻辑端口绑定信息中也记录着端口所在的节点chassis
,逻辑数据路径,逻辑端口编号等信息。以上信息在ovs中转化为对应流表。从而支持同vpc子网下pod的跨节点流量。
|
|
在ovs中可以过滤到该条规则,其中信息存在以下要点:
- cookie:为nginx-o-2 Port_Binding 的uuid前缀
- reg15:用于存储数据包的目标逻辑端口的 OFPort (OpenFlow Port) 编号。这个编号是在 OVN 的逻辑层面确定的。具体查看
tunnel_key
值 - metadata:OVN 用它来存储数据包当前所处的逻辑数据路径 (Logical Datapath) 的标识符 (ID)。这个 ID 唯一地标识了一个逻辑交换机 (Logical Switch) 或逻辑路由器 (Logical Router)。
|
|
💡排查流表Tips
1 2 3 4 5
# 1. 先查看隧道OVS物理端口编号 root@l1:/kube-ovn# ovs-ofctl show br-int | grep ovn- 2(ovn-1da489-0): addr:82:b6:65:de:f9:b9 # 2. 再筛选转发到目的端口的动作 ovs-ofctl dump-flows br-int | grep 'actions=.*output:2'
💡 OVN逻辑端口、OVS物理端口
在这个例子中,pod的逻辑端口号为3,而在对于节点中ovs-ofctl show br-int得到的对应端口号为7,为什么不一样呢?
在发送节点l1上:
- ovn-controller知道目标逻辑端口3在远程节点l2。
- 它生成 OVS 流表,匹配reg15=3,并将逻辑端口3编码到 Geneve 隧道元数据中,然后通过代表隧道的 OVS 物理端口(比如l1上的端口2)发送出去。
在接收节点l2上:
ovs-vswitchd收到 Geneve 包,解封装,并将隧道元数据(包含目标逻辑端口3)提供给 OVN 处理流程。
ovn-controller在l2上知道:OVN 逻辑端口3对应的是本地 OVS 接口baf0a678f203_h。
ovn-controller也知道:本地ovs-vswitchd给接口baf0a678f203_h分配的物理端口号是7。
因此,ovn-controller会生成 OVS 流表,在处理完该数据包的逻辑流程(如 ACL、负载均衡等)后,对于需要发送给逻辑端口3的包,最终执行的动作是output:7。
1 2
root@l2:/kube-ovn# ovs-ofctl dump-flows br-int | grep '0xf1b99dea' cookie=0xf1b99dea, duration=6354.389s, table=65, n_packets=66, n_bytes=5548, idle_age=2285, priority=100,reg15=0x3,metadata=0x8 actions=output:7
OVN Logical Port 是 OVN 用来思考和传递 “要去哪个 Pod” 的逻辑地址。
OVS Physical Port onl2 是l2节点上的 OVS 用来实际把包从br-int扔给对应 Pod 的物理网卡的本地门牌号
underlay 逻辑网络架构
|
|
在 OVN 的逻辑层面,localnet
类型的端口代表了一个 OVN 逻辑交换机(这里是u-subnet1
)与节点本地物理网络之间的连接点。它告诉 OVN:“属于u-subnet1这个逻辑网络的流量,如果要与外部物理网络交互,应该通过这个localnet
端口进出。”
指定物理网络连接:
- type:localnet: 表明这是一个连接到本地网络的特殊逻辑端口。
- tag: 10:它指示 OVN:
- 当
u-subnet1
逻辑交换机内的流量(例如来自 Pod172.17.0.3)需要通过localnet.u-subnet1
端口流向物理网络时,这些流量在离开 OVS (最终从ens192出去)时必须被打上VLAN Tag 10。 - 当带有VLAN Tag 10的流量从物理网络(通过ens192)进入 OVS时,应该被引导到
localnet.u-subnet1
端口,并进入u-subnet1逻辑交换机进行处理(此时 VLAN Tag 通常会被 OVS 剥离)。
- 当
- addresses: [“unknown”]: 对于
localnet
端口,通常设置为unknown,因为 OVN 不需要学习连接到物理网络侧的设备的 MAC 地址,这个任务由物理网络设备或 OVS 的 Provider Bridge (br-ens192) 的普通 L2 学习机制完成。
当nginx-u-d76c9fdff-8dhnr要访问 VLAN 10 中跨节点的另一个设备(nginx-u-2-686c945ddc-jb8kg)或外部网络:
- Pod 发包:Pod 发出数据包,通过 veth pair 进入l1节点的br-int。
- br-intOVN 逻辑处理:
- OVN 流表识别出数据包来自逻辑端口nginx-u-…,属于逻辑交换机u-subnet1(metadata可能被设置为u-subnet1的 Datapath ID)。
- OVN 进行 ACL 检查 (NetworkPolicy)。
- OVN 查找目标 MAC/IP。如果目标不在u-subnet1的已知 Pod 中(即需要发往物理网络),OVN 逻辑流表会决定将数据包导向u-subnet1的出口——逻辑端口localnet.u-subnet1。
- 通过patch口连接:
- ovn-controller将”发送到逻辑端口
localnet.u-subnet1
”这个逻辑动作,翻译为 OVS 物理动作:将数据包发送到patch-br-int-to-localnet.u-subnet1
这个 OVS 端口。
- ovn-controller将”发送到逻辑端口
- 进入br-ens192:数据包通过 patch link 到达br-ens192上的
patch-localnet.u-subnet1-to-br-int
端口。 - br-ens192处理与 VLAN Tagging:
- br-ens192收到来自 patch 口的数据包。因为它知道这个 patch 口与 OVN 中配置了tag: 10的localnet.u-subnet1相关联,所以br-ens192会将这个数据包视为属于 VLAN 10。
- br-ens192将数据包从物理端口ens192发出。因为ens192配置为 trunk 允许 VLAN 10,并且 OVS 知道这个包属于 VLAN 10,所以 OVS 会在发送前给数据包打上 VLAN 10 的 Tag。
- 物理网络传输: 带 VLAN Tag 10 的数据包在物理网络中传输。
💡 Underlay 和 Overlay 网络在 OVN/Kube-OVN 中处理方式的不同。
- overlay:VPC有对应的逻辑路由器,逻辑路由器上的端口记录着连接逻辑交换机(子网)的网段信息。
- underlay:只有逻辑交换机,Underlay 网络的核心设计是 Pod 直接使用底层物理网络的 IP,其默认网关和路由决策主要由外部物理网络设备(物理路由器)负责,而不是由 OVN 的逻辑路由器来处理。OVN 的角色更侧重于将 Pod 的 veth 接口正确地桥接到对应的物理网络(或 VLAN)上。