亚马逊AWS官方博客
基于 Amazon EKS 的云化 5G 网络部署:Multus 插件的实践探索、UPF DPDK、基站到云的回传
电信行业在过去十多年中从网络功能虚拟化(NFV)逐渐演进到网络云化。以 5G 独立组网(SA)核心网为例,其控制面使用 “微服务”设计理念,采用了服务化架构(SBA),将网络功能拆解为独立的 NF(Network Function),通过统一类型的服务化接口实现解耦调用,从而使网络具备敏捷部署、弹性伸缩和灵活编排的能力。通过采用网络架构服务化和软件微服务设计,5G 核心网天然具备了云原生的部署能力。基于云原生技术进行 5G 核心网建设可以简化网络的部署和运维复杂度,提高资源利用率,最大化发挥 5G 网络的优势。
5G 核心网部署在部署在 Kubernetes 或者 EKS 上时,需要解决的一大挑战是如何构建多网络平面,实现不同网元之间即能灵活的通信,也能达成业务隔离提升安全性。同时电信网元在规划时,可能会提前确认给每个网元分配的 IP(或确认某个 IP CIDR 段),需要精准的 IP 管理和分配。
在本篇博客中,我们将探索如何基于亚马逊云科技来实现完整的云化 5G 网络部署,包括:
- 利用 Multus CNI 插件提供的多 IP Pod 为 5G 核心网控制面构建多网络平面。利用 Multus CNI 插件将多个网络接口附加到 Pod 上,为其提供多个不同子网的 IP。每个子网可以视为一个网络平面,子网 IP 之间可以通信(分配在不同的 Pod 上)。实现核心网 NF Pod 网络平面的灵活配置。
- 利用 Whereabouts 和 static 两种 IPAM 插件,实现 5GC 控制面 NF Pod 精细的 IP 管理。
- 介绍 Amazon EC2 对 DPDK 的支持,支撑 5G 核心网用户面 UPF 在云端的部署。
- 介绍 5G 基站回传到云化 5G 核心网的几种方式。
一、核心组件和架构
1. Amazon EKS 介绍
Amazon Elastic Kubernetes Service(Amazon EKS)是一种托管的 Kubernetes 服务,使您可以轻松地在亚马逊云科技上运行 Kubernetes,而无需安装、操作和维护自己的 Kubernetes 控制平面。Kubernetes 是一个开源系统,用于自动管理、扩展和部署容器化应用程序,是如今最受欢迎和广泛使用的容器编排和管理平台之一。
2. Multus CNI 介绍
Multus CNI(https://github.com/k8snetworkplumbingwg/multus-cni)是用于 Kubernetes 的容器网络接口(CNI)插件,它可以将多个网络接口附加到 Pods 上。通常情况下,Kubernetes 的每个 pod 只有一个网络接口(除了环回接口),而通过 Multus,你可以创建一个拥有多个网络接口的多宿主 pod(multi-homed pod)。实现的机理,是 Multus 作为“meta-plugin”(加载其它插件的插件),通过调用多种其他 CNI 插件来实现。
下面是通过 Multus CNI 创建的多宿主 pod 网络接口示意图。该 pod 有三个接口的:eth0、net0 和 net1。eth0 用于连接 EKS/Kubernetes 集群网络,用于同 Kubernetes 服务通信(如 kubernetes api-server、kubelet 等)。net0 和 net1 是额外的附加网络接口,并通过使用其他 CNI 插件(例如,vlan/vxlan/ptp)连接到其他网络。
Multus CNI 创建的多宿主 Pod 示意图(来自 Multus CNI GitHub https://github.com/k8snetworkplumbingwg/multus-cni)
3. ipvlan,Whereabouts 和 Static IPAM 插件
ipvlan 插件(https://www.cni.dev/plugins/current/main/ipvlan/)的作用是从一个主机的接口虚拟出多个网络接口。在这里,我们用 Multus 调用 ipvlan CNI 插件来为 pod 添加网络接口。
CNI 插件通常会配合 IPAM 插件一起使用。CNI IPAM 插件用于分配 IP 地址,我们采用 Whereabouts(https://github.com/k8snetworkplumbingwg/whereabouts)和 static(https://www.cni.dev/plugins/current/ipam/static/)两种 IPAM,来实现静态 IP 分配。
Whereabouts 能够在设定的 IP 地址范围内跨节点分配 IP 地址,无需使用 DHCP 服务器。Whereabouts 接收一个地址范围(如 10.0.4.88-10.0.4.95/24),并在该范围内分配 IP 地址。如上地址范围,它会分配从 10.0.4.88 到 10.0.4.95 的 IP 地址。当某个 IP 地址分配给 pod 时,Whereabouts 会在该 pod 的整个生命周期中跟踪该 IP 地址。当 pod 被移除时,Whereabouts 会释放该地址,并在以后的请求中重新分配它。
ipvlan+Whereabouts 示例配置(完整示例参考后面创建 NAD 内容):
static IPAM 是一个非常简单的 IPAM 插件,可为容器静态分配指定的 IP 地址,特别适合开发测试的使用场景。这里我们使用 static 插件来实现 Pod 的固定 IP 分配。
ipvlan+static 示例配置(完整示例参考后面创建 NAD 内容):
4. 架构图说明
- 5G 核心网控制面部署在 EKS 上,不同 NF 以 Pod 形式部署
- 5G 核心网用户面 UPF 和网管可以部署在 EC2 虚拟机上,也可以以容器化部署在 EKS 集群中(需要 UPF 和 EMS 支持容器化部署)
- 根据业务对时延的敏感性,UPF 部署的位置可以灵活选择。除了如上图中部署在云上,也可以利用 Outposts 或 Snowball edge 部署在客户工厂或办公室
- 回传链路可以使用 Direct Connect 专线、Site-to-Site VPN 连接(海外区域)或自建 VPN 链路
EKS 节点组 EC2 的多 ENI 配置
EKS 节点组 EC2 根据网络平面的设计,需要配置相应数量的 ENI 网络接口。参考下图,节点组 EC2 规划了 5 个 ENI 网络接口,分别从对应的 5 个子网获取 IP。注意其中 eth0 保留给 VPC-CNI 分配 IP。每个子网可以视为一个网络平面。分配给 Pod 的 IP,会以 Secondary IP 的形式添加到这 5 个 ENI 网络接口上。
EC2 启动时默认只有 1 个 ENI 网络接口,从其它子网添加 ENI 的动作由 Lambda 实现。具体可参考博客(https://thinkwithwp.com/cn/blogs/industries/automated-ip-address-management-for-multus-workers-and-pods/)。
Pod 的多 IP 配置
Pod 层面,Multus CNI 插件调用 ipvlan 从一个 EC2 ENI 虚拟出多个网络接口并附加到不同 Pod 上。如下图,所有 Pod 都会拥有一个由 VPC-CNI 分配的默认 eth0,其 IP 地址属于 Primary K8s Subnet (CIDR 10.0.2.0/24),将以 Secondary IP 的形式添加到 EC2 eth0 上。此外该 Pod(Pod-1)还有四个网络接口由 Multus CNI 附加到该 Pod 上,对应的 IP 来自 N1/N2/N3/N4 子网(即这个 Pod 同时拥有 5 个 IP 地址,来自于不同的子网)。如果两个 Pod 都被附加了从 EC2 eth1 虚拟出来的网络接口,都分配到了一个来自 CIDR 10.0.10.0/24 的 IP 地址,则双方都在 N1 这个网络平面内,可以通过同子网的 IP 通信。
如果有一个 Pod-2,除了 VPC-CNI 分配的 eth0 网络接口(这是必须的),还通过 Multus CNI 插件附加了 eth2 和 eth3 网络接口(一共拥有 3 个 IP 地址,来自于 Primary K8s Subnet,N2 SubnetAZ1,N3 SubnetAZ1)。则 Pod-2 能够与 Pod-1 在 Primary,N2,和 N3 这三个网络平面相互通信。
EKS 集群相关的交互通过 eth0 来通信,与 5G 业务相关的流量全部通过 Multus 分配的网络接口通信。通过这样的设计,能够灵活的将 Pod 与网络平面(子网)关联,能够保证 NF 之间灵活的通信,同时也能做到业务隔离提升安全性。
目前架构和应用的局限
Multus 方案部署 5G 核心网控制面 NF,能够满足多网络平面实现业务隔离和精细 IP 管理的需求。但也存在一些问题,需要未来进一步的改进。
- 无法跨 AZ 保护。子网无法跨 AZ,也没有办法跨 AZ 将 ENI 附加到 EC2 实例上,因此 IP 提前规划的场景下 5G 核心网控制面无法实现跨 AZ 灾备。可以进一步优化服务注册发现的机制,脱离 IP 地址限制,实现跨 AZ 保护。
- Pod 数量限制。以 4xlarge 为例,其最多支持 8 个 ENI,每个 ENI 支持 30 个 Ipv4 地址。Multus 最多可划分 7 个子网(VPC-CNI 默认需要 1 个),而每个子网只有 29 个 IP 供 Pod 分配(每个 ENI 需要有 1 个 Primary IP),容易出现某个子网 IP 受限导致 Pod 无法创建的情况(此时不会自动扩展节点)。需要进一步考虑提升 Pod 密度的方案。
二、参考配置
1. 前提条件
- 拥有亚马逊云科技账号,提前完成 VPC、子网、EKS 和 Node Group 的创建,可参考 GitHub 链接(https://github.com/aws-samples/eks-install-guide-for-multus)。
- 注意:EC2 选型要考虑机型能支持的最大 ENI 数量,请参考手册确认(https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)。上面示例图中,需要 EC2 至少支持 5 个 ENI,可以选用 4xlarge(最多支持 8 个 ENI)。
2. 安装 Multus 插件
- 登陆堡垒机,下载 aws-k8s-multus.yaml 文件(https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/multus/v3.7.2-eksbuild.1/aws-k8s-multus.yaml)。
- 注意需要将 yaml 文件中 multus 容器镜像地址更改为与你部署区域对应的地址。可以在这个页面(https://docs.thinkwithwp.com/eks/latest/userguide/add-ons-images.html)查询。比如计划在新加坡部署,需要更改为如下地址并保存。
- 运行 kubectl 命令
3. 安装 Whereabouts 插件
- 在堡垒机上运行如下两条命令
4. 安装 static 插件
- 通过堡垒机SSH到EKS节点组EC2(提前将私钥pem上传至堡垒机),注意修改私钥文件的权限
- 将 CNI Plugin 编译成可执行文件,执行官方仓库中的 build_linux.sh 脚本
5. 创建 5G 核心网控制面 NF Pod
创建 5G 核心网 Pod 包括两部分配置,登录堡垒机后运行 kubectl 命令。
- 创建 Multus NetworkAttachmentDefinition(以下简称 NAD)。NAD 中会指定 ipvlan 插件、ipam 插件(Whereabouts 还是 static)、EC2 网络接口(选择了 ENI 也就选择了子网)、IP地址(Whereabouts 是地址段,static 是某个地址)。
- 创建 Pod 时,通过绑定 1 个或多个 NAD,来实现该 Pod 附加哪些网络接口,以及网络接口对应的 IP。
Whereabouts NAD 示例
Static NAD 示例
这里我们做一些简化,以 praqma/network-multitool 来代替 5G 核心网 NF 容器进行演示。
以 deployment 方式创建 Pod(Whereabouts IPAM)
以 deployment 方式创建 Pod(static IPAM)
6. IP 自动管理
您可能已经发现,上面的创建 Pod 时,除了 praqma/network-multitool 外,还包括了一个 aws-ip-mgmt 容器,这是一个 Sidecar 容器,作用是监控 Pod IP,自动调用 API 将 multus 分配的 IP 以 Secondary IP 的形式附加到对应的 EC2 ENI 上,让 VPC 网络能够识别到这些 IP,并正常路由。具体细节可参考此链接(https://github.com/aws-samples/eks-automated-ipmgmt-multus-pods)。
7. 5GC 用户面 UPF DPDK 配置
5G 核心网用户面 UPF 一般会启用 DPDK(数据平面开发工具包 Data Plane Development Kit),用来加速包处理和转发的速度并降低延时。基于 Nitro 的实例都可以支持 DPDK。在使用 DPDK 时,需要选用 16.04 之后的版本,DPDK 在该版本之后提供了对 EC2 的支持。具体可参考博客(https://thinkwithwp.com/cn/blogs/china/how-to-use-dpdk-in-aws-ec2-instances-and-aws-based-container-platforms-i/)。
8. 基站到 5GC 的回传链路配置
基站到 5GC 回传链路可以采用多种方式,下面简述三种。
- Direct Connect(简称 DX,或专线),用于连接客户本地和亚马逊云区域,它为客户提供了一个私有、可靠的专线连接上云。
- Site-to-Site VPN,这是一项亚马逊云科技完全托管的服务,它使用 IPSec 加密隧道在 亚马逊云区域与本地之间建立安全的连接,该服务仅在海外区域提供。
- 自建 VPN 连接。在国内区域,客户可以通过第三方服务构建 IPSec 隧道连接上云。
更多信息,可以参考亚马逊云科技白皮书 Amazon Virtual Private Cloud Connectivity Options(https://docs.thinkwithwp.com/zh_cn/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)。
三、结论
本文概括性地介绍了如何在亚马逊云科技上部署 5G 网络,包括核心网控制面、核心网用户面、基站回传链路。
5G 核心网控制面基于 EKS 部署是本文的重点内容:通过 Multus 插件、ipvlan 插件和 2 种 IPAM 插件(Whereabouts 和 static),实现了多 IP Pod 的创建,让不同的 NF Pod 按需要相互通信同时实现业务隔离。
5G 核心网用户面 UPF 可以基于 EC2 部署,通过启用 DPDK 加速包处理和转发的速度并降低延时。
基站回传链路有多种方式,对稳定性要求高推荐 DX 专线,也可以使用 VPN 方案基于 internet 提供 IPSec 加密隧道实现低成本回传。
四、参考文档
https://thinkwithwp.com/cn/blogs/containers/amazon-eks-now-supports-multus-cni/
https://github.com/aws-samples/eks-install-guide-for-multus/tree/main
https://docs.thinkwithwp.com/eks/latest/userguide/add-ons-images.html
https://github.com/k8snetworkplumbingwg/multus-cni