OpenShift中SDN核心知识点总结

OpenShift的三种SDN实现:
ovs-subnet:扁平网络,未实现租户之间的网络隔离,所有租户之间的pod都可以互访。使用ansible部署openshift默认模式。
ovs-multitenant:基于OVS和VxLAN等技术实现了项目(project)之间的网络隔离。
ovs-networkpolicy:默认和ovs-subnet一样,所有租户之间都没有网络隔离。但是管理员可以通过定义NetworkPolicy对象来精细地进行网络控制。

主要网络设备:
br0:OpenShift创建和管理的Open vSwitch网桥,它会使用OpenFlow规则来实现网络隔离和转发。
vethXXXXX:veth对,它负责将pod的网络命名空间连接到br0网桥。
tun0:一OVS内部端口,它会被分配本机的pod子网的网关IP地址,用于OpenShift pod以及Docker容器与集群外部的通信。iptables的NAT规则会作用于tun0。
docker0:Docker管理和使用的linux bridge网桥,通过veth对将不受OpenShift管理的Docker容器的网络地址空间连接到docker0上。
vovsbr/vlinuxbr:将docker0和br0连接起来的veth对,使得Docker容器能和OpenShift pod通信,以及通过tun0访问外部网络。
vxlan0:一OVS VXLAN隧道端点,用于集群内部pod之间的网络通信。

工作流程:
OpenShift使用运行在每个节点上的kubelet来负责pod的创建和管理,其中就包括网络配置部分。
kubelet调用docker client来创建容器,然后再调用docker api接口启动上一步中创建成功的容器。
kubelet创建infra容器,配置好该容器的网络,然后创建业务容器,再把业务容器的网络加到infra容器的网络命名空间。
kubelet使用CNI来创建和管理Pod网络(openshift在启动kubelet时传递的参数是--netowrk-plugin=cni)。
OpenShift实现了CNI插件(由/etc/cni/net.d/80-openshift-network.conf文件指定),其二进制文件是/opt/cni/bin/openshift-sdn。
因此,kubelet通过CNI接口来调用openshift sdn插件,然后具体做两部分事情:一是通过IPAM获取IP地址,二是设置OVS。
(其中,一是通过调用ovs-vsctl将infra容器的主机端虚拟网卡加入br0,二是调用ovs-ofctl命令来设置规则)

网络隔离(针对ovs-multitenant):
所有通过OVS端口进入OVS br0网桥的来自pod的网络包都会被打上对口对应的VNID标签。
OpenShfit默认的项目default的VNID(Virtual Network ID)为0,表明它是一个特权项目。
特权项目(VNID为0)可以发网络包到其它所有项目,也能接受其它所有项目的pod发来的网络包。
其它所有项目都会有一个非0的VNID。在OpenShift ovs-multitenant实现中,非0 VNID的项目之间的网络是不通的。
OVS网桥中的OpenFlow规则会阻止带有与目标端口上的VNID不同的网络包的投递(VNID 0除外)。这就保证了项目之间的网络流量是互相隔离的。

OVS中的OpenFlow流表根据网络包的目的地址将其分为四类来处理:
到本地pod的,直接在br0中转发。
到本集群pod的,经过br0后发到vxlan0,封装为vxlan udp包经物理网卡发到对方节点。
到本地不受OpenShift SDN管理的docker容器的,还未具体研究。
到集群外的,经过br0后发到tun0,经过iptables做SNAT,然后经物理网卡发出。

常用命令:
列出节点上的所有OVS网桥:ovs-vsctl list-br
查看OVS网桥信息:ovs-vsctl show br0
查看OVS网桥上的所有端口:ovs-vsctl list-ports br0
查看OVS流表:ovs-ofctl -O OpenFlow13 dump-flows br0
查看OVS端口详细信息(如端口标签):ovs-ofctl -O OpenFlow13 show br0
查询容器的IP地址:nsenter -t <容器的PID> -n ip a
查询容器对应的宿主机网卡:ip link | grep eth0@ifxxx
查看集群中所有项目对应的VNID:oc get netnamespaces
打通两个项目的网络(设置相同的VNID):oc adm pod-network join-projects --to=xxx xxx
分离两个项目的网络(设置不同的VNID):oc adm pod-network isolate-projects xxx xxx

关于OVS的流表解析:
https://medoc.readthedocs.io/en/latest/docs/ovs/sharing/cloud_usage.html
OpenShift网络之SDN:
https://www.cnblogs.com/sammyliu/p/10064450.html

posted @   wanghongwei-dev  阅读(305)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示