本文档介绍了 Kube-OVN 的整体架构、各组件的功能及其相互作用。
总体来说,Kube-OVN 作为 Kubernetes 与 OVN 之间的桥梁,结合了成熟的 SDN 与云原生技术。 这意味着 Kube-OVN 不仅实现了 Kubernetes 下的网络规范,如 CNI、Service 和 NetworkPolicy, 还将大量 SDN 领域的能力带入云原生环境,如逻辑交换机、逻辑路由器、VPC、 网关、QoS、ACL 以及流量镜像。
Kube-OVN 还保持良好的开放性,能够与多种技术方案集成,如 Cilium、Submariner、Prometheus、KubeVirt 等。
Kube-OVN 的组件大致可以分为三类:

此类组件来自 OVN/OVS 社区,针对 Kube-OVN 的使用场景进行了特定修改。 OVN/OVS 本身是一个成熟的用于管理虚拟机和容器的 SDN 系统, 我们强烈建议对 Kube-OVN 实现感兴趣的用户先阅读 ovn-architecture(7) 以了解 OVN 是什么以及如何与其集成。 Kube-OVN 使用 OVN 的 northbound 接口来创建和协调虚拟网络,并将网络概念映射到 Kubernetes 中。
所有与 OVN/OVS 相关的组件均已打包成镜像,准备在 Kubernetes 中运行。
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 以 DaemonSet 形式运行在每个节点上,Pod 内运行 openvswitch、ovsdb 和 ovn-controller。
这些组件作为 ovn-central 的智能体,将逻辑流表转换为真实的网络配置。
这部分是 Kube-OVN 的核心组件,作为 OVN 与 Kubernetes 之间的桥梁,连接两个系统并转换网络概念。 大部分核心功能都在这些组件中实现。
该组件负责将 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、网关、路由等)写入 Pod 的注解中,
该注解随后被 kube-ovn-cni 读取并用于配置本地网络。
该组件以 DaemonSet 形式运行在每个节点,实现 CNI 接口,操作本地 OVS 配置本地网络。
该 DaemonSet 会将 kube-ovn 二进制文件复制到每台机器,作为 kubelet 与 kube-ovn-cni 交互的工具。
该二进制文件会向 kube-ovn-cni 发送相应的 CNI 请求以进行后续操作。
默认情况下,该二进制文件会被复制到 /opt/cni/bin 目录。
kube-ovn-cni 会配置具体网络以执行相应的流量操作,
主要任务包括:
ovn-controller 和 vswitchd。ovn0 网卡以连接容器网络和主机网络。这些组件提供监控、诊断、运维工具和外部接口,以扩展 Kube-OVN 的核心网络能力, 并简化日常运维工作。
该组件以 DaemonSet 形式运行在特定标签的节点上,发布路由到外部, 允许外部通过 Pod IP 直接访问容器。
该组件以 DaemonSet 形式运行在每个节点,收集 OVS 状态信息、节点网络质量、网络延迟等。
该组件收集 OVN 状态信息及监控指标。
该组件是一个 kubectl 插件,可快速执行常用操作。