概述
Kube-OVN 作为一个基于 OVN(Open Virtual Network)的 Kubernetes 网络插件,将成熟的 SDN 技术与云原生环境相结合,为 KubeVirt 虚拟机提供了丰富的网络功能和灵活的配置选项。
1. 工作原理
1.1 网络模型
Kube-OVN 支持多种网络模型:
- Overlay 模式:使用 Geneve/Vxlan/STT 隧道封装,适用于跨网络部署
- Underlay 模式:直接使用物理网络,无需封装,适用于高性能场景
- Vlan 模式:使用 VLAN 标签隔离网络,适用于与现有网络集成
- VPC 模式:提供多租户网络隔离,适用于多租户环境
1.2 数据流路径
1.2.1 同节点 Pod 通信
- Pod1 发送数据包到 Pod2
- 数据包通过 veth pair 进入 OVS
- OVS 根据流表规则在本地转发到 Pod2
- 数据包通过 veth pair 进入 Pod2
1.2.2 跨节点 Pod 通信(Overlay 模式)
- Pod1 发送数据包到 Pod2(位于不同节点)
- 数据包通过 veth pair 进入 Node1 的 OVS
- OVS 根据流表规则封装数据包(Geneve/Vxlan/STT)
- 封装后的数据包通过物理网络发送到 Node2
- Node2 的 OVS 解封装数据包
- 数据包通过 veth pair 进入 Pod2
1.2.3 Pod 访问外部网络
分布式网关模式:
- Pod 发送数据包到外部
- 数据包通过 veth pair 进入本节点 OVS
- OVS 将数据包发送到本节点的网关接口
- 网关接口通过 NAT 将数据包发送到外部网络
集中式网关模式:
- Pod 发送数据包到外部
- 数据包通过 veth pair 进入本节点 OVS
- OVS 将数据包封装并发送到网关节点
- 网关节点解封装并通过 NAT 将数据包发送到外部网络
1.3 控制平面和数据平面交互
控制平面流程:
- Kubernetes API 服务器接收资源变更
- kube-ovn-controller 监听资源变更
- kube-ovn-controller 调用 ovn-nb API 更新网络配置
- ovn-northd 将配置转换为逻辑流表
- ovn-sb 存储逻辑流表
数据平面流程:
- ovn-controller 从 ovn-sb 获取逻辑流表
- ovn-controller 将逻辑流表转换为 OVS 流表
- OVS 根据流表规则转发数据包
- kube-ovn-cni 配置本地网络(veth pair、OVS 端口等)
2. KubeVirt 场景下的功能实现与应用
2.1 子网管理功能
在 KubeVirt 场景下,Kube-OVN 通过自定义资源 Subnet 实现子网管理,为虚拟机提供网络隔离和地址管理。
配置示例:
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: vm-subnet
spec:
cidr: 10.16.0.0/16
gateway: 10.16.0.1
protocol: IPv4
excludeIps:
- 10.16.0.1..10.16.0.10
namespaces:
- kubevirt-vm-ns
gatewayType: distributed
natOutgoing: true
private: false
应用场景:
- 虚拟机与容器网络隔离
- 多租户虚拟机环境
2.2 静态 IP 分配功能
Kube-OVN 支持为 KubeVirt 虚拟机分配静态 IP,确保虚拟机重启后 IP 地址不变。
配置示例:
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: static-ip-vm
namespace: kubevirt