kube-ovn创建vpc时控制面和数据面工作梳理

3 阅读3分钟

Kube-OVN:VPC 创建流程排查清单

在 Kube-OVN 中,创建 VPC 本质是创建一个独立的 OVN 逻辑路由器,并完成从 Kubernetes CRD 到 OVN 逻辑网络、再到节点 OVS 数据面的全链路配置。下面按控制面数据面分别拆解完整流程。


一、控制面工作(kube-ovn-controller + OVN 控制面)

控制面负责将 Vpc CRD 翻译为 OVN 逻辑网络对象,并持久化、下发流表规则。

1. Kubernetes API 层

  • 用户通过 kubectl apply -f vpc.yaml 创建 Vpc CRD 对象(apiVersion: kubeovn.io/v1)。
  • kube-apiserver 验证并将 VPC 资源存入 etcd

2. kube-ovn-controller 核心处理

kube-ovn-controller 是 Kube-OVN 控制面核心,监听 Vpc 事件并执行:

  1. 监听与触发

    1. Watch Vpc CRD 的 Add 事件,进入 handleAddOrUpdateVpc 逻辑。
  2. 创建 OVN 逻辑路由器(核心映射)

    1. 调用 ovn-nbctlOVN Northbound DB (ovnnb) 中创建逻辑路由器(Logical Router) ,名称与 VPC 一致(如 test-vpc-1)。
    2. 每个 VPC 独占一个逻辑路由器,实现租户级网络隔离
  3. 配置 VPC 路由与属性

    1. Vpc.spec.staticRoutes 存在,将静态路由添加到该逻辑路由器。
    2. 配置 VPC 关联的 Namespace 绑定(spec.namespaces),后续该 Namespace 下的 Subnet/Pod 默认归属此 VPC。
    3. 处理 enableExternalextraExternalSubnets 等出网配置,关联外部网络。
  4. 状态同步

    1. 将逻辑路由器 ID、状态等信息回写到 Vpc CRD 的 status 字段。

3. OVN Northd 与 Southbound DB

  • ovn-northd 监听 ovnnb 变更,将逻辑路由器/路由规则编译为逻辑流表(Logical Flows) ,写入 OVN Southbound DB (ovnsb)
  • ovnsb 存储全集群逻辑网络拓扑与流表,供各节点 ovn-controller 消费。

二、数据面工作(ovn-controller + OVS + 节点网络)

数据面负责将控制面的逻辑配置,转化为节点上 OVS 的真实流表与转发规则,实现流量隔离与转发。

1. 节点 ovn-controller 拉取与翻译

  • 每个节点的 ovn-controllerovnsb 拉取该 VPC 对应的逻辑流表
  • 将逻辑流表翻译为OpenFlow 规则,下发到本地 ovs-vswitchd

2. OVS 数据面配置(关键隔离机制)

  1. Datapath 隔离

    1. 每个 VPC 对应独立的 Datapath ID,不同 VPC 流量通过不同 Datapath 区分,实现地址空间重叠不冲突
  2. 逻辑端口与隧道

    1. 为该逻辑路由器创建路由器端口(Logical Router Port) ,用于连接后续 Subnet(逻辑交换机)。
    2. 配置节点间隧道(Geneve/VXLAN),不同 VPC 流量走独立隧道封装,跨节点转发时携带 Datapath ID 标识。
  3. 流表下发

    1. 在 OVS 中下发:

      • 入方向:匹配 VPC 标识,将流量导入对应 Datapath。
      • 转发:按逻辑路由器路由规则执行三层转发。
      • 出方向:封装隧道头,跨节点转发。
    2. 确保不同 VPC 流量完全隔离,无默认互通路径。

3. 节点本地网络配置

  • kube-ovn-cni 配合 ovs-vswitchd,在节点上创建对应 OVS 网桥与端口,绑定到 VPC 所属 Datapath。
  • 后续在该 VPC 下创建 Subnet/Pod 时,直接复用此 VPC 的逻辑路由器与 Datapath 上下文。

三、完整流程总览(一句话总结)

  1. 用户创建 Vpc CRD → 2. kube-ovn-controller 在 OVN NB 创建逻辑路由器并配置路由 → 3. ovn-northd 生成逻辑流表写入 SB → 4. 各节点 ovn-controller 翻译为 OpenFlow 规则 → 5. OVS 按 Datapath ID 实现 VPC 流量隔离与转发。