亚马逊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 网络部署,包括:

  1. 利用 Multus CNI 插件提供的多 IP Pod 为 5G 核心网控制面构建多网络平面。利用 Multus CNI 插件将多个网络接口附加到 Pod 上,为其提供多个不同子网的 IP。每个子网可以视为一个网络平面,子网 IP 之间可以通信(分配在不同的 Pod 上)。实现核心网 NF Pod 网络平面的灵活配置。
  2. 利用 Whereabouts 和 static 两种 IPAM 插件,实现 5GC 控制面 NF Pod 精细的 IP 管理。
  3. 介绍 Amazon EC2 对 DPDK 的支持,支撑 5G 核心网用户面 UPF 在云端的部署。
  4. 介绍 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 内容):

{
  "cniVersion": "0.3.0",
  "type": "ipvlan",
  "master": "eth1",
  "mode": "l3", 
  "ipam": {
    "type": "whereabouts",
    "range": "10.0.4.88-10.0.4.95/24",
    "gateway": "10.0.4.1"
  }
}

static IPAM 是一个非常简单的 IPAM 插件,可为容器静态分配指定的 IP 地址,特别适合开发测试的使用场景。这里我们使用 static 插件来实现 Pod 的固定 IP 分配。

ipvlan+static 示例配置(完整示例参考后面创建 NAD 内容):

{
  "cniVersion": "0.3.0",
  "type": "ipvlan",
  "master": "eth1",
  "mode": "l3",
  "ipam": {
    "type": "static",
    "addresses": [
      {
        "address":"10.0.6.119/24",
        "gateway":"10.0.6.1"
      }
    ]
  }
}

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://aws.amazon.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. 前提条件

2. 安装 Multus 插件

3. 安装 Whereabouts 插件

  • 在堡垒机上运行如下两条命令
    git clone https://github.com/k8snetworkplumbingwg/whereabouts && cd whereabout
    kubectl apply \
        -f doc/crds/daemonset-install.yaml \
        -f doc/crds/whereabouts.cni.cncf.io_ippools.yaml \
        -f doc/crds/whereabouts.cni.cncf.io_overlappingrangeipreservations.yaml

4. 安装 static 插件

  • 通过堡垒机SSH到EKS节点组EC2(提前将私钥pem上传至堡垒机),注意修改私钥文件的权限
    chmod og-rwx /home/ec2-user/key.pem
    ssh -i /home/ec2-user/key.pem ec2-user@10.0.2.11
    
  • 将 CNI Plugin 编译成可执行文件,执行官方仓库中的 build_linux.sh 脚本
    #从Git仓库克隆CNI plugin并编译
    git clone https://github.com/containernetworking/plugins.git
    cd plugins/
    ./build_linux.sh
    ls bin/
    #将所有需要的二进制文件复制到/opt/cni/bin/目录。以下仅示例static插件
    sudo cp static /opt/cni/bin/
    cd /opt/cni/bin/
    ls -l
    

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 示例

cat <<EOF | kubectl apply -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: multus-ipvlan-wb-example
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "ipvlan",
      "master": "eth2",
      "mode": "l3", 
      "ipam": {
        "type": "whereabouts",
        "range": "10.0.6.230-10.0.6.240/24",
        "gateway": "10.0.6.1"
      }
    }'
EOF

Static NAD 示例

cat <<EOF | kubectl apply -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: multus-ipvlan-static-example
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "ipvlan",
      "master": "eth2",
      "mode": "l3",
      "ipam": {
        "type": "static",
        "addresses": [
        	{
        		"address":"10.0.6.119/24",
        		"gateway":"10.0.6.1"
        	}
        ]
    }
  }'
EOF

这里我们做一些简化,以 praqma/network-multitool 来代替 5G 核心网 NF 容器进行演示。

以 deployment 方式创建 Pod(Whereabouts IPAM)

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sampleapp-wb-deployment
  labels:
    app: sampleapp-wb-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wb-sample
  template:
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: multus-ipvlan-wb-example
      labels:
        app: wb-sample
    spec:
      containers:
      - name: multitool
        command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
        image: praqma/network-multitool
        securityContext:
          privileged: true
      - name: aws-ip-mgmt
        image: xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/aws-ip-manager:0.1
        imagePullPolicy: Always
        args: [/bin/sh, -c, '/app/script.sh sidecar']
EOF

以 deployment 方式创建 Pod(static IPAM)

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sampleapp-static-deployment
  labels:
    app: sampleapp-static-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: static-sample
  template:
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: multus-ipvlan-static-example
      labels:
        app: static-sample
    spec:
      containers:
      - name: multitool
        command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
        image: praqma/network-multitool
      - name: aws-ip-mgmt
        image: xxxxxxxxxxxx.dkr.ecr.ap-southeast-2.amazonaws.com/aws-ip-manager:0.1
        imagePullPolicy: Always
        args: [/bin/sh, -c, '/app/script.sh sidecar']
EOF

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://aws.amazon.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.aws.amazon.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://aws.amazon.com/cn/blogs/containers/amazon-eks-now-supports-multus-cni/

https://github.com/aws-samples/eks-install-guide-for-multus/tree/main

https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html

https://github.com/k8snetworkplumbingwg/multus-cni

本篇作者

彭金冬

亚马逊云科技解决方案架构师,负责电信行业客户的架构设计和技术支持,拥有超过 10 年的电信行业工作经验。

杨冬冬

亚马逊云科技资深容器解决方案架构师,在云原生领域深耕多年,拥有丰富的行业经验。