本文分享自华为云社区《
KubeEdge EdgeMesh v1.15 边缘CNI特性原理及功能详解
》,作者:达益鑫 |南开大学,刘家伟、吴锟 |DaoCloud,王杰章 |华为云

特性研发背景以及原理

KubeEdge EdgeMesh 边缘 CNI 特性针对于边缘容器网络复杂异构环境提供与云上一致的容器网络体验,包括:

1. 云边统一的容器网络资源管理分配

2.基于分布式中继及穿透能力的 PodIP 级别跨子网流量转发服务

cke_114.png

特性开发背景

EdgeMesh 致力于研究和解决边缘计算场景下网络连通、服务协同、流量治理等相关的一系列问题,其中在异构复杂的边缘网络环境内,不同物理区域的容器在面对动态变迁的网络环境以及短生命周期且跳跃变迁的服务位置,一部分服务可能需要使用 PodIP 进行跨网段通信,而主流的 CNI 方案主要针对于云上稳定且集成式的网络环境,并不支持跨子网流量的转发,致使这些 CNI 方案并不能够很好地适应边缘复杂异构的环境,最终导致容器即便在同一个集群内却没有享用一个平面的网络通信服务。

针对这个需求,EdgeMesh 进行逐步的优化。首先实现的是网络底层的中继以及穿透服务功能开发,即 EdgeMesh 高可用特性。在分布式网络场景当中,该特性能够为节点提供基于 Service 的中继流量以及网络穿透服务,但还没有完全支持对 PodIP 层次流量的转发和穿透能力。换句话说在云边混合的场景当中 ,EdgeMesh 能够为跨网段的 Service 流量提供穿透服务,但并没有涉足到容器网络的资源管理和 IP 层的连通性功能,仍旧依赖于集群原本的 CNI 方案。

这个局限性导致 EdgeMesh 无法为更加底层的网络 IP 流量提供服务,意味着 EdgeMesh 并不能够完全覆盖混合云边的场景需求,对于那些需要穿透和中继服务的 PodIP 流量,老版本的 EdgeMesh 爱莫能助。

那么为什么主流的 CNI 方案无法兼容边缘环境,EdgeMesh 又是如何理解这个需求的呢?

关键问题在于主流的 CNI 方案大多建立于至少三层可通的环境要求之下,具体来说 CNI 自身管理创建网络资源的时候,并不能够感知底层网络的状态,其管理能力高度依赖于 Kubernetes 系统提供的 Node IP 地址,而这个地址的连通性是由底层的网络设备来维持的,如果宿主机不能通过该 Node IP 访问到目标,那么容器网络的虚拟 IP 就更没有办法联通了,原理也将在下文详述。这也意味着 Kubernetes 系统所给的 Node IP 在边缘这样底层网络并不稳定的环境下无法保障稳定的底层通信服务。

EdgeMesh 基于上述理解,对这个需求进行细化的分析:

  • 边缘网络拓扑结构变动性强,且物理隔离场景较多,致使容器网络环境难以呈现出云上那样稳定的底层设施特征,比如边缘环境中自动驾驶场景或者是快递运输场景等。在这样的环境中,物理节点本身并不是绑定固定地址,甚至涉及到 5G 信号核心网注册切换等通信上的流程问题,使得 IP 地址和网络拓扑并不具备完全意义上的寻址能力,通俗说某个节点可能在上一时刻在 A 区域但是过了一会他就行驶到 B 区域了,这样动态变化切换的场景是以往 CNI 架构不曾考虑的。
  • CNI 的连通性是基于 Kubernetes 的 Node IP 维持的,更加深入理解这个结论:主流的 CNI 相信 Kubernetes 系统设置的 IP 地址是可以联通的,所以这些主流的 CNI 方案管理虚拟网络往往都使用这样的方法:宿主机操作系统中的一个切换装置,通过让自己作为虚拟网络资源和实际物理网络环境的中继;正如下图所示, CNI 只是通过 k8s 系统,在各个节点上创建了虚假的地址,通过信息协同的方式让拥有这些虚假地址的数据包可以正常在单机节点上传送给目标,但根本还是依赖于 Node IP 可以访问联通,毕竟如果数据包不能够正常到达目标节点,CNI 利用操作系统所作的虚假行为也就没有了意义。反过来说也无法超过于单机操作系统能够管理的网络连通性,多机分布式场景下完全只能够依靠 Kubernetes 系统。

cke_115.png

当然,也并非所有的主流 CNI 都只在本机的操作系统内做文章,更加深入解决连通性的 Calico 组件有提供基于 BGP 协议的跨机连接方案,但也围绕着云上数据中心架构展开的。与此相对应的边缘环境中, 节点的 IP 地址是存在着局域性、变动性、不确定性的,可以风趣地说 Kubernetes 系统被节点欺骗了。

  • 容器生命周期短暂且不确定,这个特性更像是此类问题的催化剂,使得边缘割裂场景下的网络连接更加难以使用固定的拓扑结构来进行规划管理。

系统设计思路

在本特性初阶段我们确定了此次项目实现的目标:是结合 EdgeMesh 已有的 P2P 功能来提供 CNI 特性, CNI 特性在目前阶段并不意味着开发出完全替代Flannel、Calico、Cilium 等已有架构的完全独立 CNI,而是作为多阶段逐步迭代实现的特性。

一方面从用户角度来说,如果直接替代云上已有的 CNI 架构,会带来额外的部署成本,也无法向用户保证新的架构有足够的价值可以完全覆盖老体系的场景和功能,以项目迭代开发的方式,优先实现一些能力,再慢慢优化、敏捷开发更能符合用户的利益。因而对于云上环境,我们倾向于直接兼容已有的 CNI 架构,使用它们提供的服务,但是补足他们不能够提供的 P2P 功能。

与此同时,现有的 CNI 方案并不能够为边缘复杂异构的环境提供统一的容器网络服务,所以相较于 Docker 或者是其他 CRI 提供的简单网络功能,我们更倾向于直接开发出自己的 CNI 来实现对边缘容器网络资源的管理。

而在上述的 CNI 需求之外,最重要的是如何与 EdgeMesh 的 P2P 服务结合起来;目前的开源社区中实现隧道的技术有:如 VPN,包含 IPSec、Wireguard等;如 P2P,包含 LibP2P 等,结合 EdgeMesh 应对的复杂异构多变边缘环境,我们选用了 LibP2P 技术进行开发。

在此之上需要判断哪些PodIP流量需要 P2P ,哪些流量仍旧使用原本的 CNI 网络服务;再来是将这两部分的功能解耦,以便后期的功能逐步迭代优化,主要的系统架构如下图所示:

cke_116.png

上述系统设计将集群内的流量分为两类:

  • 同一网段流量: 指的是底层网络 NodeIP 可通信,Pod 容器流量通过 CNI 转换即可进行通讯。
  • 跨网段流量: 指的是底层网络不可直接访问, Pod 容器流量通过 CNI 转换封装也无法到达目标节点。

针对于不同的流量我们提供不同的流量传输方式:

  • 对于同一网段的流量:依旧使用主流 CNI 的方案,通过 CNI 转换地址的形式切换虚拟网络和真实网络,连通性依赖 Kubernetes 系统获取的 NodeIP。
  • 对于跨网段的流量: 将这部分流量拦截到 EdgeMesh 当中,通过中继或者是穿透的形式转发到目标的节点,此时 EdgeMesh 充当具有 P2P 功能的 CNI 插件,来完成虚拟网络的切换。

这样的设计需要解决亮点重要的问题:

  • 云边集群容器网络资源统一控制管理

边缘节点以及云上节点 CNI 共同管理容器网络资源,使得容器可以分配到集群唯一的 IP地址,且不论云边都可以通过这个 IP 地址进行通信。

  • 云边以及边边跨网段容器网络通信能力

兼容原本 CNI 的通信方式让需要 P2P 的流量跨网段传输。系统设计的关键抉择在于,是否需要将 P2P 的功能放置到 CNI 执行的关键路径当中,或者是将 P2P 的功能与 CNI 架构解耦。

针对于第一个问题,核心关键是 IPAM 插件的设计和兼容,这方面我们倾向于集成开源社区成熟的方案 Siderpool :

标签: none

添加新评论