了解 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/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-nbovn-sbovn-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 内运行 openvswitchovsdbovn-controller。 这些组件作为 ovn-central 的智能体,将逻辑流表转换为真实的网络配置。

资源限制

在大型集群中,ovs-ovn DaemonSet 中的 openvswitch 容器可能会超出其默认资源限制:

  • 内存压力 — 容器会被 OOMKilled,Pod 重启(退出码 137)。
  • CPU 压力 — 在 Pod 创建/删除突发、较大的逻辑流更新或高包速率等高负载情况下,容器可能触及其 CPU 限制。ovn-controllerovs-vswitchd 会被限流——Pod 不会被杀死,但 CPU 资源不足可能导致偶发丢包(数据平面无法跟上),同时 Pod 网络启动变慢、转发延迟增加。

当出现上述任一情况时,请提高相关限制:

kubectl edit ds ovs-ovn -n kube-system

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、SubnetVlanProviderNetwork

以 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 二进制文件复制到每台机器上,作为 kubeletkube-ovn-cni 之间交互的工具。 该二进制文件会将对应的 CNI 请求发送给 kube-ovn-cni 进行后续操作。 默认情况下,该二进制文件会被复制到 /opt/cni/bin 目录。

kube-ovn-cni 会配置特定网络以执行相应的流量操作,主要任务包括:

  1. 配置 ovn-controllervswitchd
  2. 处理 CNI Add/Del 请求:
    1. 创建或删除 veth pair,并绑定或解绑到 OVS 端口。
    2. 配置 OVS 端口。
    3. 更新主机 iptables/ipset/route 规则。
  3. 动态更新网络 QoS。
  4. 创建并配置 ovn0 NIC,以连接容器网络和主机网络。
  5. 配置主机 NIC,以实现 Vlan/Underlay/EIP。
  6. 动态配置集群间网关。

监控、运维工具和扩展组件

这些组件提供监控、诊断、运维工具和外部接口,用于扩展 Kube-OVN 的核心网络能力并简化日常运维。

kube-ovn-speaker

该组件是一个运行在带有特定标签节点上的 DaemonSet,用于向外部发布路由,使外部可以通过 Pod IP 直接访问容器。有关部署和 BGP 选项,请参见 Configure BGP

kube-ovn-pinger

该组件是一个运行在每个节点上的 DaemonSet,用于收集 OVS 状态信息、节点网络质量、网络延迟等。

kube-ovn-monitor

该组件用于收集 OVN 状态信息和监控指标。

kubectl-ko

该组件是一个 kubectl 插件,可快速执行常见操作。