Deploy SD-Core User Plane in DPDK mode¶
This guide covers how to deploy the User Plane Function (UPF) in DPDK mode using Terraform modules.
Requirements¶
A Kubernetes cluster which meets or exceeds below requirements:
CPU supporting AVX2 and RDRAND and PDPE1GB instructions (Intel Haswell, AMD Excavator or equivalent)
Kernel with SCTP protocol and vfio-pci driver support
4 cores
SR-IOV interfaces for Access and Core networks
At least two 1G HugePages available
driverctl
installedLoadBalancer with 1 available address for the UPF
Multus CNI enabled
Juju >= 3.6/stable
A Juju controller bootstrapped onto the Kubernetes cluster
Terraform
Configure UPF host¶
Change the driver of the network interfaces to vfio-pci
¶
As root
user on the UPF host, load the vfio-pci
driver:
echo "vfio-pci" > /etc/modules-load.d/vfio-pci.conf
modprobe vfio-pci
Note
Using vfio-pci
, by default, needs IOMMU to be enabled. In the environments which do not support
IOMMU, vfio-pci
needs to be loaded with additional module parameter:
echo "options vfio enable_unsafe_noiommu_mode=1" > /etc/modprobe.d/vfio-noiommu.conf
Get PCI address of access
and core
interfaces:
$ sudo lshw -c network -businfo
Bus info Device Class Description
=========================================================
pci@0000:00:05.0 ens5 network Elastic Network Adapter (ENA)
pci@0000:00:06.0 ens6 network Elastic Network Adapter (ENA) # access interface
pci@0000:00:07.0 ens7 network Elastic Network Adapter (ENA) # core interface
Bind access
and core
interfaces to the vfio-pci
driver:
sudo driverctl set-override 0000:00:06.0 vfio-pci
sudo driverctl set-override 0000:00:07.0 vfio-pci
Configure Kubernetes for DPDK¶
Create ConfigMap with configuration for the SR-IOV Network Device Plugin:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: sriovdp-config
namespace: kube-system
data:
config.json: |
{
"resourceList": [
{
"resourceName": "intel_sriov_vfio_access",
"selectors": {
"pciAddresses": ["0000:00:06.0"]
}
},
{
"resourceName": "intel_sriov_vfio_core",
"selectors": {
"pciAddresses": ["0000:00:07.0"]
}
}
]
}
EOF
Deploy SR-IOV Network Device Plugin:
kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/sriov-network-device-plugin/v3.6.2/deployments/sriovdp-daemonset.yaml
Copy the vfioveth
CNI under /opt/cni/bin
on Kubernetes host:
sudo mkdir -p /opt/cni/bin
sudo wget -O /opt/cni/bin/vfioveth https://raw.githubusercontent.com/opencord/omec-cni/master/vfioveth
sudo chmod +x /opt/cni/bin/vfioveth
Deploy SD-Core UPF Operator¶
Create a Juju model named user-plane
:
juju add-model user-plane user-plane-cloud
Deploy sdcore-user-plane-k8s
Terraform Module.
Create an empty directory named terraform
and create a main.tf
file.
Note
All the addresses presented below serve as an example. Make sure to replace them with the values matching your setup.
If Kubernetes host is a virtual machine rather than a Bare-metal server, set the enable-hw-checksum
parameter in the upf_config
to False.
mkdir terraform
cd terraform
cat << EOF > main.tf
module "sdcore-user-plane" {
source = "git::https://github.com/canonical/terraform-juju-sdcore//modules/sdcore-user-plane-k8s?ref=v1.5"
model = "user-plane"
upf_config = {
cni-type = "vfioveth"
upf-mode = "dpdk"
access-gateway-ip = "10.202.0.1"
access-ip = "10.202.0.10/24"
core-gateway-ip = "10.203.0.1"
core-ip = "10.203.0.10/24"
access-interface-mac-address = "c2:c8:c7:e9:cc:18"
core-interface-mac-address = "e2:01:8e:95:cb:4d"
enable-hw-checksum = "false"
}
}
EOF
Initialize the Juju Terraform provider:
terraform init
Deploy SD-Core User Plane:
terraform apply -auto-approve