了解 Kube-OVN CNI
Kube-OVN 提供了连接 Kubernetes 网络与 OVN 的 CNI 架构、组件和交互。
总体而言,Kube-OVN 充当 Kubernetes 与 OVN 之间的桥梁,将成熟的 SDN 与 Cloud Native 结合起来。 这意味着 Kube-OVN 不仅实现了 Kubernetes 下的网络规范,例如 CNI、Service 和 Networkpolicy, 还将大量 SDN 领域的能力带入云原生,例如逻辑交换机、逻辑路由器、VPC、网关、QoS、ACL 和流量镜像。
Kube-OVN 也保持了良好的开放性,可与许多技术方案集成,例如 Cilium、Submariner、Prometheus、KubeVirt 等。
Kube-OVN 的组件大致可分为三类。
- 上游 OVN/OVS 组件。
- 核心 Controller 和智能体。
- 监控、运维工具和扩展组件。

目录
上游 OVN/OVS 组件ovn-centralovs-ovn核心 Controller 和智能体kube-ovn-controllerkube-ovn-cni监控、运维工具和扩展组件kube-ovn-speakerkube-ovn-pingerkube-ovn-monitorkubectl-ko上游 OVN/OVS 组件
这类组件来自 OVN/OVS Community,并针对 Kube-OVN 的使用场景做了特定修改。 OVN/OVS 本身是一个成熟的 SDN 系统,用于管理虚拟机和容器, 我们强烈建议对 Kube-OVN 实现感兴趣的用户先阅读 ovn-architecture(7), 以了解 OVN 是什么以及如何与之集成。 Kube-OVN 使用 OVN 的 northbound 接口来创建和协调虚拟网络,并将网络概念映射到 Kubernetes 中。
所有与 OVN/OVS 相关的组件都已打包为镜像,可直接在 Kubernetes 中运行。
ovn-central
ovn-central Deployment 运行 OVN 的控制平面组件,包括 ovn-nb、ovn-sb 和 ovn-northd。
ovn-nb:保存虚拟网络配置,并提供虚拟网络管理 API。kube-ovn-controller主要会与ovn-nb交互以配置虚拟网络。ovn-sb:保存由ovn-nb的逻辑网络生成的逻辑流表,以及每个节点的实际物理网络状态。ovn-northd:将ovn-nb的虚拟网络转换为ovn-sb中的逻辑流表。
多个 ovn-central 实例会通过 Raft 协议同步数据,以确保高可用。
ovs-ovn
ovs-ovn 以 DaemonSet 形式运行在每个节点上,Pod 内运行 openvswitch、ovsdb 和 ovn-controller。
这些组件作为 ovn-central 的智能体,将逻辑流表转换为真实的网络配置。
在大型集群中,ovs-ovn DaemonSet 中的 openvswitch 容器可能会超出其默认资源限制:
- 内存压力 — 容器会被
OOMKilled,Pod 重启(退出码 137)。 - CPU 压力 — 在 Pod 创建/删除突发、较大的逻辑流更新或高包速率等高负载情况下,容器可能触及其 CPU 限制。
ovn-controller和ovs-vswitchd会被限流——Pod 不会被杀死,但 CPU 资源不足可能导致偶发丢包(数据平面无法跟上),同时 Pod 网络启动变慢、转发延迟增加。
当出现上述任一情况时,请提高相关限制:
在 openvswitch 容器的 resources 配置块中,提高 limits.memory / limits.cpu(以及对应的 requests)。对于长期运行的集群,请在 kube-ovn Helm values 中的 ovs-ovn.resources 下设置相同的值,以便升级后仍然保留这些更改。
核心 Controller 和智能体
这部分是 Kube-OVN 的核心组件,作为 OVN 与 Kubernetes 之间的桥梁,连接两个系统并在其间转换网络概念。 大多数核心功能都由这些组件实现。
kube-ovn-controller
该组件负责将 Kubernetes 中的所有资源转换为 OVN 资源,并作为整个 Kube-OVN 系统的控制平面。
kube-ovn-controller 会监听所有与网络功能相关的资源事件,并根据资源变化更新 OVN 中的逻辑网络。主要监听的资源包括:
Pod、Service、Endpoint、Node、NetworkPolicy、VPC、Subnet、Vlan、ProviderNetwork。
以 Pod 事件为例,kube-ovn-controller 会监听 Pod 创建事件,通过内置的内存型 IPAM 功能分配地址,
并调用 ovn-central 创建逻辑端口、静态路由以及可能的 ACL 规则。
接下来,kube-ovn-controller 会将分配的地址以及 CIDR、gateway、route 等 subnet 信息写入 Pod 的注解。
随后,kube-ovn-cni 会读取该注解,并据此配置本地网络。
kube-ovn-cni
该组件以 DaemonSet 形式运行在每个节点上,实现 CNI 接口,并操作本地 OVS 以配置本地网络。
这个 DaemonSet 会将 kube-ovn 二进制文件复制到每台机器上,作为 kubelet 与 kube-ovn-cni 之间交互的工具。
该二进制文件会将对应的 CNI 请求发送给 kube-ovn-cni 进行后续操作。
默认情况下,该二进制文件会被复制到 /opt/cni/bin 目录。
kube-ovn-cni 会配置特定网络以执行相应的流量操作,主要任务包括:
- 配置
ovn-controller和vswitchd。 - 处理 CNI Add/Del 请求:
- 创建或删除 veth pair,并绑定或解绑到 OVS 端口。
- 配置 OVS 端口。
- 更新主机 iptables/ipset/route 规则。
- 动态更新网络 QoS。
- 创建并配置
ovn0NIC,以连接容器网络和主机网络。 - 配置主机 NIC,以实现 Vlan/Underlay/EIP。
- 动态配置集群间网关。
监控、运维工具和扩展组件
这些组件提供监控、诊断、运维工具和外部接口,用于扩展 Kube-OVN 的核心网络能力并简化日常运维。
kube-ovn-speaker
该组件是一个运行在带有特定标签节点上的 DaemonSet,用于向外部发布路由,使外部可以通过 Pod IP 直接访问容器。有关部署和 BGP 选项,请参见 Configure BGP。
kube-ovn-pinger
该组件是一个运行在每个节点上的 DaemonSet,用于收集 OVS 状态信息、节点网络质量、网络延迟等。
kube-ovn-monitor
该组件用于收集 OVN 状态信息和监控指标。
kubectl-ko
该组件是一个 kubectl 插件,可快速执行常见操作。